From 6aaddbbe50a752d1f387332008e9a3d57de6f457 Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Tue, 29 Jul 2014 20:29:41 -0400 Subject: [PATCH 01/12] VRFS-1478 allow multiple session invites to same user --- db/manifest | 3 +- db/up/drop_session_invite_constraint.sql | 1 + web/app/assets/javascripts/inviteMusicians.js | 39 +++++++++---------- .../views/clients/_inviteMusicians.html.erb | 2 +- 4 files changed, 23 insertions(+), 22 deletions(-) create mode 100644 db/up/drop_session_invite_constraint.sql diff --git a/db/manifest b/db/manifest index e23c3243d..0d099803a 100755 --- a/db/manifest +++ b/db/manifest @@ -197,4 +197,5 @@ update_sms_index.sql connection_allow_null_locidispid.sql track_user_in_scores.sql median_aggregate.sql -current_scores_use_median.sql \ No newline at end of file +current_scores_use_median.sql +drop_session_invite_constraint.sql \ No newline at end of file diff --git a/db/up/drop_session_invite_constraint.sql b/db/up/drop_session_invite_constraint.sql new file mode 100644 index 000000000..a49ea7878 --- /dev/null +++ b/db/up/drop_session_invite_constraint.sql @@ -0,0 +1 @@ +ALTER TABLE invitations DROP CONSTRAINT invitations_uniqkey; \ No newline at end of file diff --git a/web/app/assets/javascripts/inviteMusicians.js b/web/app/assets/javascripts/inviteMusicians.js index 60d60b067..09950376c 100644 --- a/web/app/assets/javascripts/inviteMusicians.js +++ b/web/app/assets/javascripts/inviteMusicians.js @@ -45,10 +45,12 @@ if (0 == $(elemSelector + ' .friendbox').length) { _appendFriendSelector($(elemSelector)); - $('#btn-save-invites').click(function() { - createInvitations(updateSessionID); - }); } + + $('#btn-save-invites').click(function() { + createInvitations(updateSessionID); + }); + $.ajax({ url: "/api/invitations", data: { session_id: sessionId, sender: context.JK.currentUserId } @@ -126,8 +128,7 @@ var imgStyle = _inviteExists(data) ? 'display:none' : ''; var invitationHtml = context.JK.fillTemplate(template, {userId: data, - userName: value, - imageStyle: imgStyle}); + userName: value}); $('.selected-friends').append(invitationHtml); $(friendInput).select(); invitedFriends.push(data); @@ -162,22 +163,20 @@ function createInvitations(sessionId, onComplete) { var callCount = 0; - var totalInvitations = invitedFriends.length - existingInvites.length; + var totalInvitations = invitedFriends.length; invitedFriends.map(function(invite_id) { - if (!_inviteExists(invite_id)) { - callCount++; - var invite = { - music_session: sessionId, - receiver: invite_id - }; - $.ajax({ - type: "POST", - url: "/api/invitations", - data: invite - }).done(function(response) { - callCount--; - }).fail(app.ajaxError); - } + callCount++; + var invite = { + music_session: sessionId, + receiver: invite_id + }; + $.ajax({ + type: "POST", + url: "/api/invitations", + data: invite + }).done(function(response) { + callCount--; + }).fail(app.ajaxError); }); // TODO - this is the second time I've used this pattern. // refactor to make a common utility for this. diff --git a/web/app/views/clients/_inviteMusicians.html.erb b/web/app/views/clients/_inviteMusicians.html.erb index a5b7df44a..24bdba3bf 100644 --- a/web/app/views/clients/_inviteMusicians.html.erb +++ b/web/app/views/clients/_inviteMusicians.html.erb @@ -31,6 +31,6 @@ From d40b29a947f176fb653d460ef69799b4a6322868 Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Thu, 7 Aug 2014 00:50:10 -0400 Subject: [PATCH 02/12] VRFS-1971 escape HTML before saving / unescape before rendering --- web/Gemfile | 1 + web/app/assets/javascripts/dialog/commentDialog.js | 2 +- web/app/assets/javascripts/web/session_info.js | 2 +- web/app/assets/javascripts/web/sessions.js | 2 +- web/app/controllers/api_controller.rb | 1 + web/app/controllers/api_music_sessions_controller.rb | 4 ++-- web/app/controllers/api_recordings_controller.rb | 2 +- 7 files changed, 8 insertions(+), 6 deletions(-) diff --git a/web/Gemfile b/web/Gemfile index 288fe86b4..64aa3c08c 100644 --- a/web/Gemfile +++ b/web/Gemfile @@ -77,6 +77,7 @@ gem 'rest_client' gem 'iso-639' gem 'language_list' gem 'rubyzip' +gem 'htmlentities' group :development, :test do gem 'rspec-rails', '2.14.2' diff --git a/web/app/assets/javascripts/dialog/commentDialog.js b/web/app/assets/javascripts/dialog/commentDialog.js index 794ee141b..958d6ec27 100644 --- a/web/app/assets/javascripts/dialog/commentDialog.js +++ b/web/app/assets/javascripts/dialog/commentDialog.js @@ -71,7 +71,7 @@ user_id: userId, hoverAction: musician ? "musician" : "fan", name: userName, - comment: comment, + comment: context._.unescape(comment), timeago: timeago }; diff --git a/web/app/assets/javascripts/web/session_info.js b/web/app/assets/javascripts/web/session_info.js index d95684437..2d76b7d80 100644 --- a/web/app/assets/javascripts/web/session_info.js +++ b/web/app/assets/javascripts/web/session_info.js @@ -39,7 +39,7 @@ user_id: userId, hoverAction: "musician", name: userName, - comment: comment, + comment: context._.unescape(comment), timeago: timeago }); diff --git a/web/app/assets/javascripts/web/sessions.js b/web/app/assets/javascripts/web/sessions.js index 4686f34dc..e6727fb91 100644 --- a/web/app/assets/javascripts/web/sessions.js +++ b/web/app/assets/javascripts/web/sessions.js @@ -39,7 +39,7 @@ user_id: userId, hoverAction: musician ? "musician" : "fan", name: userName, - comment: comment, + comment: context._.unescape(comment), timeago: timeago }); diff --git a/web/app/controllers/api_controller.rb b/web/app/controllers/api_controller.rb index 85d425c82..b27e41e9b 100644 --- a/web/app/controllers/api_controller.rb +++ b/web/app/controllers/api_controller.rb @@ -1,6 +1,7 @@ class ApiController < ApplicationController @@log = Logging.logger[ApiController] + @@html_encoder = HTMLEntities.new # define common error handlers rescue_from 'JamRuby::StateError' do |exception| diff --git a/web/app/controllers/api_music_sessions_controller.rb b/web/app/controllers/api_music_sessions_controller.rb index eae4ec2fb..f3f460b50 100644 --- a/web/app/controllers/api_music_sessions_controller.rb +++ b/web/app/controllers/api_music_sessions_controller.rb @@ -469,7 +469,7 @@ class ApiMusicSessionsController < ApiController comment = MusicSessionComment.new comment.music_session_id = params[:id] comment.creator_id = params[:user_id] - comment.comment = params[:comment] + comment.comment = @@html_encoder.encode(params[:comment]) comment.ip_address = request.remote_ip comment.save @@ -496,7 +496,7 @@ class ApiMusicSessionsController < ApiController comment = SessionInfoComment.new comment.music_session_id = params[:id] comment.creator_id = current_user.id - comment.comment = params[:comment] + comment.comment = @@html_encoder.encode(params[:comment]) comment.save if comment.errors.any? diff --git a/web/app/controllers/api_recordings_controller.rb b/web/app/controllers/api_recordings_controller.rb index 75e3ea6f4..66c5625f9 100644 --- a/web/app/controllers/api_recordings_controller.rb +++ b/web/app/controllers/api_recordings_controller.rb @@ -108,7 +108,7 @@ class ApiRecordingsController < ApiController comment = RecordingComment.new comment.recording_id = params[:id] comment.creator_id = params[:user_id] - comment.comment = params[:comment] + comment.comment = @@html_encoder.encode(params[:comment]) comment.ip_address = request.remote_ip comment.save From f97a416867a2bc43ebd329ff8a6ebb197c30c15e Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Fri, 8 Aug 2014 02:22:32 -0400 Subject: [PATCH 03/12] VRFS-1891 VRFS-2011 cancel RSVP flow / show proficiency in RSVP dialog --- ruby/lib/jam_ruby/models/rsvp_request.rb | 4 ++-- web/app/assets/javascripts/dialog/rsvpSubmitDialog.js | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/ruby/lib/jam_ruby/models/rsvp_request.rb b/ruby/lib/jam_ruby/models/rsvp_request.rb index 3558df969..b0359c1fb 100644 --- a/ruby/lib/jam_ruby/models/rsvp_request.rb +++ b/ruby/lib/jam_ruby/models/rsvp_request.rb @@ -98,11 +98,11 @@ module JamRuby end # verify user has not already submitted RSVP request for this slot - user_slot = RsvpRequest.joins(:rsvp_requests_rsvp_slots) + rsvp = RsvpRequest.joins(:rsvp_requests_rsvp_slots) .where(:user_id => user.id) .where(rsvp_requests_rsvp_slots: {rsvp_slot_id: id}) - if !user_slot.blank? + if !rsvp.blank? && !rsvp.canceled raise StateError, "You have already submitted an RSVP request for this slot." end diff --git a/web/app/assets/javascripts/dialog/rsvpSubmitDialog.js b/web/app/assets/javascripts/dialog/rsvpSubmitDialog.js index 895927135..be8bf3afa 100644 --- a/web/app/assets/javascripts/dialog/rsvpSubmitDialog.js +++ b/web/app/assets/javascripts/dialog/rsvpSubmitDialog.js @@ -40,8 +40,7 @@ $.each(response.open_slots, function(index, val) { var instrument = val.instrument_id; - var instrumentTitleCase = context.JK.toTitleCase(instrument); - $('.rsvp-instruments', $dialog).append('' + instrumentTitleCase + "
"); + $('.rsvp-instruments', $dialog).append('' + val.description + " (" + val.proficiency_desc + ")
"); }); } } From cc26969f8a6033fee9bc238eb9cd6763ecfe652b Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Sat, 9 Aug 2014 23:22:17 -0400 Subject: [PATCH 04/12] VRFS-1891 cancel RSVP flow fix --- ruby/lib/jam_ruby/models/rsvp_request.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ruby/lib/jam_ruby/models/rsvp_request.rb b/ruby/lib/jam_ruby/models/rsvp_request.rb index b0359c1fb..025e5f0f1 100644 --- a/ruby/lib/jam_ruby/models/rsvp_request.rb +++ b/ruby/lib/jam_ruby/models/rsvp_request.rb @@ -100,9 +100,10 @@ module JamRuby # verify user has not already submitted RSVP request for this slot rsvp = RsvpRequest.joins(:rsvp_requests_rsvp_slots) .where(:user_id => user.id) + .where(:canceled => false) .where(rsvp_requests_rsvp_slots: {rsvp_slot_id: id}) - if !rsvp.blank? && !rsvp.canceled + if !rsvp.blank? raise StateError, "You have already submitted an RSVP request for this slot." end From 5483078f82e4f9a053212f76240e233b62b126cd Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Mon, 11 Aug 2014 21:02:42 -0400 Subject: [PATCH 05/12] VRFS-2026 fix instrument wrapping of instrument icon in some cases on Find Session screen --- web/app/views/clients/_findSession.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/app/views/clients/_findSession.html.erb b/web/app/views/clients/_findSession.html.erb index d37595e00..1fa5cb07e 100644 --- a/web/app/views/clients/_findSession.html.erb +++ b/web/app/views/clients/_findSession.html.erb @@ -220,7 +220,7 @@ - + {musician_name} From dece2afc1b44156db2467a2012081d1096d5b055 Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Tue, 12 Aug 2014 00:24:57 -0400 Subject: [PATCH 06/12] VRFS-1478 fix bugs --- ruby/lib/jam_ruby/models/music_session.rb | 2 +- web/app/assets/javascripts/inviteMusicians.js | 18 ++++++++---------- .../controllers/api_invitations_controller.rb | 8 ++++---- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/ruby/lib/jam_ruby/models/music_session.rb b/ruby/lib/jam_ruby/models/music_session.rb index 35a5a7892..0f50f0aeb 100644 --- a/ruby/lib/jam_ruby/models/music_session.rb +++ b/ruby/lib/jam_ruby/models/music_session.rb @@ -524,7 +524,7 @@ module JamRuby # retrieve users that have invitations but have not submitted an RSVP request for this session def pending_invitations - User.find_by_sql(%Q{select u.id, u.email, u.photo_url, u.first_name, u.last_name + User.find_by_sql(%Q{select distinct u.id, u.email, u.photo_url, u.first_name, u.last_name from users u inner join invitations i on u.id = i.receiver_id left join rsvp_requests rr on rr.user_id = i.receiver_id diff --git a/web/app/assets/javascripts/inviteMusicians.js b/web/app/assets/javascripts/inviteMusicians.js index 09950376c..d7f6b933c 100644 --- a/web/app/assets/javascripts/inviteMusicians.js +++ b/web/app/assets/javascripts/inviteMusicians.js @@ -41,14 +41,17 @@ friendSelectorDialog.setCallback(friendSelectorCallback); inviteAction = 'update'; - friendInput = '#friend-input-'+inviteAction; + friendInput = '#friend-input-' + inviteAction; if (0 == $(elemSelector + ' .friendbox').length) { _appendFriendSelector($(elemSelector)); } + $('#btn-save-invites').unbind('click'); + $('#btn-save-invites').click(function() { createInvitations(updateSessionID); + app.layout.closeDialog('select-invites'); }); $.ajax({ @@ -114,10 +117,6 @@ } } - function _inviteExists(userID) { - return 0 <= existingInvites.indexOf(userID); - } - function addInvitation(value, data) { if (undefined === data) { data = value.data; @@ -125,7 +124,6 @@ } if (0 > invitedFriends.indexOf(data)) { var template = $('#template-added-invitation').html(); - var imgStyle = _inviteExists(data) ? 'display:none' : ''; var invitationHtml = context.JK.fillTemplate(template, {userId: data, userName: value}); @@ -220,16 +218,16 @@ function _friendSelectorHTML() { var fInput = friendInput ? friendInput.substring(1,friendInput.length) : ''; return context.JK.fillTemplate($('#template-session-invite-musicians').html(), - {choose_friends_id: 'btn-choose-friends-'+inviteAction, - selected_friends_id: 'selected-friends-'+inviteAction, + {choose_friends_id: 'btn-choose-friends-' + inviteAction, + selected_friends_id: 'selected-friends-' + inviteAction, friend_input: fInput, instructions: addInstructions}); } function _appendFriendSelector(elemSelector) { elemSelector.append(_friendSelectorHTML()); - $('#selected-friends-'+inviteAction).on("click", ".invitation a", removeInvitation); - $('#btn-choose-friends-'+inviteAction).click(function(){ + $('#selected-friends-' + inviteAction).on("click", ".invitation a", removeInvitation); + $('#btn-choose-friends-' + inviteAction).click(function(){ var obj = {}; invitedFriends.map(function(uid) { obj[uid] = true; }); friendSelectorDialog.showDialog(obj); diff --git a/web/app/controllers/api_invitations_controller.rb b/web/app/controllers/api_invitations_controller.rb index 58a3965e6..b1c91ddb5 100644 --- a/web/app/controllers/api_invitations_controller.rb +++ b/web/app/controllers/api_invitations_controller.rb @@ -15,19 +15,19 @@ class ApiInvitationsController < ApiController raise PermissionError, "You can only ask for your own sent invitations" end if session_id = params[:session_id] - @invitations = Invitation.where(:sender_id => sender_id, :music_session_id => session_id) + @invitations = Invitation.where(:sender_id => sender_id, :music_session_id => session_id).uniq_by { |i| i.receiver_id } else - @invitations = Invitation.where(:sender_id => current_user.id) + @invitations = Invitation.where(:sender_id => current_user.id).uniq_by { |i| i.receiver_id } end elsif !receiver_id.nil? if current_user.id != receiver_id raise PermissionError, "You can only ask for your own received invitations" end - @invitations = Invitation.where(:receiver_id => current_user.id) + @invitations = Invitation.where(:receiver_id => current_user.id).uniq_by { |i| i.receiver_id } else # default to invitations you've received - @invitations = Invitation.where(:receiver_id => current_user.id) + @invitations = Invitation.where(:receiver_id => current_user.id).uniq_by { |i| i.receiver_id } end end From 257e14ef5ddce7f79777650ff439d53937ec4458 Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Tue, 12 Aug 2014 00:46:05 -0400 Subject: [PATCH 07/12] VRFS-1478 fix text --- web/spec/requests/invitations_api_spec.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/web/spec/requests/invitations_api_spec.rb b/web/spec/requests/invitations_api_spec.rb index 68d751341..47475f373 100644 --- a/web/spec/requests/invitations_api_spec.rb +++ b/web/spec/requests/invitations_api_spec.rb @@ -106,9 +106,7 @@ describe "Invitation API ", :type => :api do invitation = FactoryGirl.create(:invitation, :sender => user, :receiver => other_user, :music_session => music_session.music_session) post '/api/invitations.json', {:music_session => music_session.id, :receiver => other_user.id}.to_json, "CONTENT_TYPE" => 'application/json' - last_response.status.should eql(409) - response = JSON.parse(last_response.body) - response["errors"]["resource"][0].should == "resource already exists" + last_response.status.should eql(201) end From da12798d193ddf618ae6f2af059453b23d5d5e8a Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Tue, 12 Aug 2014 01:37:11 -0400 Subject: [PATCH 08/12] VRFS-1562 avatar within musician/band hover bubble should link to profile --- web/app/views/clients/_hoverBand.html.erb | 2 +- web/app/views/clients/_hoverMusician.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/web/app/views/clients/_hoverBand.html.erb b/web/app/views/clients/_hoverBand.html.erb index 491199b31..3bc440c21 100644 --- a/web/app/views/clients/_hoverBand.html.erb +++ b/web/app/views/clients/_hoverBand.html.erb @@ -52,7 +52,7 @@