* VRFS-61 and VRFS-34; session.tracks and instrument listing

This commit is contained in:
Seth Call 2012-11-03 22:02:11 -05:00
parent be39434e1c
commit 5657bebab8
8 changed files with 34 additions and 34 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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