diff --git a/ruby/lib/jam_ruby/models/recording.rb b/ruby/lib/jam_ruby/models/recording.rb index bee8a2f95..c4537c94d 100644 --- a/ruby/lib/jam_ruby/models/recording.rb +++ b/ruby/lib/jam_ruby/models/recording.rb @@ -22,7 +22,7 @@ module JamRuby belongs_to :band, :class_name => "JamRuby::Band", :inverse_of => :recordings belongs_to :music_session, :class_name => "JamRuby::ActiveMusicSession", :inverse_of => :recordings, foreign_key: :music_session_id belongs_to :jam_track, :class_name => "JamRuby::JamTrack", :inverse_of => :recordings, :foreign_key => 'jam_track_id' - belongs_to :jam_track_initiator, :class_name => "JamRuby::User", :inverse_of => :recorded_jam_tracks, :foreign_key => 'jam_track_initiator_id' + belongs_to :jam_track_initiator, :class_name => "JamRuby::User", :inverse_of => :initiated_jam_track_recordings, :foreign_key => 'jam_track_initiator_id' accepts_nested_attributes_for :recorded_tracks, :mixes, :claimed_recordings, allow_destroy: true @@ -229,7 +229,7 @@ module JamRuby if music_session.jam_track music_session.jam_track.jam_track_tracks.each do |jam_track_track| - recording.recorded_jam_tracks << RecordedJamTrack.create_from_jam_track_track(jam_track_track, recording) + recording.recorded_jam_track_tracks << RecordedJamTrackTrack.create_from_jam_track_track(jam_track_track, recording) end recording.jam_track = music_session.jam_track recording.jam_track_initiator = music_session.jam_track_initiator diff --git a/web/app/assets/javascripts/playbackControls.js b/web/app/assets/javascripts/playbackControls.js index f54e31669..f88d541c6 100644 --- a/web/app/assets/javascripts/playbackControls.js +++ b/web/app/assets/javascripts/playbackControls.js @@ -101,13 +101,25 @@ } $playButton.on('click', function(e) { - startPlay(); + var sessionModel = context.JK.CurrentSessionModel || null; + if(sessionModel && sessionModel.areControlsLockedForJamTrackRecording() && $parentElement.closest('.session-track').data('track_data').type == 'jam_track') { + context.JK.prodBubble($fader, 'jamtrack-controls-disabled', {}, {positions:['top'], offsetParent: $playButton}) return false; + } + + startPlay(); + return false; }); $pauseButton.on('click', function(e) { - stopPlay(); + var sessionModel = context.JK.CurrentSessionModel || null; + if(sessionModel && sessionModel.areControlsLockedForJamTrackRecording() && $parentElement.closest('.session-track').data('track_data').type == 'jam_track') { + context.JK.prodBubble($pauseButton, 'jamtrack-controls-disabled', {}, {positions:['top'], offsetParent: $pauseButton}) return false; + } + + stopPlay(); + return false; }); $sliderBar.on('click', function(e) { diff --git a/web/app/views/api_claimed_recordings/show.rabl b/web/app/views/api_claimed_recordings/show.rabl index aa7de2609..5803d4da4 100644 --- a/web/app/views/api_claimed_recordings/show.rabl +++ b/web/app/views/api_claimed_recordings/show.rabl @@ -20,7 +20,7 @@ node :mix do |claimed_recording| end child(:recording => :recording) { - attributes :id, :created_at, :duration, :comment_count, :like_count, :play_count + attributes :id, :created_at, :duration, :comment_count, :like_count, :play_count, :jam_track_id, :jam_track_initiator_id child(:band => :band) { attributes :id, :name, :location, :photo_url @@ -50,6 +50,15 @@ child(:recording => :recording) { end } + child(:recorded_jam_track_tracks => :recorded_jam_track_tracks) { + node do |recorded_jam_track_track| + { + id: recorded_jam_track_track.jam_track_track.id, + timeline: recorded_jam_track_track.timeline ? JSON.parse(recorded_jam_track_track.timeline) : [] + } + end + } + child(:comments => :comments) { attributes :comment, :created_at diff --git a/web/app/views/api_recordings/show.rabl b/web/app/views/api_recordings/show.rabl index f3c817b07..cda9e1251 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, :comment_count, :like_count, :play_count, :when_will_be_discarded? +attributes :id, :band, :created_at, :duration, :comment_count, :like_count, :play_count, :when_will_be_discarded?, :jam_track_id, :jam_track_initiator_id node :mix do |recording| if recording.mix @@ -33,6 +33,15 @@ child(:recorded_backing_tracks => :recorded_backing_tracks) { end } +child(:recorded_jam_track_tracks => :recorded_jam_track_tracks) { + node do |recorded_jam_track_track| + { + id: recorded_jam_track_track.jam_track_track.id, + timeline: recorded_jam_track_track.timeline ? JSON.parse(recorded_jam_track_track.timeline) : [] + } + end +} + child(:comments => :comments) { attributes :comment, :created_at diff --git a/web/spec/controllers/api_recordings_controller_spec.rb b/web/spec/controllers/api_recordings_controller_spec.rb index f09a6130d..ac54f6272 100644 --- a/web/spec/controllers/api_recordings_controller_spec.rb +++ b/web/spec/controllers/api_recordings_controller_spec.rb @@ -3,217 +3,251 @@ require 'spec_helper' describe ApiRecordingsController do render_views + describe "recording with backing track" do - before(:each) do - @user = FactoryGirl.create(:user) - @instrument = FactoryGirl.create(:instrument, :description => 'a great instrument') - @music_session = FactoryGirl.create(:active_music_session, :creator => @user, :musician_access => true) - @connection = FactoryGirl.create(:connection, :user => @user, :music_session => @music_session) - @track = FactoryGirl.create(:track, :connection => @connection, :instrument => @instrument) - @backing_track = FactoryGirl.create(:backing_track, :connection => @connection) - controller.current_user = @user - end - - describe "start" do - it "should work" do - post :start, { :format => 'json', :music_session_id => @music_session.id } - response.should be_success - response_body = JSON.parse(response.body) - response_body['id'].should_not be_nil - recording = Recording.find(response_body['id']) + before(:each) do + @user = FactoryGirl.create(:user) + @instrument = FactoryGirl.create(:instrument, :description => 'a great instrument') + @music_session = FactoryGirl.create(:active_music_session, :creator => @user, :musician_access => true) + @connection = FactoryGirl.create(:connection, :user => @user, :music_session => @music_session) + @track = FactoryGirl.create(:track, :connection => @connection, :instrument => @instrument) + @backing_track = FactoryGirl.create(:backing_track, :connection => @connection) + controller.current_user = @user end - it "should not allow multiple starts" do - post :start, { :format => 'json', :music_session_id => @music_session.id } - post :start, { :format => 'json', :music_session_id => @music_session.id } - response.status.should == 422 - response_body = JSON.parse(response.body) - response_body["errors"]["music_session"][0].should == ValidationMessages::ALREADY_BEING_RECORDED + describe "start" do + it "should work" do + post :start, {:format => 'json', :music_session_id => @music_session.id} + response.should be_success + response_body = JSON.parse(response.body) + response_body['id'].should_not be_nil + recording = Recording.find(response_body['id']) + end + + it "should not allow multiple starts" do + post :start, {:format => 'json', :music_session_id => @music_session.id} + post :start, {:format => 'json', :music_session_id => @music_session.id} + response.status.should == 422 + response_body = JSON.parse(response.body) + response_body["errors"]["music_session"][0].should == ValidationMessages::ALREADY_BEING_RECORDED + end + + it "should not allow start while playback ongoing" do + recording = Recording.start(@music_session, @user) + recording.stop + recording.reload + claimed_recording = recording.claim(@user, "name", "description", Genre.first, true) + @music_session.claimed_recording_start(@user, claimed_recording) + @music_session.errors.any?.should be_false + post :start, {:format => 'json', :music_session_id => @music_session.id} + response.status.should == 422 + response_body = JSON.parse(response.body) + response_body["errors"]["music_session"][0].should == ValidationMessages::ALREADY_PLAYBACK_RECORDING + end + + it "should not allow start by somebody not in the music session" do + user2 = FactoryGirl.create(:user) + controller.current_user = user2 + post :start, {:format => 'json', :music_session_id => @music_session.id} + response.status.should == 403 + end end - it "should not allow start while playback ongoing" do - recording = Recording.start(@music_session, @user) - recording.stop - recording.reload - claimed_recording = recording.claim(@user, "name", "description", Genre.first, true) - @music_session.claimed_recording_start(@user, claimed_recording) - @music_session.errors.any?.should be_false - post :start, { :format => 'json', :music_session_id => @music_session.id } - response.status.should == 422 - response_body = JSON.parse(response.body) - response_body["errors"]["music_session"][0].should == ValidationMessages::ALREADY_PLAYBACK_RECORDING + describe "get" do + it "should work" do + post :start, {:format => 'json', :music_session_id => @music_session.id} + response.should be_success + response_body = JSON.parse(response.body) + response_body['id'].should_not be_nil + recordingId = response_body['id'] + get :show, {:format => 'json', :id => recordingId} + response.should be_success + response_body = JSON.parse(response.body) + response_body['id'].should == recordingId + end + end - it "should not allow start by somebody not in the music session" do - user2 = FactoryGirl.create(:user) - controller.current_user = user2 - post :start, { :format => 'json', :music_session_id => @music_session.id } - response.status.should == 403 + describe "stop" do + it "should work" do + post :start, {:format => 'json', :music_session_id => @music_session.id} + response_body = JSON.parse(response.body) + recording = Recording.find(response_body['id']) + post :stop, {:format => 'json', :id => recording.id} + response.should be_success + response_body = JSON.parse(response.body) + response_body['id'].should_not be_nil + Recording.find(response_body['id']).id.should == recording.id + end + + it "should not allow stop on a session not being recorded" do + post :start, {:format => 'json', :music_session_id => @music_session.id} + response_body = JSON.parse(response.body) + recording = Recording.find(response_body['id']) + post :stop, {:format => 'json', :id => recording.id} + post :stop, {:format => 'json', :id => recording.id} + response.status.should == 422 + response_body = JSON.parse(response.body) + end + + it "should not allow stop on a session requested by a different member" do + + post :start, {:format => 'json', :music_session_id => @music_session.id} + response_body = JSON.parse(response.body) + recording = Recording.find(response_body['id']) + user2 = FactoryGirl.create(:user) + controller.current_user = user2 + post :stop, {:format => 'json', :id => recording.id} + response.status.should == 403 + end + end + + describe "download track" do + let(:mix) { FactoryGirl.create(:mix) } + + it "should only allow a user to download a track if they have claimed the recording" do + post :start, {:format => 'json', :music_session_id => @music_session.id} + response_body = JSON.parse(response.body) + recording = Recording.find(response_body['id']) + post :stop, {:format => 'json', :id => recording.id} + response.should be_success + end + + + it "is possible" do + mix.touch + recorded_track = mix.recording.recorded_tracks[0] + controller.current_user = mix.recording.owner + get :download, {id: recorded_track.recording.id, track_id: recorded_track.client_track_id} + response.status.should == 302 + + recorded_track.reload + recorded_track.download_count.should == 1 + + get :download, {id: recorded_track.recording.id, track_id: recorded_track.client_track_id} + response.status.should == 302 + + recorded_track.reload + recorded_track.download_count.should == 2 + end + + + it "prevents download after limit is reached" do + mix.touch + recorded_track = mix.recording.recorded_tracks[0] + recorded_track.download_count = APP_CONFIG.max_audio_downloads + recorded_track.save! + controller.current_user = recorded_track.user + get :download, {format: 'json', id: recorded_track.recording.id, track_id: recorded_track.client_track_id} + response.status.should == 404 + JSON.parse(response.body, symbolize_names: true)[:message].should == "download limit surpassed" + end + + + it "lets admins surpass limit" do + mix.touch + recorded_track = mix.recording.recorded_tracks[0] + recorded_track.download_count = APP_CONFIG.max_audio_downloads + recorded_track.save! + recorded_track.user.admin = true + recorded_track.user.save! + + controller.current_user = recorded_track.user + get :download, {format: 'json', id: recorded_track.recording.id, track_id: recorded_track.client_track_id} + response.status.should == 302 + recorded_track.reload + recorded_track.download_count.should == 101 + end + end + + describe "download backing track" do + let(:mix) { FactoryGirl.create(:mix) } + + it "should only allow a user to download a track if they have claimed the recording" do + post :start, {:format => 'json', :music_session_id => @music_session.id} + response_body = JSON.parse(response.body) + recording = Recording.find(response_body['id']) + post :stop, {:format => 'json', :id => recording.id} + response.should be_success + end + + + it "is possible" do + mix.touch + recorded_track = mix.recording.recorded_tracks[0] + controller.current_user = mix.recording.owner + get :download, {id: recorded_track.recording.id, track_id: recorded_track.client_track_id} + response.status.should == 302 + + recorded_track.reload + recorded_track.download_count.should == 1 + + get :download, {id: recorded_track.recording.id, track_id: recorded_track.client_track_id} + response.status.should == 302 + + recorded_track.reload + recorded_track.download_count.should == 2 + end + + + it "prevents download after limit is reached" do + mix.touch + recorded_track = mix.recording.recorded_tracks[0] + recorded_track.download_count = APP_CONFIG.max_audio_downloads + recorded_track.save! + controller.current_user = recorded_track.user + get :download, {format: 'json', id: recorded_track.recording.id, track_id: recorded_track.client_track_id} + response.status.should == 404 + JSON.parse(response.body, symbolize_names: true)[:message].should == "download limit surpassed" + end + + + it "lets admins surpass limit" do + mix.touch + recorded_track = mix.recording.recorded_tracks[0] + recorded_track.download_count = APP_CONFIG.max_audio_downloads + recorded_track.save! + recorded_track.user.admin = true + recorded_track.user.save! + + controller.current_user = recorded_track.user + get :download, {format: 'json', id: recorded_track.recording.id, track_id: recorded_track.client_track_id} + response.status.should == 302 + recorded_track.reload + recorded_track.download_count.should == 101 + end end end - describe "get" do - it "should work" do - post :start, { :format => 'json', :music_session_id => @music_session.id } - response.should be_success - response_body = JSON.parse(response.body) - response_body['id'].should_not be_nil - recordingId = response_body['id'] - get :show, {:format => 'json', :id => recordingId} - response.should be_success - response_body = JSON.parse(response.body) - response_body['id'].should == recordingId + describe "recording with jam track" do + + before(:each) do + @user = FactoryGirl.create(:user) + @instrument = FactoryGirl.create(:instrument, :description => 'a great instrument') + @music_session = FactoryGirl.create(:active_music_session, :creator => @user, :musician_access => true) + @connection = FactoryGirl.create(:connection, :user => @user, :music_session => @music_session) + @track = FactoryGirl.create(:track, :connection => @connection, :instrument => @instrument) + @jam_track = FactoryGirl.create(:jam_track) + + # make sure the jam track is opened + @music_session.jam_track = @jam_track + @music_session.jam_track_initiator = @user + @music_session.save! + controller.current_user = @user end - end - - describe "stop" do - it "should work" do - post :start, { :format => 'json', :music_session_id => @music_session.id } - response_body = JSON.parse(response.body) - recording = Recording.find(response_body['id']) - post :stop, { :format => 'json', :id => recording.id } - response.should be_success - response_body = JSON.parse(response.body) - response_body['id'].should_not be_nil - Recording.find(response_body['id']).id.should == recording.id - end - - it "should not allow stop on a session not being recorded" do - post :start, { :format => 'json', :music_session_id => @music_session.id } - response_body = JSON.parse(response.body) - recording = Recording.find(response_body['id']) - post :stop, { :format => 'json', :id => recording.id } - post :stop, { :format => 'json', :id => recording.id } - response.status.should == 422 - response_body = JSON.parse(response.body) - end - - it "should not allow stop on a session requested by a different member" do - - post :start, { :format => 'json', :music_session_id => @music_session.id } - response_body = JSON.parse(response.body) - recording = Recording.find(response_body['id']) - user2 = FactoryGirl.create(:user) - controller.current_user = user2 - post :stop, { :format => 'json', :id => recording.id } - response.status.should == 403 - end - end - - describe "download track" do - let(:mix) { FactoryGirl.create(:mix) } - - it "should only allow a user to download a track if they have claimed the recording" do - post :start, { :format => 'json', :music_session_id => @music_session.id } - response_body = JSON.parse(response.body) - recording = Recording.find(response_body['id']) - post :stop, { :format => 'json', :id => recording.id } - response.should be_success - end - - - it "is possible" do - mix.touch - recorded_track = mix.recording.recorded_tracks[0] - controller.current_user = mix.recording.owner - get :download, {id: recorded_track.recording.id, track_id: recorded_track.client_track_id} - response.status.should == 302 - - recorded_track.reload - recorded_track.download_count.should == 1 - - get :download, {id: recorded_track.recording.id, track_id: recorded_track.client_track_id} - response.status.should == 302 - - recorded_track.reload - recorded_track.download_count.should == 2 - end - - - it "prevents download after limit is reached" do - mix.touch - recorded_track = mix.recording.recorded_tracks[0] - recorded_track.download_count = APP_CONFIG.max_audio_downloads - recorded_track.save! - controller.current_user = recorded_track.user - get :download, {format:'json', id: recorded_track.recording.id, track_id: recorded_track.client_track_id} - response.status.should == 404 - JSON.parse(response.body, symbolize_names: true)[:message].should == "download limit surpassed" - end - - - it "lets admins surpass limit" do - mix.touch - recorded_track = mix.recording.recorded_tracks[0] - recorded_track.download_count = APP_CONFIG.max_audio_downloads - recorded_track.save! - recorded_track.user.admin = true - recorded_track.user.save! - - controller.current_user = recorded_track.user - get :download, {format:'json', id: recorded_track.recording.id, track_id: recorded_track.client_track_id} - response.status.should == 302 - recorded_track.reload - recorded_track.download_count.should == 101 - end - end - - describe "download backing track" do - let(:mix) { FactoryGirl.create(:mix) } - - it "should only allow a user to download a track if they have claimed the recording" do - post :start, { :format => 'json', :music_session_id => @music_session.id } - response_body = JSON.parse(response.body) - recording = Recording.find(response_body['id']) - post :stop, { :format => 'json', :id => recording.id } - response.should be_success - end - - - it "is possible" do - mix.touch - recorded_track = mix.recording.recorded_tracks[0] - controller.current_user = mix.recording.owner - get :download, {id: recorded_track.recording.id, track_id: recorded_track.client_track_id} - response.status.should == 302 - - recorded_track.reload - recorded_track.download_count.should == 1 - - get :download, {id: recorded_track.recording.id, track_id: recorded_track.client_track_id} - response.status.should == 302 - - recorded_track.reload - recorded_track.download_count.should == 2 - end - - - it "prevents download after limit is reached" do - mix.touch - recorded_track = mix.recording.recorded_tracks[0] - recorded_track.download_count = APP_CONFIG.max_audio_downloads - recorded_track.save! - controller.current_user = recorded_track.user - get :download, {format:'json', id: recorded_track.recording.id, track_id: recorded_track.client_track_id} - response.status.should == 404 - JSON.parse(response.body, symbolize_names: true)[:message].should == "download limit surpassed" - end - - - it "lets admins surpass limit" do - mix.touch - recorded_track = mix.recording.recorded_tracks[0] - recorded_track.download_count = APP_CONFIG.max_audio_downloads - recorded_track.save! - recorded_track.user.admin = true - recorded_track.user.save! - - controller.current_user = recorded_track.user - get :download, {format:'json', id: recorded_track.recording.id, track_id: recorded_track.client_track_id} - response.status.should == 302 - recorded_track.reload - recorded_track.download_count.should == 101 + describe "start" do + it "should work" do + post :start, {:format => 'json', :music_session_id => @music_session.id} + response.should be_success + response_body = JSON.parse(response.body) + response_body['id'].should_not be_nil + recording = Recording.find(response_body['id']) + recorded_jam_track_track = response_body["recorded_jam_track_tracks"][0] + recorded_jam_track_track["id"].should eq(@jam_track.jam_track_tracks[0].id) + recorded_jam_track_track["timeline"].should eq([]) + end end end end +