* VRFS-100; as_musician almost done

This commit is contained in:
Seth Call 2012-11-17 20:59:59 -06:00
parent 35f5c13283
commit 7b32358afa
5 changed files with 67 additions and 13 deletions

View File

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

View File

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

View File

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

View File

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

View File

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