* VRFS-1858 use open_rsvp instead of music_access for scheduled session

This commit is contained in:
Seth Call 2014-07-04 08:26:46 -05:00
parent 9cb702f9de
commit b96cc32d3c
6 changed files with 93 additions and 6 deletions

View File

@ -183,4 +183,5 @@ add_file_name_music_notation.sql
change_scheduled_start_music_session.sql
music_sessions_iso_639_3.sql
discardable_claimed_recordings.sql
fix_null_scheduled_start.sql
fix_null_scheduled_start.sql
fix_use_open_rsvp.sql

View File

@ -0,0 +1,70 @@
-- my_audio_latency can have a special value of -1, which means 'unknown'.
CREATE OR REPLACE FUNCTION sms_index (my_user_id VARCHAR, my_locidispid BIGINT, my_audio_latency INTEGER) RETURNS VOID STRICT VOLATILE AS $$
BEGIN
-- output table to hold tagged music sessions with latency
CREATE TEMPORARY TABLE sms_music_session_tmp (music_session_id VARCHAR(64) NOT NULL, tag INTEGER, latency INTEGER) ON COMMIT DROP;
-- populate sms_music_session_tmp as all music sessions
-- XXX: we should pass in enough info to match pagination/query to reduce the impact of this step
INSERT INTO sms_music_session_tmp SELECT DISTINCT id, NULL::INTEGER AS tag, NULL::INTEGER AS latency
FROM music_sessions where scheduled_start IS NULL OR scheduled_start > (NOW() - (interval '15 minute'));
-- tag accepted rsvp as 1
UPDATE sms_music_session_tmp q SET tag = 1 FROM rsvp_slots s, rsvp_requests_rsvp_slots rrs, rsvp_requests r WHERE
q.music_session_id = s.music_session_id AND
s.id = rrs.rsvp_slot_id AND
rrs.rsvp_request_id = r.id AND
r.user_id = my_user_id AND
rrs.chosen = TRUE AND
q.tag is NULL;
-- tag invitation as 2
UPDATE sms_music_session_tmp q SET tag = 2 FROM invitations i WHERE
q.music_session_id = i.music_session_id AND
i.receiver_id = my_user_id AND
q.tag IS NULL;
-- musician access as 3
UPDATE sms_music_session_tmp q SET tag = 3 FROM music_sessions m WHERE
q.music_session_id = m.id AND
m.open_rsvps = TRUE AND
q.tag IS NULL;
-- delete anything not tagged
DELETE FROM sms_music_session_tmp WHERE tag IS NULL;
-- output table to hold users involved in the sms_music_session_tmp sessions and their latency
CREATE TEMPORARY TABLE sms_users_tmp (music_session_id VARCHAR(64), user_id VARCHAR(64) NOT NULL, latency INTEGER) ON COMMIT DROP;
IF my_audio_latency > -1 THEN
-- populate sms_users_tmp with users that have an approved RSVP for sessions in the sms_music_session_tmp table, accompanied with full latency and music session
INSERT INTO sms_users_tmp SELECT q.music_session_id, users.id, (s.score+my_audio_latency+users.last_jam_audio_latency)/2 AS latency
FROM sms_music_session_tmp q
INNER JOIN rsvp_slots ON rsvp_slots.music_session_id = q.music_session_id
INNER JOIN rsvp_requests_rsvp_slots ON rsvp_requests_rsvp_slots.rsvp_slot_id = rsvp_slots.id
INNER JOIN rsvp_requests ON rsvp_requests.id = rsvp_requests_rsvp_slots.rsvp_request_id
INNER JOIN users ON rsvp_requests.user_id = users.id
LEFT OUTER JOIN current_scores s ON s.alocidispid = users.last_jam_locidispid
WHERE
s.blocidispid = my_locidispid AND
rsvp_requests_rsvp_slots.chosen = TRUE;
-- populate sms_users_tmp with invited users for session in the sms_music_session_tmp table, accompanied with full latency and music session
-- specify NULL for music_session_id, because we don't want RSVP users to affect the AVG computed for each session later
INSERT INTO sms_users_tmp SELECT NULL, users.id, (s.score+my_audio_latency+users.last_jam_audio_latency)/2 AS latency
FROM sms_music_session_tmp q
INNER JOIN invitations ON invitations.music_session_id = q.music_session_id
INNER JOIN users ON invitations.receiver_id = users.id
LEFT OUTER JOIN current_scores s ON s.alocidispid = users.last_jam_locidispid
WHERE
s.blocidispid = my_locidispid AND
users.id NOT IN (SELECT user_id FROM sms_users_tmp);
END IF;
-- calculate the average latency
UPDATE sms_music_session_tmp q SET latency = (select AVG(u.latency) FROM sms_users_tmp u WHERE
q.music_session_id = u.music_session_id);
RETURN;
END;
$$ LANGUAGE plpgsql;

View File

@ -94,7 +94,7 @@ FactoryGirl.define do
recurring_mode 'once'
genre JamRuby::Genre.first
association :creator, :factory => :user
open_rsvps false
open_rsvps true
scheduled_start Time.now
factory :recurring_music_session_weekly do

View File

@ -264,6 +264,20 @@ describe MusicSession do
user_scores.length.should == 0
end
it "one session shows/hides based on open_rsvps" do
creator.last_jam_locidispid = conn.locidispid
creator.save!
music_session = FactoryGirl.create(:music_session, creator: creator, scheduled_start: nil)
music_sessions, user_scores = sms(searcher, default_opts)
music_sessions.length.should == 1
music_session.open_rsvps = false
music_session.save!
music_sessions, user_scores = sms(searcher, default_opts)
music_sessions.length.should == 0
end
it "one session with no scheduled_start time" do
creator.last_jam_locidispid = conn.locidispid
creator.save!
@ -407,19 +421,19 @@ describe MusicSession do
user_scores[creator_1.id][:latency].should == (bad_network_score + searcher_1.last_jam_audio_latency + creator_1.last_jam_audio_latency ) / 2
# let's make music_session_3 invisible, and verify the count goes to 2
music_session_3.musician_access = false
music_session_3.open_rsvps = false
music_session_3.save!
music_sessions, user_scores = sms(searcher_1, {client_id: searcher_conn_1.client_id})
music_sessions.length.should == 2
# let's make music_session_2 invisible, but still the count should be the same (because searcher_1 have an invite)
music_session_2.musician_access = false
music_session_2.open_rsvps = false
music_session_2.save!
music_sessions, user_scores = sms(searcher_1, {client_id: searcher_conn_1.client_id})
music_sessions.length.should == 2
# and lastly with music_session_1, make it invisible, and still it should be visible to the searcher (because searcher_1 has an invite)
music_session_1.musician_access = false
music_session_1.open_rsvps = false
music_session_1.save!
music_sessions, user_scores = sms(searcher_1, {client_id: searcher_conn_1.client_id})
music_sessions.length.should == 2

View File

@ -102,6 +102,8 @@ describe RsvpRequest do
end
it "should not allow non-invitee to RSVP to session with closed RSVPs" do
@music_session.open_rsvps = false
@music_session.save!
expect {RsvpRequest.create({:session_id => @music_session.id, :rsvp_slots => [@slot1.id, @slot2.id]}, @non_session_invitee)}.to raise_error(JamRuby::PermissionError)
end

View File

@ -111,7 +111,7 @@ FactoryGirl.define do
legal_policy 'Standard'
genre JamRuby::Genre.first
association :creator, :factory => :user
open_rsvps false
open_rsvps true
scheduled_start Time.now
recurring_mode 'once'
scheduled_duration "30 minutes"