From 56a736304d9d82cec3fc017b39c52fafbf8c4e83 Mon Sep 17 00:00:00 2001 From: Damon Liao Date: Fri, 29 Apr 2016 17:08:51 +0800 Subject: [PATCH 1/2] 6. Add JSON API --- app/controllers/api_controller.rb | 3 +++ app/controllers/api_v1/messages_controller.rb | 10 ++++++++++ app/views/api_v1/messages/_message.json.jbuilder | 8 ++++++++ app/views/api_v1/messages/index.json.jbuilder | 5 +++++ config/routes.rb | 5 +++++ 5 files changed, 31 insertions(+) create mode 100644 app/controllers/api_controller.rb create mode 100644 app/controllers/api_v1/messages_controller.rb create mode 100644 app/views/api_v1/messages/_message.json.jbuilder create mode 100644 app/views/api_v1/messages/index.json.jbuilder diff --git a/app/controllers/api_controller.rb b/app/controllers/api_controller.rb new file mode 100644 index 0000000..1e92bc7 --- /dev/null +++ b/app/controllers/api_controller.rb @@ -0,0 +1,3 @@ +class ApiController < ActionController::Base + #問題 如果沒有繼承action controller,會有什麼影響嗎? +end diff --git a/app/controllers/api_v1/messages_controller.rb b/app/controllers/api_v1/messages_controller.rb new file mode 100644 index 0000000..0e609ca --- /dev/null +++ b/app/controllers/api_v1/messages_controller.rb @@ -0,0 +1,10 @@ +class ApiV1::MessagesController < ApiController + + def index + @messages = Message.all + end + + + + +end diff --git a/app/views/api_v1/messages/_message.json.jbuilder b/app/views/api_v1/messages/_message.json.jbuilder new file mode 100644 index 0000000..77c960c --- /dev/null +++ b/app/views/api_v1/messages/_message.json.jbuilder @@ -0,0 +1,8 @@ +json.message do + json.id message.id + json.status message.status + json.category_name message.category_name + json.title message.title + json.content message.content + json.created_at message.created_at +end diff --git a/app/views/api_v1/messages/index.json.jbuilder b/app/views/api_v1/messages/index.json.jbuilder new file mode 100644 index 0000000..2ad5d68 --- /dev/null +++ b/app/views/api_v1/messages/index.json.jbuilder @@ -0,0 +1,5 @@ +json.results do + json.array!(@messages) do |m| + json.partial! 'message', message: m + end +end diff --git a/config/routes.rb b/config/routes.rb index 74d4dbf..d6ae451 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -5,6 +5,11 @@ resources :comments end + scope :path => '/api/v1/', :module => "api_v1", :as => 'v1', :defaults => { :format => :json } do + resources :messages + end + + # The priority is based upon order of creation: first created -> highest priority. # See how all your routes lay out with "rake routes". From 349b66aa124cb8797197764720e96fdb501f8c91 Mon Sep 17 00:00:00 2001 From: Damon Liao Date: Fri, 29 Apr 2016 18:44:23 +0800 Subject: [PATCH 2/2] 7 User can like and subscription --- app/controllers/likes_controller.rb | 30 ++++++++++++++++ app/controllers/messages_controller.rb | 30 +++++++++++++--- app/models/like.rb | 4 +++ app/models/message.rb | 8 ++++- app/models/subscription.rb | 6 ++++ app/models/user.rb | 4 +++ app/models/user_message_ship.rb | 3 ++ app/views/messages/show.html.erb | 17 ++++++++- config/routes.rb | 4 ++- .../20160429091408_create_subscriptions.rb | 9 +++++ db/migrate/20160429091414_create_likes.rb | 9 +++++ ...0160429091553_create_user_message_ships.rb | 9 +++++ db/schema.rb | 35 ++++++++++++++++++- lib/tasks/dev.rake | 10 ++++-- spec/models/like_spec.rb | 5 +++ spec/models/subscription_spec.rb | 5 +++ spec/models/user_message_ship_spec.rb | 5 +++ 17 files changed, 183 insertions(+), 10 deletions(-) create mode 100644 app/controllers/likes_controller.rb create mode 100644 app/models/like.rb create mode 100644 app/models/subscription.rb create mode 100644 app/models/user_message_ship.rb create mode 100644 db/migrate/20160429091408_create_subscriptions.rb create mode 100644 db/migrate/20160429091414_create_likes.rb create mode 100644 db/migrate/20160429091553_create_user_message_ships.rb create mode 100644 spec/models/like_spec.rb create mode 100644 spec/models/subscription_spec.rb create mode 100644 spec/models/user_message_ship_spec.rb diff --git a/app/controllers/likes_controller.rb b/app/controllers/likes_controller.rb new file mode 100644 index 0000000..150b6eb --- /dev/null +++ b/app/controllers/likes_controller.rb @@ -0,0 +1,30 @@ +class LikesController < ApplicationController + + before_action :authenticate_user! + before_action :set_message + + def create + like = @message.finy_like_by(user) + if like + # do nothing + else + @message.likes.create!( :user => user ) + end + + redirect_to :back + end + + def destroy + @like = user.likes.find( params[:id] ) + @like.destroy + + redirect_to :back + end + + protected + + def set_message + @message = message.find( params[:message_id] ) + end + +end diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb index 96f65e5..95a3360 100644 --- a/app/controllers/messages_controller.rb +++ b/app/controllers/messages_controller.rb @@ -31,7 +31,7 @@ def new def create @message = Message.new( message_params ) - @message.user = current_user + @message.user = user @message.save! @@ -39,13 +39,13 @@ def create end def edit - @message = current_user.messages.find( params[:id] ) + @message = user.messages.find( params[:id] ) render "new" end def update - @message = current_user.messages.find( params[:id] ) + @message = user.messages.find( params[:id] ) @message.update!( message_params ) @@ -53,12 +53,34 @@ def update end def destroy - @message = current_user.messages.find( params[:id] ) + @message = user.messages.find( params[:id] ) @message.destroy redirect_to root_path end + def subscribe + @message = message.find( params[:id] ) + + subscription = @message.finy_subscription_by(user) + if subscription + # do nothing + else + @subscription = @message.subscriptions.create!( :user => user ) + end + + redirect_to :back + end + + def unsubscribe + @message = message.find( params[:id] ) + + subscription = @message.finy_subscription_by(user) + subscription.destroy + + redirect_to :back + end + protected def message_params diff --git a/app/models/like.rb b/app/models/like.rb new file mode 100644 index 0000000..3fd5eaf --- /dev/null +++ b/app/models/like.rb @@ -0,0 +1,4 @@ +class Like < ActiveRecord::Base + belongs_to :topic + belongs_to :user +end diff --git a/app/models/message.rb b/app/models/message.rb index e24a8b2..e1846bf 100644 --- a/app/models/message.rb +++ b/app/models/message.rb @@ -1,11 +1,17 @@ class Message < ActiveRecord::Base belongs_to :user - has_many :comments, :dependent => :destroy + has_many :likes + has_many :likes_users, :through => :likes, :source => :user + has_many :subscriptions + has_many :subscribed_users, :through => :likes, :source => :user def last_comment_summary self.comments.last.try(:content).try(:truncate, 20) end + def finy_subscription_by(user) + self.subscriptions.find_by_user_id( user.id ) + end end diff --git a/app/models/subscription.rb b/app/models/subscription.rb new file mode 100644 index 0000000..2da70f7 --- /dev/null +++ b/app/models/subscription.rb @@ -0,0 +1,6 @@ +class Subscription < ActiveRecord::Base + + belongs_to :user + belongs_to :topic + +end diff --git a/app/models/user.rb b/app/models/user.rb index 6d01aa9..a696ef5 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -6,6 +6,10 @@ class User < ActiveRecord::Base has_many :messages has_many :comments + has_many :likes + + has_many :subscriptions + has_many :subscribed_messages, :through => :likes, :source => :message def display_name self.email.split("@").first diff --git a/app/models/user_message_ship.rb b/app/models/user_message_ship.rb new file mode 100644 index 0000000..1da1520 --- /dev/null +++ b/app/models/user_message_ship.rb @@ -0,0 +1,3 @@ +class UserMessageShip < ActiveRecord::Base + +end diff --git a/app/views/messages/show.html.erb b/app/views/messages/show.html.erb index 41401f6..ca5e126 100644 --- a/app/views/messages/show.html.erb +++ b/app/views/messages/show.html.erb @@ -2,6 +2,22 @@ <%= simple_format @message.content %> + +

