From 5657bebab8e2aae518224516f5b44d1372fd5930 Mon Sep 17 00:00:00 2001 From: Seth Call Date: Sat, 3 Nov 2012 22:02:11 -0500 Subject: [PATCH] * VRFS-61 and VRFS-34; session.tracks and instrument listing --- lib/jam_ruby.rb | 1 + lib/jam_ruby/message_factory.rb | 6 +++++ lib/jam_ruby/models/connection.rb | 13 ++++++++++ lib/jam_ruby/models/instrument.rb | 2 +- lib/jam_ruby/models/music_session.rb | 29 +--------------------- lib/jam_ruby/models/user.rb | 3 ++- lib/jam_ruby/mq_router.rb | 11 +++++++- spec/jam_ruby/models/music_session_spec.rb | 3 --- 8 files changed, 34 insertions(+), 34 deletions(-) diff --git a/lib/jam_ruby.rb b/lib/jam_ruby.rb index 4cd423c8e..0f0fada36 100644 --- a/lib/jam_ruby.rb +++ b/lib/jam_ruby.rb @@ -19,6 +19,7 @@ require "jam_ruby/models/music_session" require "jam_ruby/models/invitation" require "jam_ruby/models/friend_request" require "jam_ruby/models/instrument" +require "jam_ruby/models/connection_track" require "jam_ruby/models/musician_instrument" require "jam_ruby/models/band_musician" diff --git a/lib/jam_ruby/message_factory.rb b/lib/jam_ruby/message_factory.rb index f7a9eb19a..3fdbc6d30 100644 --- a/lib/jam_ruby/message_factory.rb +++ b/lib/jam_ruby/message_factory.rb @@ -90,6 +90,12 @@ return Jampb::ClientMessage.new(:type => ClientMessage::Type::USER_JOINED_MUSIC_SESSION, :route_to => CLIENT_TARGET, :user_joined_music_session => joined) end + # create a user-joined session message + def user_left_music_session(session_id, user_id, username) + left = Jampb::UserLeftMusicSession.new(:session_id => session_id, :user_id => user_id, :username => username) + return Jampb::ClientMessage.new(:type => ClientMessage::Type::USER_LEFT_MUSIC_SESSION, :route_to => CLIENT_TARGET, :user_left_music_session => left) + end + # create a test message to send in session def test_session_message(session_id, msg) test = Jampb::TestSessionMessage.new(:msg => msg) diff --git a/lib/jam_ruby/models/connection.rb b/lib/jam_ruby/models/connection.rb index 45755df5a..3c3dfe756 100644 --- a/lib/jam_ruby/models/connection.rb +++ b/lib/jam_ruby/models/connection.rb @@ -1,15 +1,28 @@ module JamRuby class Connection < ActiveRecord::Base + SELECT_AT_LEAST_ONE = "Please select at least one track" + self.primary_key = 'id' belongs_to :user, :class_name => "JamRuby::User" belongs_to :music_session, :class_name => "JamRuby::MusicSession" + has_many :connection_tracks, :class_name => "JamRuby::ConnectionTrack", :inverse_of => :connection + + after_save :require_at_least_one_track_when_in_session # decides if a given user can access this client with p2p messaging # the answer is yes if the user is in the same music session def access_p2p?(user) return self.music_session.users.exists?(user) end + + private + def require_at_least_one_track_when_in_session + if connection_tracks.count == 0 + errors.add(:genres, SELECT_AT_LEAST_ONE) + end + end + end end \ No newline at end of file diff --git a/lib/jam_ruby/models/instrument.rb b/lib/jam_ruby/models/instrument.rb index 9119d6a94..4af0dd1ae 100644 --- a/lib/jam_ruby/models/instrument.rb +++ b/lib/jam_ruby/models/instrument.rb @@ -6,9 +6,9 @@ module JamRuby # users has_many :musician_instruments has_many :users, :through => :musician_instruments, :class_name => "JamRuby::User" + has_many :connection_tracks, :class_name => "JamRuby::ConnectionTrack", :inverse_of => :instrument # music sessions has_and_belongs_to_many :music_sessions, :class_name => "JamRuby::MusicSession", :join_table => "genres_music_sessions" - end end \ No newline at end of file diff --git a/lib/jam_ruby/models/music_session.rb b/lib/jam_ruby/models/music_session.rb index b9383f7aa..e5f2ba72d 100644 --- a/lib/jam_ruby/models/music_session.rb +++ b/lib/jam_ruby/models/music_session.rb @@ -14,34 +14,8 @@ module JamRuby after_save :require_at_least_one_genre, :limit_to_three_genres def self.index(current_user) - #SELECT "music_sessions"."id" AS t0_r0, "music_sessions"."description" AS t0_r1, "music_sessions"."user_id" AS t0_r2, "music_sessions"."created_at" AS t0_r3, "music_sessions"."updated_at" AS t0_r4, "music_sessions"."musician_access" AS t0_r5, "invitations"."id" AS t1_r0, "invitations"."sender_id" AS t1_r1, "invitations"."receiver_id" AS t1_r2, "invitations"."music_session_id" AS t1_r3, "invitations"."created_at" AS t1_r4, "invitations"."updated_at" AS t1_r5, "connections"."id" AS t2_r0, "connections"."user_id" AS t2_r1, "connections"."client_id" AS t2_r2, "connections"."created_at" AS t2_r3, "connections"."updated_at" AS t2_r4, "connections"."music_session_id" AS t2_r5, "connections"."ip_address" AS t2_r6, "users"."id" AS t3_r0, "users"."name" AS t3_r1, "users"."email" AS t3_r2, "users"."remember_token" AS t3_r3, "users"."password_digest" AS t3_r4, "users"."admin" AS t3_r5, "users"."created_at" AS t3_r6, "users"."updated_at" AS t3_r7, "friendships"."id" AS t4_r0, "friendships"."user_id" AS t4_r1, "friendships"."friend_id" AS t4_r2, "friendships"."created_at" AS t4_r3, "friendships"."updated_at" AS t4_r4 FROM "music_sessions" LEFT OUTER JOIN "invitations" ON "invitations"."music_session_id" = "music_sessions"."id" LEFT OUTER JOIN "connections" ON "connections"."music_session_id" = "music_sessions"."id" LEFT OUTER JOIN "users" ON "users"."id" = "connections"."user_id" LEFT OUTER JOIN "friendships" ON "friendships"."user_id" = "users"."id" WHERE (musician_access = true OR invitations.receiver_id = '1' OR friendships.friend_id = '1') ORDER BY (invitations.id is NULL) ASC, (friendships.id is NULL) ASC, music_sessions.created_at DESC - 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") - #.select(["music_sessions.*", "(friendships.friend_id is not NULL) as is_friend"]) - #select(["music_sessions.*", "distinct(music_sessions.id)"]) - #return MusicSession.joins("LEFT OUTER JOIN invitations ON invitations.music_session_id = music_sessions.id LEFT OUTER JOIN connections ON connections.music_session_id = music_sessions.id LEFT OUTER JOIN users ON users.id = connections.user_id LEFT OUTER JOIN friendships ON friendships.user_id = users.id").order('(invitations.id is NULL) ASC, (friendships.id is NULL) ASC, music_sessions.created_at DESC').where("musician_access = true OR invitations.receiver_id = '#{current_user.id}' OR friendships.friend_id = '#{current_user.id}'") - end - - def list(musician_access, invited, friends, page) - - query = MusicSession - - unless musician_access - query = query.unscoped - end - - query = query.joins('LEFT OUTER JOIN connections ON music_sessions.id = connections.music_session_id') - - if invited - query = query.joins("LEFT OUTER JOIN invitations ON invitations.receiver_id = ") - end - - if friends - query = query.unscoped.joins("LEFT OUTER JOIN friendships ON friend_id.receiver_id = '" + current_user.id + "'") - end - - return query.paginate(page: page) - end + end # Verifies that the specified user can join this music session def can_join? user @@ -69,7 +43,6 @@ module JamRuby return self.creator == user end - def access? user return self.users.exists? user end diff --git a/lib/jam_ruby/models/user.rb b/lib/jam_ruby/models/user.rb index 17577ca69..5a2d1b465 100644 --- a/lib/jam_ruby/models/user.rb +++ b/lib/jam_ruby/models/user.rb @@ -28,6 +28,7 @@ module JamRuby has_many :created_music_sessions, :foreign_key => "user_id", :inverse_of => :user, :class_name => "JamRuby::MusicSession" # sessions *created* by the user has_many :music_sessions, :through => :connections, :class_name => "JamRuby::MusicSession" + # invitations has_many :received_invitations, :foreign_key => "receiver_id", :inverse_of => :receiver, :class_name => "JamRuby::Invitation" has_many :sent_invitations, :foreign_key => "sender_id", :inverse_of => :sender, :class_name => "JamRuby::Invitation" @@ -91,6 +92,6 @@ module JamRuby private def create_remember_token self.remember_token = SecureRandom.urlsafe_base64 - end + end end end diff --git a/lib/jam_ruby/mq_router.rb b/lib/jam_ruby/mq_router.rb index 722d1e0e4..cc0200866 100644 --- a/lib/jam_ruby/mq_router.rb +++ b/lib/jam_ruby/mq_router.rb @@ -19,7 +19,7 @@ class MQRouter end if !music_session.access? user - raise PermissionError, 'not allowed to access the specified session' + raise PermissionError, 'not allowed to join the specified session' end return music_session @@ -37,6 +37,15 @@ class MQRouter publish_to_session(music_session.id, client_ids, client_msg.to_s, sender) end + # sends a message to a session from the server + # no access check as with user_publish_to_session + # client_msg should be a well-structure message (jam-pb message) + def server_publish_to_session(music_session, client_msg, sender = {:client_id => ""}) + # gather up client_ids in the session + client_ids = music_session.connections.map { |client| client.client_id }.reject { |client_id| client_id == sender[:client_id] } + + publish_to_session(music_session.id, client_ids, client_msg.to_s, sender) + end # sends a message to a client with no checking of permissions (RAW USAGE) # this method deliberately has no database interactivity/active_record objects diff --git a/spec/jam_ruby/models/music_session_spec.rb b/spec/jam_ruby/models/music_session_spec.rb index b56248f17..e0195e16e 100644 --- a/spec/jam_ruby/models/music_session_spec.rb +++ b/spec/jam_ruby/models/music_session_spec.rb @@ -149,9 +149,6 @@ describe MusicSession do music_session4.save music_sessions = MusicSession.index(user2) - music_sessions.each do |s| - p s - end music_sessions.length.should == 4 music_sessions[0].id.should == music_session.id music_sessions[1].id.should == music_session3.id