From 6d42e42c1860113d05c0ee46303c2f4957866b8b Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Sun, 12 Jan 2014 12:51:06 -0500 Subject: [PATCH 1/2] VRFS-987 backend support for session/recording likes, plays, and comments --- db/manifest | 3 +- db/up/music_session_constraints.sql | 9 +++ ruby/lib/jam_ruby.rb | 5 ++ ruby/lib/jam_ruby/models/music_session.rb | 1 + .../jam_ruby/models/music_session_comment.rb | 12 ++++ .../jam_ruby/models/music_session_history.rb | 11 +++ .../jam_ruby/models/music_session_liker.rb | 12 ++++ ruby/lib/jam_ruby/models/recording.rb | 21 +++++- ruby/lib/jam_ruby/models/recording_comment.rb | 12 ++++ ruby/lib/jam_ruby/models/recording_liker.rb | 12 ++++ ruby/lib/jam_ruby/models/recording_play.rb | 12 ++++ .../api_music_sessions_controller.rb | 46 +++++++++++++ .../controllers/api_recordings_controller.rb | 68 +++++++++++++++++++ web/app/views/api_recordings/show.rabl | 2 +- web/config/routes.rb | 7 +- 15 files changed, 228 insertions(+), 5 deletions(-) create mode 100644 db/up/music_session_constraints.sql create mode 100644 ruby/lib/jam_ruby/models/music_session_comment.rb create mode 100644 ruby/lib/jam_ruby/models/music_session_liker.rb create mode 100644 ruby/lib/jam_ruby/models/recording_comment.rb create mode 100644 ruby/lib/jam_ruby/models/recording_liker.rb create mode 100644 ruby/lib/jam_ruby/models/recording_play.rb diff --git a/db/manifest b/db/manifest index 0ba311dfe..1ca790e3d 100755 --- a/db/manifest +++ b/db/manifest @@ -86,4 +86,5 @@ music_sessions_have_claimed_recording.sql discardable_recorded_tracks2.sql icecast.sql home_page_promos.sql -mix_job_watch.sql \ No newline at end of file +mix_job_watch.sql +music_session_constraints.sql \ No newline at end of file diff --git a/db/up/music_session_constraints.sql b/db/up/music_session_constraints.sql new file mode 100644 index 000000000..72f2bccd4 --- /dev/null +++ b/db/up/music_session_constraints.sql @@ -0,0 +1,9 @@ +alter table music_sessions_comments drop constraint music_sessions_comments_music_session_id_fkey; +alter table music_sessions_comments add constraint ms_comments_ms_history_fkey foreign key (music_session_id) +references music_sessions_history(music_session_id) match simple +ON UPDATE NO ACTION ON DELETE CASCADE; + +alter table music_sessions_likers drop constraint music_sessions_likers_music_session_id_fkey; +alter table music_sessions_likers add constraint ms_likers_ms_history_fkey foreign key (music_session_id) +references music_sessions_history(music_session_id) match simple +ON UPDATE NO ACTION ON DELETE CASCADE; diff --git a/ruby/lib/jam_ruby.rb b/ruby/lib/jam_ruby.rb index 41885bfcf..4634f4814 100755 --- a/ruby/lib/jam_ruby.rb +++ b/ruby/lib/jam_ruby.rb @@ -64,6 +64,8 @@ require "jam_ruby/models/band_musician" require "jam_ruby/models/connection" require "jam_ruby/models/friendship" require "jam_ruby/models/music_session" +require "jam_ruby/models/music_session_comment" +require "jam_ruby/models/music_session_liker" require "jam_ruby/models/music_session_history" require "jam_ruby/models/music_session_user_history" require "jam_ruby/models/music_session_perf_data" @@ -80,6 +82,9 @@ require "jam_ruby/models/user_follower" require "jam_ruby/models/user_following" require "jam_ruby/models/search" require "jam_ruby/models/recording" +require "jam_ruby/models/recording_comment" +require "jam_ruby/models/recording_liker" +require "jam_ruby/models/recording_play" require "jam_ruby/models/recorded_track" require "jam_ruby/models/recorded_track_observer" require "jam_ruby/models/mix" diff --git a/ruby/lib/jam_ruby/models/music_session.rb b/ruby/lib/jam_ruby/models/music_session.rb index e419d39ba..1a2df5603 100644 --- a/ruby/lib/jam_ruby/models/music_session.rb +++ b/ruby/lib/jam_ruby/models/music_session.rb @@ -37,6 +37,7 @@ module JamRuby validate :creator_is_musician validate :no_new_playback_while_playing + def creator_is_musician unless creator.musician? errors.add(:creator, ValidationMessages::MUST_BE_A_MUSICIAN) diff --git a/ruby/lib/jam_ruby/models/music_session_comment.rb b/ruby/lib/jam_ruby/models/music_session_comment.rb new file mode 100644 index 000000000..cda5589bd --- /dev/null +++ b/ruby/lib/jam_ruby/models/music_session_comment.rb @@ -0,0 +1,12 @@ +module JamRuby + class MusicSessionComment < ActiveRecord::Base + + self.table_name = "music_sessions_comments" + + self.primary_key = 'id' + + belongs_to :music_session, :class_name => "JamRuby::MusicSessionHistory", :foreign_key => "music_session_id" + belongs_to :user, :class_name => "JamRuby::User", :foreign_key => "creator_id" + + end +end \ No newline at end of file diff --git a/ruby/lib/jam_ruby/models/music_session_history.rb b/ruby/lib/jam_ruby/models/music_session_history.rb index f87154c31..1a6fd8418 100644 --- a/ruby/lib/jam_ruby/models/music_session_history.rb +++ b/ruby/lib/jam_ruby/models/music_session_history.rb @@ -15,8 +15,19 @@ module JamRuby :foreign_key => :band_id, :inverse_of => :music_session_history) + has_many :comments, :class_name => "JamRuby::MusicSessionComment", :foreign_key => "music_session_id" + has_many :likes, :class_name => "JamRuby::MusicSessionLiker", :foreign_key => "music_session_id" + GENRE_SEPARATOR = '|' + def comment_count + self.comments.size + end + + def like_count + self.likes.size + end + def self.index(current_user, user_id, band_id = nil, genre = nil) hide_private = false if current_user.id != user_id diff --git a/ruby/lib/jam_ruby/models/music_session_liker.rb b/ruby/lib/jam_ruby/models/music_session_liker.rb new file mode 100644 index 000000000..a7d89fc72 --- /dev/null +++ b/ruby/lib/jam_ruby/models/music_session_liker.rb @@ -0,0 +1,12 @@ +module JamRuby + class MusicSessionLiker < ActiveRecord::Base + + self.table_name = "music_sessions_likers" + + self.primary_key = 'id' + + belongs_to :music_session, :class_name => "JamRuby::MusicSessionHistory", :foreign_key => "music_session_id" + belongs_to :user, :class_name => "JamRuby::User", :foreign_key => "liker_id" + + end +end \ No newline at end of file diff --git a/ruby/lib/jam_ruby/models/recording.rb b/ruby/lib/jam_ruby/models/recording.rb index d17861c16..3eef72ce1 100644 --- a/ruby/lib/jam_ruby/models/recording.rb +++ b/ruby/lib/jam_ruby/models/recording.rb @@ -7,17 +7,34 @@ module JamRuby has_many :claimed_recordings, :class_name => "JamRuby::ClaimedRecording", :inverse_of => :recording has_many :users, :through => :recorded_tracks, :class_name => "JamRuby::User" + has_many :mixes, :class_name => "JamRuby::Mix", :inverse_of => :recording + has_many :recorded_tracks, :class_name => "JamRuby::RecordedTrack", :foreign_key => :recording_id + has_many :comments, :class_name => "JamRuby::RecordingComment", :foreign_key => "recording_id" + has_many :likes, :class_name => "JamRuby::RecordingLiker", :foreign_key => "recording_id" + has_many :plays, :class_name => "JamRuby::RecordingPlay", :foreign_key => "recording_id" + belongs_to :owner, :class_name => "JamRuby::User", :inverse_of => :owned_recordings belongs_to :band, :class_name => "JamRuby::Band", :inverse_of => :recordings belongs_to :music_session, :class_name => "JamRuby::MusicSession", :inverse_of => :recordings - has_many :mixes, :class_name => "JamRuby::Mix", :inverse_of => :recording - has_many :recorded_tracks, :class_name => "JamRuby::RecordedTrack", :foreign_key => :recording_id + validates :music_session, :presence => true validate :not_already_recording, :on => :create validate :not_still_finalizing_previous, :on => :create validate :not_playback_recording, :on => :create validate :already_stopped_recording + def comment_count + self.comments.size + end + + def like_count + self.likes.size + end + + def play_count + self.plays.size + end + def not_already_recording if music_session.is_recording? errors.add(:music_session, ValidationMessages::ALREADY_BEING_RECORDED) diff --git a/ruby/lib/jam_ruby/models/recording_comment.rb b/ruby/lib/jam_ruby/models/recording_comment.rb new file mode 100644 index 000000000..8b7e5ae62 --- /dev/null +++ b/ruby/lib/jam_ruby/models/recording_comment.rb @@ -0,0 +1,12 @@ +module JamRuby + class RecordingComment < ActiveRecord::Base + + self.table_name = "recordings_comments" + + self.primary_key = 'id' + + belongs_to :recording, :class_name => "JamRuby::Recording", :foreign_key => "recording_id" + belongs_to :user, :class_name => "JamRuby::User", :foreign_key => "creator_id" + + end +end \ No newline at end of file diff --git a/ruby/lib/jam_ruby/models/recording_liker.rb b/ruby/lib/jam_ruby/models/recording_liker.rb new file mode 100644 index 000000000..041465d2b --- /dev/null +++ b/ruby/lib/jam_ruby/models/recording_liker.rb @@ -0,0 +1,12 @@ +module JamRuby + class RecordingLiker < ActiveRecord::Base + + self.table_name = "recordings_likers" + + self.primary_key = 'id' + + belongs_to :recording, :class_name => "JamRuby::Recording", :foreign_key => "recording_id" + belongs_to :user, :class_name => "JamRuby::User", :foreign_key => "liker_id" + + end +end \ No newline at end of file diff --git a/ruby/lib/jam_ruby/models/recording_play.rb b/ruby/lib/jam_ruby/models/recording_play.rb new file mode 100644 index 000000000..e2e24e55f --- /dev/null +++ b/ruby/lib/jam_ruby/models/recording_play.rb @@ -0,0 +1,12 @@ +module JamRuby + class RecordingPlay < ActiveRecord::Base + + self.table_name = "recordings_plays" + + self.primary_key = 'id' + + belongs_to :recording, :class_name => "JamRuby::Recording", :foreign_key => "recording_id" + belongs_to :user, :class_name => "JamRuby::User", :foreign_key => "player_id" + + end +end diff --git a/web/app/controllers/api_music_sessions_controller.rb b/web/app/controllers/api_music_sessions_controller.rb index ab93d3c29..79b8cfe84 100644 --- a/web/app/controllers/api_music_sessions_controller.rb +++ b/web/app/controllers/api_music_sessions_controller.rb @@ -234,6 +234,52 @@ class ApiMusicSessionsController < ApiController end end + def add_comment + if params[:id].blank? + render :json => { :message => "Session ID is required" }, :status => 400 + end + + if params[:user_id].blank? + render :json => { :message => "User ID is required" }, :status => 400 + end + + if params[:comment].blank? + render :json => { :message => "Comment is required" }, :status => 400 + end + + comment = MusicSessionComment.new + comment.music_session_id = params[:id] + comment.creator_id = params[:user_id] + comment.comment = params[:comment] + comment.save + + if comment.errors.any? + render :json => { :message => "Unexpected error occurred" }, :status => 500 + else + render :json => {}, :status => 201 + end + end + + def add_like + if params[:id].blank? + render :json => { :message => "Session ID is required" }, :status => 400 + end + + if params[:user_id].blank? + render :json => { :message => "User ID is required" }, :status => 400 + end + + liker = MusicSessionLiker.new + liker.music_session_id = params[:id] + liker.liker_id = params[:user_id] + liker.save + + if liker.errors.any? + render :json => { :message => "Unexpected error occurred" }, :status => 500 + else + render :json => {}, :status => 201 + end + end def claimed_recording_start @music_session.claimed_recording_start(current_user, ClaimedRecording.find(params[:claimed_recording_id])) diff --git a/web/app/controllers/api_recordings_controller.rb b/web/app/controllers/api_recordings_controller.rb index d87f1f9c3..d081e0123 100644 --- a/web/app/controllers/api_recordings_controller.rb +++ b/web/app/controllers/api_recordings_controller.rb @@ -80,6 +80,74 @@ class ApiRecordingsController < ApiController end end + def add_comment + if params[:id].blank? + render :json => { :message => "Recording ID is required" }, :status => 400 + end + + if params[:user_id].blank? + render :json => { :message => "User ID is required" }, :status => 400 + end + + if params[:comment].blank? + render :json => { :message => "Comment is required" }, :status => 400 + end + + comment = RecordingComment.new + comment.recording_id = params[:id] + comment.creator_id = params[:user_id] + comment.comment = params[:comment] + comment.save + + if comment.errors.any? + render :json => { :message => "Unexpected error occurred" }, :status => 500 + else + render :json => {}, :status => 201 + end + end + + def add_like + if params[:id].blank? + render :json => { :message => "Recording ID is required" }, :status => 400 + end + + if params[:user_id].blank? + render :json => { :message => "User ID is required" }, :status => 400 + end + + liker = RecordingLiker.new + liker.recording_id = params[:id] + liker.liker_id = params[:user_id] + liker.save + + if liker.errors.any? + render :json => { :message => "Unexpected error occurred" }, :status => 500 + else + render :json => {} :status => 201 + end + end + + def add_play + if params[:id].blank? + render :json => { :message => "Recording ID is required" }, :status => 400 + end + + if params[:user_id].blank? + render :json => { :message => "User ID is required" }, :status => 400 + end + + play = RecordingPlay.new + play.recording_id = params[:id] + play.player_id = params[:user_id] + play.save + + if play.errors.any? + render :json => { :message => "Unexpected error occurred" }, :status => 500 + else + render :json => {}, :status => 201 + end + end + # discard will tell the server the user has no interest in the recording def discard @recording.discard(current_user) diff --git a/web/app/views/api_recordings/show.rabl b/web/app/views/api_recordings/show.rabl index 9fd83dfcf..0ece6725a 100644 --- a/web/app/views/api_recordings/show.rabl +++ b/web/app/views/api_recordings/show.rabl @@ -1,6 +1,6 @@ object @recording -attributes :id, :band, :created_at, :duration +attributes :id, :band, :created_at, :duration, :comment_count, :like_count, :play_count child(:recorded_tracks => :recorded_tracks) { attributes :id, :fully_uploaded, :url, :client_track_id, :client_id, :instrument_id diff --git a/web/config/routes.rb b/web/config/routes.rb index fb2e6941f..d95b8b7a2 100644 --- a/web/config/routes.rb +++ b/web/config/routes.rb @@ -89,7 +89,9 @@ SampleApp::Application.routes.draw do match '/sessions' => 'api_music_sessions#index', :via => :get match '/sessions' => 'api_music_sessions#create', :via => :post match '/sessions/:id/perf' => 'api_music_sessions#perf_upload', :via => :put - + match '/sessions/:id/comments' => 'api_music_sessions#add_comment', :via => :post + match '/sessions/:id/likes' => 'api_music_sessions#add_like', :via => :post + # music session tracks match '/sessions/:id/tracks' => 'api_music_sessions#track_create', :via => :post match '/sessions/:id/tracks' => 'api_music_sessions#track_sync', :via => :put @@ -278,6 +280,9 @@ SampleApp::Application.routes.draw do match '/recordings/:id' => 'api_recordings#show', :via => :get, :as => 'api_recordings_detail' match '/recordings/:id/stop' => 'api_recordings#stop', :via => :post, :as => 'api_recordings_stop' match '/recordings/:id/claim' => 'api_recordings#claim', :via => :post, :as => 'api_recordings_claim' + match '/recordings/:id/comments' => 'api_recordings#add_comment', :via => :post, :as => 'api_recordings_add_comment' + match '/recordings/:id/likes' => 'api_recordings#add_like', :via => :post, :as => 'api_recordings_add_like' + match '/recordings/:id/plays' => 'api_recordings#add_play', :via => :post, :as => 'api_recordings_add_play' match '/recordings/:id/discard' => 'api_recordings#discard', :via => :post, :as => 'api_recordings_discard' match '/recordings/:id/tracks/:track_id/download' => 'api_recordings#download', :via => :get, :as => 'api_recordings_download' match '/recordings/:id/tracks/:track_id/upload_next_part' => 'api_recordings#upload_next_part', :via => :get From 753dc22e8bd4360674a4a4144cdbc4e3aeda956d Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Sun, 12 Jan 2014 13:00:57 -0500 Subject: [PATCH 2/2] fix syntax error --- web/app/controllers/api_recordings_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/app/controllers/api_recordings_controller.rb b/web/app/controllers/api_recordings_controller.rb index d081e0123..3a8986fb2 100644 --- a/web/app/controllers/api_recordings_controller.rb +++ b/web/app/controllers/api_recordings_controller.rb @@ -123,7 +123,7 @@ class ApiRecordingsController < ApiController if liker.errors.any? render :json => { :message => "Unexpected error occurred" }, :status => 500 else - render :json => {} :status => 201 + render :json => {}, :status => 201 end end