change join_the_session api to add tracks; move the impl to connection; a few bug fixes

This commit is contained in:
Scott Comer 2014-04-30 22:01:43 -05:00
parent c0834c92c7
commit fe59865bd9
14 changed files with 118 additions and 69 deletions

View File

@ -369,23 +369,21 @@ SQL
end end
end end
# if a blk is passed in, upon success, it will be called and you can issue notifications def join_music_session(user, client_id, music_session, as_musician, tracks)
# within the connection table lock
def join_music_session(user, client_id, music_session, as_musician, tracks, &blk)
connection = nil connection = nil
user_id = user.id
music_session_id = music_session.id
ConnectionManager.active_record_transaction do |connection_manager| ConnectionManager.active_record_transaction do |connection_manager|
db_conn = connection_manager.pg_conn db_conn = connection_manager.pg_conn
connection = Connection.find_by_client_id_and_user_id!(client_id, user_id) 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.join_the_session(music_session, as_musician, tracks)
connection.joining_session = true # connection.music_session_id = music_session.id
connection.joined_session_at = Time.now # connection.as_musician = as_musician
associate_tracks(connection, tracks) # connection.joining_session = true
connection.save # connection.joined_session_at = Time.now
# associate_tracks(connection, tracks)
# connection.save
if connection.errors.any? if connection.errors.any?
raise ActiveRecord::Rollback raise ActiveRecord::Rollback
@ -419,7 +417,7 @@ SQL
end end
# can throw exception if the session is deleted just before this # 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 if result.cmd_tuples == 1
@log.debug("disassociated music_session with connection for client_id=#{client_id}, user_id=#{user_id}") @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 conn.exec("LOCK connections IN EXCLUSIVE MODE").clear
end end
def associate_tracks(connection, tracks) # def associate_tracks(connection, tracks)
@log.debug "Tracks:" # @log.debug "Tracks:"
@log.debug tracks # @log.debug tracks
connection.tracks.clear() # connection.tracks.clear()
#
unless tracks.nil? # unless tracks.nil?
tracks.each do |track| # tracks.each do |track|
instrument = Instrument.find(track["instrument_id"]) # instrument = Instrument.find(track["instrument_id"])
t = Track.new # t = Track.new
t.instrument = instrument # t.instrument = instrument
t.connection = connection # t.connection = connection
t.sound = track["sound"] # t.sound = track["sound"]
t.client_track_id = track["client_track_id"] # t.client_track_id = track["client_track_id"]
t.save # t.save
connection.tracks << t # connection.tracks << t
end # end
end # end
end # end
end end
end end

View File

@ -68,6 +68,13 @@ module JamRuby
def can_join_music_session 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? if music_session.nil?
errors.add(:music_session, ValidationMessages::MUSIC_SESSION_MUST_BE_SPECIFIED) errors.add(:music_session, ValidationMessages::MUSIC_SESSION_MUST_BE_SPECIFIED)
return false return false
@ -139,14 +146,35 @@ module JamRuby
true true
end end
def join_the_session(music_session, as_musician) def join_the_session(music_session, as_musician, tracks)
self.music_session = music_session self.music_session_id = music_session.id
self.as_musician = as_musician self.as_musician = as_musician
self.joining_session = true self.joining_session = true
self.joined_session_at = Time.now self.joined_session_at = Time.now
self.save! associate_tracks(tracks) unless tracks.nil?
self.save
end 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 private
def require_at_least_one_track_when_in_session def require_at_least_one_track_when_in_session

View File

