diff --git a/ruby/lib/jam_ruby/models/active_music_session.rb b/ruby/lib/jam_ruby/models/active_music_session.rb index 57449ec49..838606798 100644 --- a/ruby/lib/jam_ruby/models/active_music_session.rb +++ b/ruby/lib/jam_ruby/models/active_music_session.rb @@ -330,7 +330,7 @@ module JamRuby my_audio_latency = connection.last_jam_audio_latency query = MusicSession - .select('music_sessions.*') + .select('music_sessions.*') # TODO this is not really needed when ams_music_session_tmp is joined # unless there is something specific we need out of active_music_sessions @@ -358,7 +358,12 @@ module JamRuby query = query.order( %Q{ - tag, latency + tag, latency, music_sessions.id + } + ) + .group( + %Q{ + tag, latency, music_sessions.id } ) diff --git a/ruby/spec/jam_ruby/models/active_music_session_spec.rb b/ruby/spec/jam_ruby/models/active_music_session_spec.rb index 4f2a1122a..4e838add1 100644 --- a/ruby/spec/jam_ruby/models/active_music_session_spec.rb +++ b/ruby/spec/jam_ruby/models/active_music_session_spec.rb @@ -332,6 +332,36 @@ describe ActiveMusicSession do end end + describe "ams_index" do + it "does not crash" do + + creator = FactoryGirl.create(:user) + creator2 = FactoryGirl.create(:user) + + earlier_session = FactoryGirl.create(:active_music_session, :creator => creator, :description => "Earlier Session") + c1 = FactoryGirl.create(:connection, user: creator, music_session: earlier_session, addr: 0x01020304, locidispid: 1) + + later_session = FactoryGirl.create(:active_music_session, :creator => creator2, :description => "Later Session") + c2 = FactoryGirl.create(:connection, user: creator2, music_session: later_session, addr: 0x21020304, locidispid: 2) + + user = FactoryGirl.create(:user) + c3 = FactoryGirl.create(:connection, user: user, locidispid: 3) + + Score.createx(c1.locidispid, c1.client_id, c1.addr, c3.locidispid, c3.client_id, c3.addr, 20, nil); + Score.createx(c2.locidispid, c2.client_id, c2.addr, c3.locidispid, c3.client_id, c3.addr, 30, nil); + + music_sessions = ActiveMusicSession.ams_index(user, client_id: c3.client_id).take(100) + music_sessions.should_not be_nil + music_sessions.length.should == 2 + end + + # todo we need more tests: + # rsvp'd user (chosen and not chosen) + # invited user + # creator (who should be automatically rsvp'd) + # musician_access and not + end + it 'uninvited users cant join approval-required sessions without invitation' do user1 = FactoryGirl.create(:user) # in the jam session diff --git a/web/app/controllers/api_music_sessions_controller.rb b/web/app/controllers/api_music_sessions_controller.rb index 07722f646..5ee8dbd85 100644 --- a/web/app/controllers/api_music_sessions_controller.rb +++ b/web/app/controllers/api_music_sessions_controller.rb @@ -60,6 +60,21 @@ class ApiMusicSessionsController < ApiController limit: params[:limit]) end + def ams_index + # returns a relation which will produce a list of music_sessions which are active and augmented with attributes + # tag and latency, then sorted by tag, latency, and finally music_sessions.id (for stability). the list is + # filtered by genre, lang, and keyword, then paged by offset and limit (those are record numbers not page numbers). + # tag is 1 for chosen rsvp'd sessions, 2 for invited sessions, 3 for all others (musician_access). if you're the + # creator of a session it will be treated the same as if you had rsvp'd and been accepted. + @music_sessions = ActiveMusicSession.ams_index(current_user, + client_id: params[:client_id], + genre: params[:genre], + lang: params[:lang], + keyword: params[:keyword], + offset: params[:offset], + limit: params[:limit]) + end + def scheduled @music_sessions = MusicSession.scheduled(current_user) end