From 763c9789ec528bb6f1884f41b152e2e896b07fd9 Mon Sep 17 00:00:00 2001 From: Thibault Jouan Date: Mon, 4 May 2015 04:34:13 +0000 Subject: [PATCH] Allow user to creates named auth keys with token --- app/controllers/keys_controller.rb | 51 ++++++++++++++++++++++++ app/models/key.rb | 7 ++++ app/models/user.rb | 1 + app/views/keys/_form.haml | 19 +++++++++ app/views/keys/edit.haml | 6 +++ app/views/keys/index.haml | 42 +++++++++++++++++++ app/views/keys/new.haml | 6 +++ app/views/keys/show.haml | 13 ++++++ app/views/layouts/application.html.haml | 2 + config/routes.rb | 2 + db/migrate/20150504043016_create_keys.rb | 12 ++++++ db/schema.rb | 14 ++++++- 12 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 app/controllers/keys_controller.rb create mode 100644 app/models/key.rb create mode 100644 app/views/keys/_form.haml create mode 100644 app/views/keys/edit.haml create mode 100644 app/views/keys/index.haml create mode 100644 app/views/keys/new.haml create mode 100644 app/views/keys/show.haml create mode 100644 db/migrate/20150504043016_create_keys.rb diff --git a/app/controllers/keys_controller.rb b/app/controllers/keys_controller.rb new file mode 100644 index 0000000..144282a --- /dev/null +++ b/app/controllers/keys_controller.rb @@ -0,0 +1,51 @@ +class KeysController < ApplicationController + before_filter :set_key, only: %i[show edit update destroy] + + def index + @keys = current_user.keys + end + + def show + end + + def new + @key = current_user.keys.new + end + + def create + @key = current_user.keys.build key_params + + if @key.save + redirect_to action: :index + else + render :new + end + end + + def edit + end + + def update + if @key.update_attributes key_params + redirect_to action: :index + else + render :edit + end + end + + def destroy + @key.destroy + redirect_to keys_path + end + + + private + + def set_key + @key = current_user.keys.find(params[:id]) + end + + def key_params + params.require(:key).permit :name + end +end diff --git a/app/models/key.rb b/app/models/key.rb new file mode 100644 index 0000000..80ffe5f --- /dev/null +++ b/app/models/key.rb @@ -0,0 +1,7 @@ +class Key < ActiveRecord::Base + belongs_to :user + + has_secure_token :token + + validates :name, presence: true +end diff --git a/app/models/user.rb b/app/models/user.rb index be33e4f..f12a55c 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -4,6 +4,7 @@ class User < ActiveRecord::Base attr_reader :password has_many :playlists + has_many :keys validates :email, presence: true, diff --git a/app/views/keys/_form.haml b/app/views/keys/_form.haml new file mode 100644 index 0000000..b7e98ff --- /dev/null +++ b/app/views/keys/_form.haml @@ -0,0 +1,19 @@ += form_for @key do |f| + %fieldset + %p + = f.label :name + %br + = f.text_field :name + + - if @key.errors.any? + .errors + %p + = pluralize @key.errors.count, 'error' + prohibited this post from being saved: + %ul + - @key.errors.full_messages.each do |error| + %li= error + + %ul + %li + = f.button diff --git a/app/views/keys/edit.haml b/app/views/keys/edit.haml new file mode 100644 index 0000000..f3f4135 --- /dev/null +++ b/app/views/keys/edit.haml @@ -0,0 +1,6 @@ +%h1 + Edit + key + + += render 'form' diff --git a/app/views/keys/index.haml b/app/views/keys/index.haml new file mode 100644 index 0000000..16a0221 --- /dev/null +++ b/app/views/keys/index.haml @@ -0,0 +1,42 @@ +%h1 + Listing + keys + + +- if @keys.empty? + %p No record found. + +- else + %table + %thead + %tr + %th + Name + %th + Created at + %th + Updated at + %th + Actions + + %tbody + - @keys.each do |e| + %tr + %td + = link_to e.name, e + %td + = e.created_at + %td + = e.updated_at + %td + %ul + %li + = link_to 'Edit', edit_key_path(e) + %li + = link_to 'Destroy', e, method: :delete, + data: { confirm: 'Are you sure?' } + + +%ul + %li + = link_to 'New key', new_key_path diff --git a/app/views/keys/new.haml b/app/views/keys/new.haml new file mode 100644 index 0000000..be36ffa --- /dev/null +++ b/app/views/keys/new.haml @@ -0,0 +1,6 @@ +%h1 + New + key + + += render 'form' diff --git a/app/views/keys/show.haml b/app/views/keys/show.haml new file mode 100644 index 0000000..405d928 --- /dev/null +++ b/app/views/keys/show.haml @@ -0,0 +1,13 @@ +%h1 + Showing + key + + +%pre= @key.attributes.to_yaml + + +%ul.actions + %li + = link_to 'Edit', edit_key_path(@key) + %li + = link_to 'Destroy', e, method: :delete, data: { confirm: 'Are you sure?' } diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 0a61cb6..aeca33c 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -12,6 +12,8 @@ - if current_user? %nav %ul + %li + = link_to 'Keys', keys_path %li = link_to 'Playlists', playlists_path %li diff --git a/config/routes.rb b/config/routes.rb index 867720b..864093d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -22,5 +22,7 @@ Rails.application.routes.draw do get 'download', on: :member end + resources :keys + resources :users, only: %i[new create] end diff --git a/db/migrate/20150504043016_create_keys.rb b/db/migrate/20150504043016_create_keys.rb new file mode 100644 index 0000000..658c04e --- /dev/null +++ b/db/migrate/20150504043016_create_keys.rb @@ -0,0 +1,12 @@ +class CreateKeys < ActiveRecord::Migration + def change + create_table :keys do |t| + t.timestamps null: false + t.references :user, index: true, foreign_key: true, null: false + t.string :name + t.string :token + end + + add_index :keys, :token, unique: true + end +end diff --git a/db/schema.rb b/db/schema.rb index bfb030b..c8dcac0 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,11 +11,22 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20110916003929) do +ActiveRecord::Schema.define(version: 20150504043016) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" + create_table "keys", force: :cascade do |t| + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "user_id", null: false + t.string "name" + t.string "token" + end + + add_index "keys", ["token"], name: "index_keys_on_token", unique: true, using: :btree + add_index "keys", ["user_id"], name: "index_keys_on_user_id", using: :btree + create_table "playlists", force: :cascade do |t| t.integer "user_id" t.string "name" @@ -56,4 +67,5 @@ ActiveRecord::Schema.define(version: 20110916003929) do add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree + add_foreign_key "keys", "users" end