@ -490,34 +490,57 @@ describe ConnectionManager do
end end
it "join_music_session fails if user has music_session already active" do 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 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_id = create_user("test", "user11", "user11@jamkazam.com")
user = User.find(user_id) user = User.find(user_id)
music_session = MusicSession.find(create_music_session(user_id))
client_id = Faker::Number.number(20) client_id1 = Faker::Number.number(20)
@connman.create_connection(user_id, client_id, "1.1.1.1", 'client') @connman.create_connection(user_id, client_id1, "1.1.1.1", 'client')
connection = @connman.join_music_session(user, client_id, music_session, true, TRACKS) 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) connection1.errors.size.should == 0
@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 == 1 music_session2 = MusicSession.find(create_music_session(user_id))
connection.errors.get(:music_session).should == [ValidationMessages::CANT_JOIN_MULTIPLE_SESSIONS] connection2 = @connman.join_music_session(user, client_id1, music_session2, true, TRACKS)
user.update_attribute(:admin, true) connection2.errors.size.should == 1
client_id = Faker::Number.number(20) connection2.errors.get(:music_session).should == [ValidationMessages::CANT_JOIN_MULTIPLE_SESSIONS]
@connman.create_connection(user_id, client_id, "1.1.1.1", 'client')
music_session = MusicSession.find(create_music_session(user_id)) # client_id2 = Faker::Number.number(20)
connection = @connman.join_music_session(user, client_id, music_session, true, TRACKS) # @connman.create_connection(user_id, client_id2, "2.2.2.2", 'client')
client_id = Faker::Number.number(20) # music_session2 = MusicSession.find(create_music_session(user_id))
@connman.create_connection(user_id, client_id, Faker::Internet.ip_v4_address, 'client') # connection2 = @connman.join_music_session(user, client_id2, music_session2, true, TRACKS)
music_session = MusicSession.find(create_music_session(user_id)) #
connection = @connman.join_music_session(user, client_id, music_session, true, TRACKS) # connection2.errors.size.should == 1
connection.errors.size.should == 0 # 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
end end

View File

@ -21,7 +21,7 @@ describe ClaimedRecording do
@music_session = FactoryGirl.create(:music_session, :creator => @user, :musician_access => true) @music_session = FactoryGirl.create(:music_session, :creator => @user, :musician_access => true)
# @music_session.connections << @connection # @music_session.connections << @connection
@music_session.save @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 = Recording.start(@music_session, @user)
@recording.stop @recording.stop
@recording.reload @recording.reload

View File

@ -10,7 +10,7 @@ describe Mix do
@music_session = FactoryGirl.create(:music_session, :creator => @user, :musician_access => true) @music_session = FactoryGirl.create(:music_session, :creator => @user, :musician_access => true)
# @music_session.connections << @connection # @music_session.connections << @connection
@music_session.save @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 = Recording.start(@music_session, @user)
@recording.stop @recording.stop
@recording.claim(@user, "name", "description", Genre.first, true) @recording.claim(@user, "name", "description", Genre.first, true)

View File

@ -398,7 +398,7 @@ describe MusicSession do
@music_session = FactoryGirl.create(:music_session, :creator => @user1, :musician_access => true) @music_session = FactoryGirl.create(:music_session, :creator => @user1, :musician_access => true)
# @music_session.connections << @connection # @music_session.connections << @connection
@music_session.save! @music_session.save!
@connection.join_the_session(@music_session, true) @connection.join_the_session(@music_session, true, nil)
end end
describe "not recording" do describe "not recording" do

View File

@ -115,7 +115,7 @@ describe 'Musician search' do
music_session = FactoryGirl.create(:music_session, :creator => usr, :musician_access => true) music_session = FactoryGirl.create(:music_session, :creator => usr, :musician_access => true)
# music_session.connections << connection # music_session.connections << connection
music_session.save 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 = Recording.start(music_session, usr)
recording.stop recording.stop
recording.reload recording.reload
@ -130,7 +130,7 @@ describe 'Musician search' do
music_session = FactoryGirl.create(:music_session, :creator => usr, :musician_access => true) music_session = FactoryGirl.create(:music_session, :creator => usr, :musician_access => true)
# music_session.connections << connection # music_session.connections << connection
music_session.save music_session.save
connection.join_the_session(music_session, true) connection.join_the_session(music_session, true, nil)
end end
context 'musician stat counters' do context 'musician stat counters' do

View File

