This commit is contained in:
Seth Call 2015-02-25 19:56:26 -06:00
parent ca9e3706c7
commit 4a7d6925da
5 changed files with 269 additions and 205 deletions

View File

@ -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

View File

@ -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) {

View File

@ -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

View File

@ -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

View File

@ -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