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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

View File

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