subscription list

+ + + +

like list

+ +

Comments list

<%= form_for [@message, @comment] do |f| %> @@ -28,4 +44,3 @@

<% end %> - diff --git a/config/routes.rb b/config/routes.rb index d6ae451..e2b00ff 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -6,10 +6,12 @@ end scope :path => '/api/v1/', :module => "api_v1", :as => 'v1', :defaults => { :format => :json } do - resources :messages + resources :messages end + + # The priority is based upon order of creation: first created -> highest priority. # See how all your routes lay out with "rake routes". diff --git a/db/migrate/20160429091408_create_subscriptions.rb b/db/migrate/20160429091408_create_subscriptions.rb new file mode 100644 index 0000000..d5b6c6f --- /dev/null +++ b/db/migrate/20160429091408_create_subscriptions.rb @@ -0,0 +1,9 @@ +class CreateSubscriptions < ActiveRecord::Migration + def change + create_table :subscriptions do |t| + t.integer :user_id, :integer, :index => true + t.integer :message_id, :integer, :index => true + t.timestamps null: false + end + end +end diff --git a/db/migrate/20160429091414_create_likes.rb b/db/migrate/20160429091414_create_likes.rb new file mode 100644 index 0000000..405be91 --- /dev/null +++ b/db/migrate/20160429091414_create_likes.rb @@ -0,0 +1,9 @@ +class CreateLikes < ActiveRecord::Migration + def change + create_table :likes do |t| + t.integer :user_id, :integer, :index => true + t.integer :message_id, :integer, :index => true + t.timestamps null: false + end + end +end diff --git a/db/migrate/20160429091553_create_user_message_ships.rb b/db/migrate/20160429091553_create_user_message_ships.rb new file mode 100644 index 0000000..48c6f5e --- /dev/null +++ b/db/migrate/20160429091553_create_user_message_ships.rb @@ -0,0 +1,9 @@ +class CreateUserMessageShips < ActiveRecord::Migration + def change + create_table :user_message_ships do |t| + t.integer :user_id, :integer, :index => true + t.integer :message_id, :integer, :index => true + t.timestamps null: false + end + end +end diff --git a/db/schema.rb b/db/schema.rb index ef7b5c0..16d62c9 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20150728165437) do +ActiveRecord::Schema.define(version: 20160429091553) do create_table "comments", force: :cascade do |t| t.text "content" @@ -23,6 +23,17 @@ add_index "comments", ["message_id"], name: "index_comments_on_message_id" + create_table "likes", force: :cascade do |t| + t.integer "user_id" + t.integer "integer" + t.integer "message_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + add_index "likes", ["message_id"], name: "index_likes_on_message_id" + add_index "likes", ["user_id"], name: "index_likes_on_user_id" + create_table "messages", force: :cascade do |t| t.string "title" t.text "content" @@ -36,6 +47,28 @@ add_index "messages", ["status"], name: "index_messages_on_status" add_index "messages", ["user_id"], name: "index_messages_on_user_id" + create_table "subscriptions", force: :cascade do |t| + t.integer "user_id" + t.integer "integer" + t.integer "message_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + add_index "subscriptions", ["message_id"], name: "index_subscriptions_on_message_id" + add_index "subscriptions", ["user_id"], name: "index_subscriptions_on_user_id" + + create_table "user_message_ships", force: :cascade do |t| + t.integer "user_id" + t.integer "integer" + t.integer "message_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + add_index "user_message_ships", ["message_id"], name: "index_user_message_ships_on_message_id" + add_index "user_message_ships", ["user_id"], name: "index_user_message_ships_on_user_id" + create_table "users", force: :cascade do |t| t.string "email", default: "", null: false t.string "encrypted_password", default: "", null: false diff --git a/lib/tasks/dev.rake b/lib/tasks/dev.rake index 4673e72..752ecbb 100644 --- a/lib/tasks/dev.rake +++ b/lib/tasks/dev.rake @@ -16,7 +16,13 @@ namespace :dev do :status => ["pending", "completed"].sample, :content => Faker::Lorem.paragraph, :user => users.sample, - :created_at => Time.now - rand(30).days ) + :created_at => Time.now - rand(30).days + ) + 2.times do + m.likes.create!(:user => users.sample) + m.subscriptions.create!(:user => users.sample) + end + 5.times do m.comments.create!( :content => Faker::Lorem.paragraph, :user => users.sample ) @@ -24,4 +30,4 @@ namespace :dev do end end -end \ No newline at end of file +end diff --git a/spec/models/like_spec.rb b/spec/models/like_spec.rb new file mode 100644 index 0000000..76ea93d --- /dev/null +++ b/spec/models/like_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe Like, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/models/subscription_spec.rb b/spec/models/subscription_spec.rb new file mode 100644 index 0000000..d40bf0b --- /dev/null +++ b/spec/models/subscription_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe Subscription, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/models/user_message_ship_spec.rb b/spec/models/user_message_ship_spec.rb new file mode 100644 index 0000000..8f7b550 --- /dev/null +++ b/spec/models/user_message_ship_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe UserMessageShip, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end