* VRFS-1684 - adding latency to participants and approved_rsvps JSON response.

This commit is contained in:
Seth Call 2014-06-16 15:41:37 -05:00
parent 839605255d
commit f680fafaf3
9 changed files with 127 additions and 11 deletions

View File

@ -320,7 +320,7 @@ module JamRuby
connection = Connection.where(user_id: current_user.id, client_id: client_id).first!
my_locidispid = connection.locidispid
my_audio_latency = connection.last_jam_audio_latency
my_audio_latency = connection.last_jam_audio_latency || 0 # we can't assume that the user has an audio_latency when searching
self.connection.execute("select ams_index('#{current_user.id}'::varchar, #{my_locidispid}::bigint, #{my_audio_latency}::integer)");
end
@ -407,6 +407,7 @@ module JamRuby
# returns the set of users in a music_sessions and the music_session they are in and their latency.
# ams_init must be called first.
# user.audio_latency / 2 , + other_user.audio_latency of them / 2, + network latency /2
def self.ams_users()
return User.select('users.*, ams_users_tmp.music_session_id, ams_users_tmp.latency')
.joins(

View File

@ -169,10 +169,6 @@ module JamRuby
end
def associate_tracks(tracks)
# @log.debug "Tracks:"
# @log.debug tracks
unless tracks.nil?
self.tracks.clear()
tracks.each do |track|

View File

@ -83,7 +83,14 @@ class ApiMusicSessionsController < ApiController
offset: params[:offset],
limit: params[:limit]).all
@music_session_users = ActiveMusicSession.ams_users().all
music_session_users = ActiveMusicSession.ams_users.all
@user_scores = {}
music_session_users.each do |user|
@user_scores[user.id] = {latency: user.latency}
end
render "api_music_sessions/ams_index"
end
end

View File

@ -0,0 +1,9 @@
module ScoreHelper
# helper method to make finding a user's score fault-tolerant
def user_score(user_id)
@user_scores ||= {}
user = @user_scores[user_id]
user ? user[:latency] : nil
end
end

View File

@ -0,0 +1,3 @@
object @music_sessions
extends "api_music_sessions/show_history"

View File

