diff --git a/ruby/lib/jam_ruby/connection_manager.rb b/ruby/lib/jam_ruby/connection_manager.rb index faa505096..02a0f6891 100644 --- a/ruby/lib/jam_ruby/connection_manager.rb +++ b/ruby/lib/jam_ruby/connection_manager.rb @@ -369,23 +369,21 @@ SQL end end - # if a blk is passed in, upon success, it will be called and you can issue notifications - # within the connection table lock - def join_music_session(user, client_id, music_session, as_musician, tracks, &blk) + def join_music_session(user, client_id, music_session, as_musician, tracks) connection = nil - user_id = user.id - music_session_id = music_session.id ConnectionManager.active_record_transaction do |connection_manager| db_conn = connection_manager.pg_conn - connection = Connection.find_by_client_id_and_user_id!(client_id, user_id) - connection.music_session_id = music_session_id - connection.as_musician = as_musician - connection.joining_session = true - connection.joined_session_at = Time.now - associate_tracks(connection, tracks) - connection.save + connection = Connection.find_by_client_id_and_user_id!(client_id, user.id) + + connection.join_the_session(music_session, as_musician, tracks) + # connection.music_session_id = music_session.id + # connection.as_musician = as_musician + # connection.joining_session = true + # connection.joined_session_at = Time.now + # associate_tracks(connection, tracks) + # connection.save if connection.errors.any? raise ActiveRecord::Rollback @@ -419,7 +417,7 @@ SQL end # can throw exception if the session is deleted just before this - conn.exec("UPDATE connections SET music_session_id = NULL, joined_session_at = NULL, as_musician = NULL WHERE client_id = $1 AND user_id =$2", [client_id, user_id]) do |result| + conn.exec("UPDATE connections SET music_session_id = NULL, joined_session_at = NULL, as_musician = NULL WHERE client_id = $1 AND user_id = $2 AND music_session_id = $3", [client_id, user_id, music_session_id]) do |result| if result.cmd_tuples == 1 @log.debug("disassociated music_session with connection for client_id=#{client_id}, user_id=#{user_id}") @@ -442,23 +440,23 @@ SQL conn.exec("LOCK connections IN EXCLUSIVE MODE").clear end - def associate_tracks(connection, tracks) - @log.debug "Tracks:" - @log.debug tracks - connection.tracks.clear() - - unless tracks.nil? - tracks.each do |track| - instrument = Instrument.find(track["instrument_id"]) - t = Track.new - t.instrument = instrument - t.connection = connection - t.sound = track["sound"] - t.client_track_id = track["client_track_id"] - t.save - connection.tracks << t - end - end - end + # def associate_tracks(connection, tracks) + # @log.debug "Tracks:" + # @log.debug tracks + # connection.tracks.clear() + # + # unless tracks.nil? + # tracks.each do |track| + # instrument = Instrument.find(track["instrument_id"]) + # t = Track.new + # t.instrument = instrument + # t.connection = connection + # t.sound = track["sound"] + # t.client_track_id = track["client_track_id"] + # t.save + # connection.tracks << t + # end + # end + # end end end diff --git a/ruby/lib/jam_ruby/models/connection.rb b/ruby/lib/jam_ruby/models/connection.rb index cf282c357..8e9836c30 100644 --- a/ruby/lib/jam_ruby/models/connection.rb +++ b/ruby/lib/jam_ruby/models/connection.rb @@ -68,6 +68,13 @@ module JamRuby def can_join_music_session + # puts "can_join_music_session: #{music_session_id} was #{music_session_id_was}" if music_session_id_changed? + + if music_session_id_changed? and !(music_session_id_was.nil? or music_session_id_was.blank?) + errors.add(:music_session, ValidationMessages::CANT_JOIN_MULTIPLE_SESSIONS) + return false + end + if music_session.nil? errors.add(:music_session, ValidationMessages::MUSIC_SESSION_MUST_BE_SPECIFIED) return false @@ -139,14 +146,35 @@ module JamRuby true end - def join_the_session(music_session, as_musician) - self.music_session = music_session + def join_the_session(music_session, as_musician, tracks) + self.music_session_id = music_session.id self.as_musician = as_musician self.joining_session = true self.joined_session_at = Time.now - self.save! + associate_tracks(tracks) unless tracks.nil? + self.save end + def associate_tracks(tracks) + # @log.debug "Tracks:" + # @log.debug tracks + + + unless tracks.nil? + self.tracks.clear() + tracks.each do |track| + t = Track.new + t.instrument = Instrument.find(track["instrument_id"]) + t.connection = self + t.sound = track["sound"] + t.client_track_id = track["client_track_id"] + t.save # todo what if it fails? + self.tracks << t + end + end + end + + private def require_at_least_one_track_when_in_session diff --git a/ruby/spec/jam_ruby/connection_manager_spec.rb b/ruby/spec/jam_ruby/connection_manager_spec.rb index ee492fa41..c1e52c44d 100644 --- a/ruby/spec/jam_ruby/connection_manager_spec.rb +++ b/ruby/spec/jam_ruby/connection_manager_spec.rb @@ -490,34 +490,57 @@ describe ConnectionManager do end it "join_music_session fails if user has music_session already active" do + + # there are two different problems: user can only be in one active music_session at a time, + # and a connection can only point to one active music_session at a time. this is a test of + # the former but we need a test of the latter, too. + pending + + end + + it "join_music_session fails if connection has music_session already active" do + + # there are two different problems: user can only be in one active music_session at a time, + # and a connection can only point to one active music_session at a time. this is a test of + # the latter but we need a test of the former, too. + + user_id = create_user("test", "user11", "user11@jamkazam.com") user = User.find(user_id) - music_session = MusicSession.find(create_music_session(user_id)) - client_id = Faker::Number.number(20) - @connman.create_connection(user_id, client_id, "1.1.1.1", 'client') - connection = @connman.join_music_session(user, client_id, music_session, true, TRACKS) + client_id1 = Faker::Number.number(20) + @connman.create_connection(user_id, client_id1, "1.1.1.1", 'client') + music_session1 = MusicSession.find(create_music_session(user_id)) + connection1 = @connman.join_music_session(user, client_id1, music_session1, true, TRACKS) - client_id = Faker::Number.number(20) - @connman.create_connection(user_id, client_id, Faker::Internet.ip_v4_address, 'client') - music_session = MusicSession.find(create_music_session(user_id)) - connection = @connman.join_music_session(user, client_id, music_session, true, TRACKS) + connection1.errors.size.should == 0 - connection.errors.size.should == 1 - connection.errors.get(:music_session).should == [ValidationMessages::CANT_JOIN_MULTIPLE_SESSIONS] + music_session2 = MusicSession.find(create_music_session(user_id)) + connection2 = @connman.join_music_session(user, client_id1, music_session2, true, TRACKS) - user.update_attribute(:admin, true) - client_id = Faker::Number.number(20) - @connman.create_connection(user_id, client_id, "1.1.1.1", 'client') - music_session = MusicSession.find(create_music_session(user_id)) - connection = @connman.join_music_session(user, client_id, music_session, true, TRACKS) - client_id = Faker::Number.number(20) - @connman.create_connection(user_id, client_id, Faker::Internet.ip_v4_address, 'client') - music_session = MusicSession.find(create_music_session(user_id)) - connection = @connman.join_music_session(user, client_id, music_session, true, TRACKS) - connection.errors.size.should == 0 + connection2.errors.size.should == 1 + connection2.errors.get(:music_session).should == [ValidationMessages::CANT_JOIN_MULTIPLE_SESSIONS] + + # client_id2 = Faker::Number.number(20) + # @connman.create_connection(user_id, client_id2, "2.2.2.2", 'client') + # music_session2 = MusicSession.find(create_music_session(user_id)) + # connection2 = @connman.join_music_session(user, client_id2, music_session2, true, TRACKS) + # + # connection2.errors.size.should == 1 + # connection2.errors.get(:music_session).should == [ValidationMessages::CANT_JOIN_MULTIPLE_SESSIONS] + # + # user.update_attribute(:admin, true) + # client_id = Faker::Number.number(20) + # @connman.create_connection(user_id, client_id, "1.1.1.1", 'client') + # music_session = MusicSession.find(create_music_session(user_id)) + # connection = @connman.join_music_session(user, client_id, music_session, true, TRACKS) + # client_id = Faker::Number.number(20) + # @connman.create_connection(user_id, client_id, Faker::Internet.ip_v4_address, 'client') + # music_session = MusicSession.find(create_music_session(user_id)) + # connection = @connman.join_music_session(user, client_id, music_session, true, TRACKS) + # connection.errors.size.should == 0 end end diff --git a/ruby/spec/jam_ruby/models/claimed_recording_spec.rb b/ruby/spec/jam_ruby/models/claimed_recording_spec.rb index 42bb0148f..fae09a6ab 100644 --- a/ruby/spec/jam_ruby/models/claimed_recording_spec.rb +++ b/ruby/spec/jam_ruby/models/claimed_recording_spec.rb @@ -21,7 +21,7 @@ describe ClaimedRecording do @music_session = FactoryGirl.create(:music_session, :creator => @user, :musician_access => true) # @music_session.connections << @connection @music_session.save - @connection.join_the_session(@music_session, true) + @connection.join_the_session(@music_session, true, nil) @recording = Recording.start(@music_session, @user) @recording.stop @recording.reload diff --git a/ruby/spec/jam_ruby/models/mix_spec.rb b/ruby/spec/jam_ruby/models/mix_spec.rb index fe4f84a54..7acb05f81 100755 --- a/ruby/spec/jam_ruby/models/mix_spec.rb +++ b/ruby/spec/jam_ruby/models/mix_spec.rb @@ -10,7 +10,7 @@ describe Mix do @music_session = FactoryGirl.create(:music_session, :creator => @user, :musician_access => true) # @music_session.connections << @connection @music_session.save - @connection.join_the_session(@music_session, true) + @connection.join_the_session(@music_session, true, nil) @recording = Recording.start(@music_session, @user) @recording.stop @recording.claim(@user, "name", "description", Genre.first, true) diff --git a/ruby/spec/jam_ruby/models/music_session_spec.rb b/ruby/spec/jam_ruby/models/music_session_spec.rb index adcaa485b..f76e264a8 100644 --- a/ruby/spec/jam_ruby/models/music_session_spec.rb +++ b/ruby/spec/jam_ruby/models/music_session_spec.rb @@ -398,7 +398,7 @@ describe MusicSession do @music_session = FactoryGirl.create(:music_session, :creator => @user1, :musician_access => true) # @music_session.connections << @connection @music_session.save! - @connection.join_the_session(@music_session, true) + @connection.join_the_session(@music_session, true, nil) end describe "not recording" do diff --git a/ruby/spec/jam_ruby/models/musician_search_spec.rb b/ruby/spec/jam_ruby/models/musician_search_spec.rb index 20be14059..a3c1bdf07 100644 --- a/ruby/spec/jam_ruby/models/musician_search_spec.rb +++ b/ruby/spec/jam_ruby/models/musician_search_spec.rb @@ -115,7 +115,7 @@ describe 'Musician search' do music_session = FactoryGirl.create(:music_session, :creator => usr, :musician_access => true) # music_session.connections << connection music_session.save - connection.join_the_session(music_session, true) + connection.join_the_session(music_session, true, nil) recording = Recording.start(music_session, usr) recording.stop recording.reload @@ -130,7 +130,7 @@ describe 'Musician search' do music_session = FactoryGirl.create(:music_session, :creator => usr, :musician_access => true) # music_session.connections << connection music_session.save - connection.join_the_session(music_session, true) + connection.join_the_session(music_session, true, nil) end context 'musician stat counters' do diff --git a/ruby/spec/jam_ruby/models/recording_spec.rb b/ruby/spec/jam_ruby/models/recording_spec.rb index 7fc0f31d2..56ccf176a 100644 --- a/ruby/spec/jam_ruby/models/recording_spec.rb +++ b/ruby/spec/jam_ruby/models/recording_spec.rb @@ -80,7 +80,7 @@ describe Recording do @track2 = FactoryGirl.create(:track, :connection => @connection2, :instrument => @instrument2) # @music_session.connections << @connection2 - @connection2.join_the_session(@music_session, true) + @connection2.join_the_session(@music_session, true, nil) @recording = Recording.start(@music_session, @user) @user.recordings.length.should == 0 @@ -179,7 +179,7 @@ describe Recording do @track = FactoryGirl.create(:track, :connection => @connection2, :instrument => @instrument) # @music_session.connections << @connection2 @music_session.save - @connection2.join_the_session(@music_session, true) + @connection2.join_the_session(@music_session, true, nil) @recording = Recording.start(@music_session, @user) @recording.stop @recording.reload diff --git a/ruby/spec/jam_ruby/resque/audiomixer_spec.rb b/ruby/spec/jam_ruby/resque/audiomixer_spec.rb index a1cd67c77..94918bc9e 100644 --- a/ruby/spec/jam_ruby/resque/audiomixer_spec.rb +++ b/ruby/spec/jam_ruby/resque/audiomixer_spec.rb @@ -157,7 +157,7 @@ describe AudioMixer do @music_session = FactoryGirl.create(:music_session, :creator => @user, :musician_access => true) # @music_session.connections << @connection @music_session.save - @connection.join_the_session(@music_session, true) + @connection.join_the_session(@music_session, true, nil) @recording = Recording.start(@music_session, @user) @recording.stop @recording.claim(@user, "name", "description", Genre.first, true) diff --git a/web/spec/controllers/api_claimed_recordings_spec.rb b/web/spec/controllers/api_claimed_recordings_spec.rb index f1977d400..7c4b39560 100644 --- a/web/spec/controllers/api_claimed_recordings_spec.rb +++ b/web/spec/controllers/api_claimed_recordings_spec.rb @@ -11,7 +11,7 @@ describe ApiClaimedRecordingsController do @music_session = FactoryGirl.create(:music_session, :creator => @user, :musician_access => true) # @music_session.connections << @connection @music_session.save - @connection.join_the_session(@music_session, true) + @connection.join_the_session(@music_session, true, nil) @recording = Recording.start(@music_session, @user) @recording.stop @recording.reload diff --git a/web/spec/features/social_meta_spec.rb b/web/spec/features/social_meta_spec.rb index ca368dc60..db5dc403f 100644 --- a/web/spec/features/social_meta_spec.rb +++ b/web/spec/features/social_meta_spec.rb @@ -65,7 +65,7 @@ describe "social metadata" do ms = FactoryGirl.create(:music_session, :creator => user, :musician_access => true) # ms.connections << connection ms.save! - connection.join_the_session(ms, true) + connection.join_the_session(ms, true, nil) ms } @@ -93,7 +93,7 @@ describe "social metadata" do @music_session = FactoryGirl.create(:music_session, :creator => @user, :musician_access => true) # @music_session.connections << @connection @music_session.save - @connection.join_the_session(@music_session, true) + @connection.join_the_session(@music_session, true, nil) @recording = Recording.start(@music_session, @user) @recording.stop @recording.reload diff --git a/web/spec/helpers/recording_helper_spec.rb b/web/spec/helpers/recording_helper_spec.rb index 1220abc3e..30ef78ff2 100644 --- a/web/spec/helpers/recording_helper_spec.rb +++ b/web/spec/helpers/recording_helper_spec.rb @@ -10,7 +10,7 @@ describe MusicSessionHelper do @music_session = FactoryGirl.create(:music_session, :creator => @user, :musician_access => true) # @music_session.connections << @connection @music_session.save - @connection.join_the_session(@music_session, true) + @connection.join_the_session(@music_session, true, nil) @recording = Recording.start(@music_session, @user) @recording.stop @recording.reload diff --git a/web/spec/requests/music_sessions_api_spec.rb b/web/spec/requests/music_sessions_api_spec.rb index bc453960d..592a375c9 100755 --- a/web/spec/requests/music_sessions_api_spec.rb +++ b/web/spec/requests/music_sessions_api_spec.rb @@ -700,7 +700,7 @@ describe "Music Session API ", :type => :api do music_session = FactoryGirl.create(:music_session, :creator => user, :musician_access => true) # music_session.connections << connection music_session.save - connection.join_the_session(music_session, true) + connection.join_the_session(music_session, true, nil) recording = Recording.start(music_session, user) recording.stop recording.reload diff --git a/web/spec/requests/users_api_spec.rb b/web/spec/requests/users_api_spec.rb index 8d3c18d5c..07dd6eae4 100644 --- a/web/spec/requests/users_api_spec.rb +++ b/web/spec/requests/users_api_spec.rb @@ -985,7 +985,7 @@ describe "User API", :type => :api do ms = FactoryGirl.create(:music_session, :creator => user, :musician_access => true) # ms.connections << connection ms.save! - connection.join_the_session(ms, true) + connection.join_the_session(ms, true, nil) ms } it "fetches facebook successfully" do @@ -1122,7 +1122,7 @@ describe "User API", :type => :api do @music_session = FactoryGirl.create(:music_session, :creator => user, :musician_access => true) # @music_session.connections << @connection @music_session.save - @connection.join_the_session(@music_session, true) + @connection.join_the_session(@music_session, true, nil) @recording = Recording.start(@music_session, user) @recording.stop @recording.reload