@ -80,7 +80,7 @@ describe Recording do
@track2 = FactoryGirl.create(:track, :connection => @connection2, :instrument => @instrument2) @track2 = FactoryGirl.create(:track, :connection => @connection2, :instrument => @instrument2)
# @music_session.connections << @connection2 # @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) @recording = Recording.start(@music_session, @user)
@user.recordings.length.should == 0 @user.recordings.length.should == 0
@ -179,7 +179,7 @@ describe Recording do
@track = FactoryGirl.create(:track, :connection => @connection2, :instrument => @instrument) @track = FactoryGirl.create(:track, :connection => @connection2, :instrument => @instrument)
# @music_session.connections << @connection2 # @music_session.connections << @connection2
@music_session.save @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 = Recording.start(@music_session, @user)
@recording.stop @recording.stop
@recording.reload @recording.reload

View File

@ -157,7 +157,7 @@ describe AudioMixer do
@music_session = FactoryGirl.create(:music_session, :creator => @user, :musician_access => true) @music_session = FactoryGirl.create(:music_session, :creator => @user, :musician_access => true)
# @music_session.connections << @connection # @music_session.connections << @connection
@music_session.save @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 = Recording.start(@music_session, @user)
@recording.stop @recording.stop
@recording.claim(@user, "name", "description", Genre.first, true) @recording.claim(@user, "name", "description", Genre.first, true)

View File

@ -11,7 +11,7 @@ describe ApiClaimedRecordingsController do
@music_session = FactoryGirl.create(:music_session, :creator => @user, :musician_access => true) @music_session = FactoryGirl.create(:music_session, :creator => @user, :musician_access => true)
# @music_session.connections << @connection # @music_session.connections << @connection
@music_session.save @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 = Recording.start(@music_session, @user)
@recording.stop @recording.stop
@recording.reload @recording.reload

View File

@ -65,7 +65,7 @@ describe "social metadata" do
ms = FactoryGirl.create(:music_session, :creator => user, :musician_access => true) ms = FactoryGirl.create(:music_session, :creator => user, :musician_access => true)
# ms.connections << connection # ms.connections << connection
ms.save! ms.save!
connection.join_the_session(ms, true) connection.join_the_session(ms, true, nil)
ms ms
} }
@ -93,7 +93,7 @@ describe "social metadata" do
@music_session = FactoryGirl.create(:music_session, :creator => @user, :musician_access => true) @music_session = FactoryGirl.create(:music_session, :creator => @user, :musician_access => true)
# @music_session.connections << @connection # @music_session.connections << @connection
@music_session.save @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 = Recording.start(@music_session, @user)
@recording.stop @recording.stop
@recording.reload @recording.reload

View File

@ -10,7 +10,7 @@ describe MusicSessionHelper do
@music_session = FactoryGirl.create(:music_session, :creator => @user, :musician_access => true) @music_session = FactoryGirl.create(:music_session, :creator => @user, :musician_access => true)
# @music_session.connections << @connection # @music_session.connections << @connection
@music_session.save @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 = Recording.start(@music_session, @user)
@recording.stop @recording.stop
@recording.reload @recording.reload

View File

@ -700,7 +700,7 @@ describe "Music Session API ", :type => :api do
music_session = FactoryGirl.create(:music_session, :creator => user, :musician_access => true) music_session = FactoryGirl.create(:music_session, :creator => user, :musician_access => true)
# music_session.connections << connection # music_session.connections << connection
music_session.save 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 = Recording.start(music_session, user)
recording.stop recording.stop
recording.reload recording.reload

View File

@ -985,7 +985,7 @@ describe "User API", :type => :api do
ms = FactoryGirl.create(:music_session, :creator => user, :musician_access => true) ms = FactoryGirl.create(:music_session, :creator => user, :musician_access => true)
# ms.connections << connection # ms.connections << connection
ms.save! ms.save!
connection.join_the_session(ms, true) connection.join_the_session(ms, true, nil)
ms } ms }
it "fetches facebook successfully" do 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 = FactoryGirl.create(:music_session, :creator => user, :musician_access => true)
# @music_session.connections << @connection # @music_session.connections << @connection
@music_session.save @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 = Recording.start(@music_session, user)
@recording.stop @recording.stop
@recording.reload @recording.reload