diff --git a/ruby/lib/jam_ruby/models/active_music_session.rb b/ruby/lib/jam_ruby/models/active_music_session.rb index a24595552..f93d0bf70 100644 --- a/ruby/lib/jam_ruby/models/active_music_session.rb +++ b/ruby/lib/jam_ruby/models/active_music_session.rb @@ -693,6 +693,10 @@ module JamRuby description end + def is_lesson_member?(user) + music_session.is_lesson_member?(user) + end + def musician_access music_session.musician_access end diff --git a/ruby/lib/jam_ruby/models/connection.rb b/ruby/lib/jam_ruby/models/connection.rb index 8bd75a4a6..81bbfbc8d 100644 --- a/ruby/lib/jam_ruby/models/connection.rb +++ b/ruby/lib/jam_ruby/models/connection.rb @@ -98,8 +98,6 @@ module JamRuby def can_join_music_session - # puts "can_join_music_session: #{music_session_id} was #{music_session_id_was}" if music_session_id_changed? - if music_session_id_changed? and !(music_session_id_was.nil? or music_session_id_was.blank?) errors.add(:music_session, ValidationMessages::CANT_JOIN_MULTIPLE_SESSIONS) return false @@ -118,13 +116,21 @@ module JamRuby if music_session.musician_access if music_session.approval_required - if !(music_session.music_session.creator == user || music_session.creator == user || music_session.invited_musicians.exists?(user.id)) + if !(music_session.music_session.creator.id == user.id || + music_session.creator.id == user.id || + music_session.invited_musicians.exists?(user.id) || + music_session.is_lesson_member?(user)) errors.add(:approval_required, ValidationMessages::INVITE_REQUIRED) return false end end else - if !(music_session.music_session.creator == user || music_session.creator == user || music_session.invited_musicians.exists?(user.id)) + + if !(music_session.music_session.creator.id == user.id || + music_session.creator.id == user.id || + music_session.invited_musicians.exists?(user.id) || + music_session.is_lesson_member?(user)) + errors.add(:musician_access, ValidationMessages::INVITE_REQUIRED) return false end diff --git a/ruby/lib/jam_ruby/models/music_session.rb b/ruby/lib/jam_ruby/models/music_session.rb index fb4a37d30..119568d18 100644 --- a/ruby/lib/jam_ruby/models/music_session.rb +++ b/ruby/lib/jam_ruby/models/music_session.rb @@ -417,6 +417,11 @@ module JamRuby !!lesson_session end + # checks if this is a lesson and if the person indicated is a teacher or student + def is_lesson_member?(user) + is_lesson? && (lesson_session.teacher.id == user.id || lesson_session.student.id == user.id) + end + def grouped_tracks tracks = [] self.music_session_user_histories.each do |msuh| diff --git a/web/spec/requests/active_music_sessions_api_spec.rb b/web/spec/requests/active_music_sessions_api_spec.rb index d797a3ed3..71afde879 100755 --- a/web/spec/requests/active_music_sessions_api_spec.rb +++ b/web/spec/requests/active_music_sessions_api_spec.rb @@ -544,6 +544,36 @@ describe "Active Music Session API ", :type => :api do music_session["join_requests"][0]["id"].should == join_request["id"] end + it "should allow join of teacher or student" do + client = FactoryGirl.create(:connection, :user => user, :ip_address => "1.1.1.1") + teacher = FactoryGirl.create(:teacher_user) + lesson_session = normal_lesson(user, teacher) + + + music_session = lesson_session.music_session + + music_session.musician_access.should be false + user2 = FactoryGirl.create(:user) + client2 = FactoryGirl.create(:connection, :user => user2, :ip_address => "2.2.2.2") + client3 = FactoryGirl.create(:connection, :user => teacher, :ip_address => "3.3.3.3") + + login(user) + post "/api/sessions/#{music_session["id"]}/participants.json", { :client_id => client.client_id, :as_musician => true, :tracks => [{"instrument_id" => "bass guitar", "sound" => "mono", "client_track_id" => "client_track_guid"}]}.to_json, "CONTENT_TYPE" => 'application/json' + last_response.status.should eql(201) + + + login(user2) + post "/api/sessions/#{music_session["id"]}/participants.json", { :client_id => client2.client_id, :as_musician => true, :tracks => [{"instrument_id" => "bass guitar", "sound" => "mono", "client_track_id" => "client_track_guid"}]}.to_json, "CONTENT_TYPE" => 'application/json' + last_response.status.should eql(422) + rejected_join_attempt = JSON.parse(last_response.body) + rejected_join_attempt["errors"]["musician_access"] = [ValidationMessages::INVITE_REQUIRED] + + login(teacher) + post "/api/sessions/#{music_session["id"]}/participants.json", { :client_id => client3.client_id, :as_musician => true, :tracks => [{"instrument_id" => "bass guitar", "sound" => "mono", "client_track_id" => "client_track_guid"}]}.to_json, "CONTENT_TYPE" => 'application/json' + last_response.status.should eql(201) + + end + it "should now allow join of approval_required=true session" do client = FactoryGirl.create(:connection, :user => user, :ip_address => "1.1.1.1") post '/api/sessions.json', defopts.merge({:approval_required => true}).to_json, "CONTENT_TYPE" => 'application/json'