From 7b32358afa88120cec133e4c96fae9c3c256713f Mon Sep 17 00:00:00 2001 From: Seth Call Date: Sat, 17 Nov 2012 20:59:59 -0600 Subject: [PATCH] * VRFS-100; as_musician almost done --- lib/jam_ruby/connection_manager.rb | 18 ++++++-- lib/jam_ruby/errors/jam_argument_error.rb | 2 +- lib/jam_ruby/models/music_session.rb | 1 + lib/jam_ruby/models/user.rb | 4 ++ spec/jam_ruby/connection_manager_spec.rb | 55 +++++++++++++++++++---- 5 files changed, 67 insertions(+), 13 deletions(-) diff --git a/lib/jam_ruby/connection_manager.rb b/lib/jam_ruby/connection_manager.rb index 0ba6111e3..4603d6d72 100644 --- a/lib/jam_ruby/connection_manager.rb +++ b/lib/jam_ruby/connection_manager.rb @@ -157,23 +157,33 @@ module JamRuby end end - def join_music_session(user_id, client_id, music_session_id) + def join_music_session(user_id, client_id, music_session_id, as_musician) conn = @pg_conn lock_connections(conn) previous_music_session_id = check_already_session(conn, client_id) + user = User.find(user_id) + + if as_musician != true && as_musician != false # checks that a boolean was passed in + raise JamArgumentError, "as_musician incorrectly specified" + end + + if as_musician && !user.musician + raise PermissionError, "a fan can not join a music session as a musician" + end + # determine if the user can join; if not, throw a PermissionError music_session = MusicSession.find(music_session_id) - unless music_session.can_join?(User.find(user_id)) + unless music_session.can_join?(user, as_musician) @log.debug "user can not join a session user_id=#{user_id} and client_id=#{client_id}" raise PermissionError, "unable to join the specified session" end begin # we include user_id in the query as an act o security, so that a user can't access someone else' client connection - conn.exec("UPDATE connections SET music_session_id = $1 WHERE client_id = $2 and user_id = $3", [music_session_id, client_id, user_id]) do |result| + conn.exec("UPDATE connections SET music_session_id = $1, as_musician = $2 WHERE client_id = $3 and user_id = $4", [music_session_id, as_musician, client_id, user_id]) do |result| if result.cmd_tuples == 1 @log.debug "associated music_session with connection for client=#{client_id}, music_session=#{music_session_id}, and user=#{user_id}" @@ -215,7 +225,7 @@ module JamRuby end # can throw exception if the session is deleted just before this - conn.exec("UPDATE connections SET music_session_id = NULL WHERE client_id = $1 AND user_id =$2", [client_id, user_id]) do |result| + conn.exec("UPDATE connections SET music_session_id = NULL, as_musician = NULL WHERE client_id = $1 AND user_id =$2", [client_id, user_id]) do |result| if result.cmd_tuples == 1 @log.debug("deassociated music_session with connection for client_id=#{client_id}, user_id=#{user_id}") diff --git a/lib/jam_ruby/errors/jam_argument_error.rb b/lib/jam_ruby/errors/jam_argument_error.rb index 9f208363b..8d9edb7df 100644 --- a/lib/jam_ruby/errors/jam_argument_error.rb +++ b/lib/jam_ruby/errors/jam_argument_error.rb @@ -1,6 +1,6 @@ module JamRuby # if a bad argument is supplied. - # Why not use the default one? This allows us to know our API layer threw this, versus us using some core library incorrectly + # Why not use the default ruby argument error? Using this one allows us to know our API layer threw this, versus us using some core library incorrectly class JamArgumentError < ArgumentError end diff --git a/lib/jam_ruby/models/music_session.rb b/lib/jam_ruby/models/music_session.rb index 1fa5652f0..e8fd7d2bf 100644 --- a/lib/jam_ruby/models/music_session.rb +++ b/lib/jam_ruby/models/music_session.rb @@ -22,6 +22,7 @@ module JamRuby validates :fan_access, :inclusion => {:in => [true, false]} validates :approval_required, :inclusion => {:in => [true, false]} validates :musician_access, :inclusion => {:in => [true, false]} + validates :creator, :presence => true, :if => "creator.musician?" def self.index(current_user) return MusicSession.includes(:invitations, :connections => [:user => [:friendships]]).order("(invitations.id is NULL) ASC, (friendships.friend_id != '#{current_user.id}' OR friendships.friend_id is NULL) ASC, music_sessions.created_at DESC").where("invitations.receiver_id = '#{current_user.id}' OR (friendships.friend_id = '#{current_user.id}') OR musician_access = true") diff --git a/lib/jam_ruby/models/user.rb b/lib/jam_ruby/models/user.rb index b87ce35e8..5b9c65962 100644 --- a/lib/jam_ruby/models/user.rb +++ b/lib/jam_ruby/models/user.rb @@ -88,6 +88,10 @@ module JamRuby @photo_url = "http://www.jamkazam.com/images/users/photos/#{self.id}.gif"; end + def name + return "#{first_name} #{last_name}" + end + def location # TODO: implement a single string version of location; # this will be indexed into elasticsearch and returned in search diff --git a/spec/jam_ruby/connection_manager_spec.rb b/spec/jam_ruby/connection_manager_spec.rb index 4ade9d6e8..ba71b0b5f 100644 --- a/spec/jam_ruby/connection_manager_spec.rb +++ b/spec/jam_ruby/connection_manager_spec.rb @@ -10,8 +10,8 @@ describe ConnectionManager do @message_factory = MessageFactory.new end - def create_user(first_name, last_name, email) - @conn.exec("INSERT INTO users (first_name, last_name, email, password_digest) VALUES ($1, $2, $3, $4) RETURNING id", [first_name, last_name, email, '1']) do |result| + def create_user(first_name, last_name, email, options = {:musician => true}) + @conn.exec("INSERT INTO users (first_name, last_name, email, musician, password_digest) VALUES ($1, $2, $3, $4, $5) RETURNING id", [first_name, last_name, email, options[:musician], '1']) do |result| return result.getvalue(0, 0) end end @@ -223,7 +223,7 @@ describe ConnectionManager do @conn.transaction do @connman.create_connection(user_id, client_id, "1.1.1.1") - @connman.join_music_session(user_id, client_id, music_session_id) + @connman.join_music_session(user_id, client_id, music_session_id, true) end assert_session_exists(music_session_id, true) @@ -247,7 +247,46 @@ describe ConnectionManager do music_session_id = create_music_session(user_id) @conn.transaction do - expect { @connman.join_music_session(user_id, client_id, music_session_id) }.to raise_error(ActiveRecord::RecordNotFound) + expect { @connman.join_music_session(user_id, client_id, music_session_id, true) }.to raise_error(ActiveRecord::RecordNotFound) + end + + end + + it "join_music_session fails if user is a fan but wants to join as a musician" do + + client_id = "client_id10.1" + user_id = create_user("test", "user10.1", "user10.1@jamkazam.com", :musician => false) + + music_session_id = create_music_session(user_id) + + @conn.transaction do + expect { @connman.join_music_session(user_id, client_id, music_session_id, true) }.to raise_error(JamRuby::PermissionError) + end + + end + + it "join_music_session fails if invalid value for as_musician specified" do + + client_id = "client_id10.2" + user_id = create_user("test", "user10.2", "user10.2@jamkazam.com", :musician => false) + + music_session_id = create_music_session(user_id) + + @conn.transaction do + expect { @connman.join_music_session(user_id, client_id, music_session_id, 'blarg') }.to raise_error(JamRuby::JamArgumentError) + end + + end + + it "join_music_session fails if fan_access=true and the user is a fan" do + + client_id = "client_id10.2" + user_id = create_user("test", "user10.2", "user10.2@jamkazam.com", :musician => false) + + music_session_id = create_music_session(user_id, :fan_access => false) + + @conn.transaction do + expect { @connman.join_music_session(user_id, client_id, music_session_id, 'blarg') }.to raise_error(JamRuby::PermissionError) end end @@ -262,7 +301,7 @@ describe ConnectionManager do @conn.transaction do @connman.create_connection(user_id, client_id, "1.1.1.1") # specify real user id, but not associated with this session - expect { @connman.join_music_session(user_id2, client_id, music_session_id) } .to raise_error(ActiveRecord::RecordNotFound) + expect { @connman.join_music_session(user_id2, client_id, music_session_id, true) } .to raise_error(ActiveRecord::RecordNotFound) end end @@ -276,7 +315,7 @@ describe ConnectionManager do end @conn.transaction do - expect { @connman.join_music_session(user_id, client_id, "some_bogus_music_session_id") }.to raise_error(ActiveRecord::RecordNotFound) + expect { @connman.join_music_session(user_id, client_id, "some_bogus_music_session_id", true) }.to raise_error(ActiveRecord::RecordNotFound) end end @@ -306,7 +345,7 @@ describe ConnectionManager do end @conn.transaction do - @connman.join_music_session(user_id, client_id, music_session_id) + @connman.join_music_session(user_id, client_id, music_session_id, true) end @conn.transaction do @@ -326,7 +365,7 @@ describe ConnectionManager do end @conn.transaction do - @connman.join_music_session(user_id, client_id, music_session_id) + @connman.join_music_session(user_id, client_id, music_session_id, true) end assert_session_exists(music_session_id, true)