@ -74,6 +74,15 @@ else
attributes :id, :sender_id, :receiver_id
}
child({:approved_rsvps => :approved_rsvps}) {
attributes :id, :photo_url, :first_name, :last_name, :instrument_id
node do |user|
{ latency: user_score(user.id) }
end
}
child(:active_music_session => :active_music_session) {
attributes :claimed_recording_initiator_id, :track_changes_counter
@ -99,7 +108,7 @@ else
attributes :ip_address, :client_id, :joined_session_at
node :user do |connection|
{ :id => connection.user.id, :photo_url => connection.user.photo_url, :name => connection.user.name, :is_friend => connection.user.friends?(current_user), :connection_state => connection.aasm_state }
{ :id => connection.user.id, :photo_url => connection.user.photo_url, :name => connection.user.name, :is_friend => connection.user.friends?(current_user), :connection_state => connection.aasm_state, latency: user_score(connection.user.id) }
end
child(:tracks => :tracks) {
@ -107,8 +116,6 @@ else
}
}
# only show join_requests if the current_user is in the session
node(:join_requests, :if => lambda { |music_session| music_session.users.exists?(current_user) } ) do |music_session|
child(:join_requests => :join_requests) {

View File

@ -153,6 +153,7 @@ SampleApp::Application.routes.draw do
match '/participants/:id' => 'api_music_sessions#participant_delete', :via => :delete
match '/sessions/scheduled' => 'api_music_sessions#scheduled', :via => :get
match '/sessions/legacy' => 'api_music_sessions#create_legacy', :via => :post
match '/sessions/active' => 'api_music_sessions#ams_index', :via => :get
match '/sessions/:id' => 'api_music_sessions#show', :via => :get, :as => 'api_session_detail'
match '/sessions/:id' => 'api_music_sessions#update', :via => :put
match '/sessions/:id' => 'api_music_sessions#session_update', :via => :post
@ -166,7 +167,7 @@ SampleApp::Application.routes.draw do
match '/sessions/:id/history' => 'api_music_sessions#show_history', :via => :get, :as => 'api_session_history_detail'
match '/sessions/:id/details/comments' => 'api_music_sessions#add_session_info_comment', :via => :post
# music session tracks
match '/sessions/:id/tracks' => 'api_music_sessions#track_create', :via => :post
match '/sessions/:id/tracks' => 'api_music_sessions#track_sync', :via => :put

View File

@ -0,0 +1,87 @@
require 'spec_helper'
describe ApiMusicSessionsController do
render_views
let(:tracks) { [{'sound' => 'mono', 'client_track_id' => 'abc', 'instrument_id' => 'piano'}] }
let(:user) { FactoryGirl.create(:user) }
let (:conn) { FactoryGirl.create(:connection, :user => user) }
let(:other) { FactoryGirl.create(:user) }
let (:other_conn) { FactoryGirl.create(:connection, user: other, ip_address: '2.2.2.2') }
let(:third_user) { FactoryGirl.create(:user) }
before(:each) do
controller.current_user = user
ActiveMusicSession.delete_all
MusicSession.delete_all
end
describe "ams_index" do
it "no results" do
get :ams_index, {client_id: conn.client_id}
response.should be_success
json = JSON.parse(response.body, :symbolize_names => true)
json.length.should == 0
end
it "just self" do
# create a session with self in it
ams = FactoryGirl.create(:active_music_session, creator: user)
conn.join_the_session(ams.music_session, true, tracks, user, 10)
conn.errors.any?.should be_false
get :ams_index, {client_id: conn.client_id}
json = JSON.parse(response.body, :symbolize_names => true)
json.length.should == 1
json[0][:active_music_session][:participants][0][:user][:latency].should be_nil
end
it "someone else with no score with self" do
# create a session with someone else in it, but no score
ams = FactoryGirl.create(:active_music_session, creator: other)
other_conn.join_the_session(ams.music_session, true, tracks, user, 10)
other_conn.errors.any?.should be_false
get :ams_index, {client_id: conn.client_id}
json = JSON.parse(response.body, :symbolize_names => true)
json.length.should == 1
json[0][:active_music_session][:participants][0][:user][:latency].should be_nil
end
it "someone else with a score with a self" do
# create a session with someone else in it, but no score
ams = FactoryGirl.create(:active_music_session, creator: other)
other_conn.join_the_session(ams.music_session, true, tracks, other, 10)
other_conn.errors.any?.should be_false
Score.createx(conn.locidispid, conn.client_id, conn.addr, other_conn.locidispid, other_conn.client_id, other_conn.addr, 20, nil)
get :ams_index, {client_id: conn.client_id}
json = JSON.parse(response.body, :symbolize_names => true)
json.length.should == 1
json[0][:active_music_session][:participants][0][:user][:latency].should == 17.5
end
it "someone else with a score with a self, and another with an approved RSVP" do
# create a session with someone else in it, but no score
ams = FactoryGirl.create(:active_music_session, creator: other)
other_conn.join_the_session(ams.music_session, true, tracks, other, 10)
other_conn.errors.any?.should be_false
Score.createx(conn.locidispid, conn.client_id, conn.addr, other_conn.locidispid, other_conn.client_id, other_conn.addr, 20, nil)
rsvp_slot = FactoryGirl.create(:rsvp_slot, music_session: ams.music_session, instrument: Instrument.find('piano'))
rsvp_request = FactoryGirl.create(:rsvp_request, user: third_user)
rsvp_request_rsvp_slot = FactoryGirl.create(:rsvp_request_rsvp_slot, chosen:true, rsvp_request: rsvp_request, rsvp_slot:rsvp_slot)
get :ams_index, {client_id: conn.client_id}
json = JSON.parse(response.body, :symbolize_names => true)
json.length.should == 1
json[0][:active_music_session][:participants][0][:user][:latency].should_not be_nil
json[0][:approved_rsvps][0][:id].should == third_user.id
json[0][:approved_rsvps][0][:latency].should == 17.5
end
end
end

View File

@ -15,6 +15,7 @@ FactoryGirl.define do
country "US"
terms_of_service true
subscribe_email true
last_jam_audio_latency 5
factory :fan do
musician false
@ -132,7 +133,7 @@ FactoryGirl.define do
sequence(:client_id) { |n| "client_id#{n}"}
ip_address "1.1.1.1"
as_musician true
addr 0
addr {JamIsp.ip_to_num(ip_address)}
locidispid 0
client_type 'client'
end
@ -483,6 +484,10 @@ FactoryGirl.define do
cancel_all false
end
factory :rsvp_request_rsvp_slot, class: JamRuby::RsvpRequestRsvpSlot do
chosen false
end
factory :diagnostic, :class => JamRuby::Diagnostic do
type JamRuby::Diagnostic::NO_HEARTBEAT_ACK
creator JamRuby::Diagnostic::CLIENT