diff --git a/db/manifest b/db/manifest
index 170472876..b8b9f7843 100755
--- a/db/manifest
+++ b/db/manifest
@@ -389,4 +389,5 @@ onboarder_limit.sql
onboarding_emails.sql
limit_counter_reminders.sql
amazon_v2.sql
-store_backend_details_rate_session.sql
\ No newline at end of file
+store_backend_details_rate_session.sql
+invited_user_receiver.sql
\ No newline at end of file
diff --git a/db/up/invited_user_receiver.sql b/db/up/invited_user_receiver.sql
new file mode 100644
index 000000000..19feee631
--- /dev/null
+++ b/db/up/invited_user_receiver.sql
@@ -0,0 +1 @@
+ALTER TABLE invited_users ADD COLUMN receiver_id VARCHAR(64) REFERENCES users(id);
\ No newline at end of file
diff --git a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/welcome_message.html.erb b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/welcome_message.html.erb
index 529681253..f5b01b69f 100644
--- a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/welcome_message.html.erb
+++ b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/welcome_message.html.erb
@@ -43,7 +43,7 @@
run into trouble and need help, please reach out to us. We will be glad to do everything we can
- to answer your questions and get you the help you need. You can visit our Forum to
+ to answer your questions and get you the help you need. You can visit our helpful forums to
find knowledge base articles and post questions that have not already been answered. You can
diff --git a/ruby/lib/jam_ruby/models/friend_request.rb b/ruby/lib/jam_ruby/models/friend_request.rb
index c73b06579..3b6d930a7 100644
--- a/ruby/lib/jam_ruby/models/friend_request.rb
+++ b/ruby/lib/jam_ruby/models/friend_request.rb
@@ -16,13 +16,18 @@ module JamRuby
validates :message, no_profanity: true
def to_s
- return "#{self.id} => #{self.user.to_s}:#{self.friend.to_s}"
+ "#{self.id} => #{self.user.to_s}:#{self.friend.to_s}"
end
- def self.save(id, user_id, friend_id, status, message)
+ def self.invited_path(invited_user, sender, message)
+ friend_request = self.save(nil, sender.id, invited_user.id, nil, message, supress_initial: true)
+ self.save(friend_request.id, sender.id, invited_user.id, 'accept', message, supress_initial: true)
+ end
+
+ def self.save(id, user_id, friend_id, status, message, supress_initial: false)
# new friend request
if id.nil?
- friend_request = FriendRequest.new()
+ friend_request = FriendRequest.new
friend_request = validate_friend_request(friend_request, user_id, friend_id)
friend_request.user_id = user_id
friend_request.friend_id = friend_id
@@ -30,8 +35,8 @@ module JamRuby
friend_request.save
# send notification
- Notification.send_friend_request(friend_request.id, user_id, friend_id)
-
+ Notification.send_friend_request(friend_request.id, user_id, friend_id) unless supress_initial
+
else
ActiveRecord::Base.transaction do
friend_request = FriendRequest.find(id)
diff --git a/ruby/lib/jam_ruby/models/invited_user.rb b/ruby/lib/jam_ruby/models/invited_user.rb
index ee3db45ad..f66f3db9f 100644
--- a/ruby/lib/jam_ruby/models/invited_user.rb
+++ b/ruby/lib/jam_ruby/models/invited_user.rb
@@ -14,6 +14,7 @@ module JamRuby
### Who sent this invitatio?
# either admin_sender or user_sender is not null. If an administrator sends the invitation, then
belongs_to :sender , :inverse_of => :invited_users, :class_name => "JamRuby::User", :foreign_key => "sender_id"
+ belongs_to :receiver, :inverse_of => :receiver_users, :class_name => "JamRuby::User", :foreign_key => "receiver_id"
# who is the invitation sent to?
validates :email, format: {with: VALID_EMAIL_REGEX}, :if => lambda { |iu| iu.email_required? }
@@ -33,6 +34,7 @@ module JamRuby
before_validation(:on => :create) do
self.invitation_code = SecureRandom.urlsafe_base64 if self.invitation_code.nil?
self.sender_id = nil if self.sender_id.blank? # this coercion was done just to make activeadmin work
+ self.receiver = User.find_by_email(self.email) unless self.email.nil?
end
FB_MEDIUM = 'facebook'
diff --git a/ruby/lib/jam_ruby/models/user.rb b/ruby/lib/jam_ruby/models/user.rb
index ceb778ff7..a9f0229d5 100644
--- a/ruby/lib/jam_ruby/models/user.rb
+++ b/ruby/lib/jam_ruby/models/user.rb
@@ -178,6 +178,7 @@ module JamRuby
# invited users
has_many :invited_users, :foreign_key => "sender_id", :class_name => "JamRuby::InvitedUser"
+ has_many :receiver_users, :foreign_key => "receiver_id", :class_name => "JamRuby::InvitedUser"
# crash dumps
has_many :crash_dumps, :foreign_key => "user_id", :class_name => "JamRuby::CrashDump"
@@ -1526,19 +1527,6 @@ module JamRuby
user.signup_token = SecureRandom.urlsafe_base64
end
-
- # now that the user is saved, let's
- if invited_user.autofriend && !invited_user.sender.nil?
- # hookup this user with the sender
- Friendship.save_using_models(user, invited_user.sender)
- end
-
- invited_user.accept!
- invited_user.save
-
- if invited_user.errors.any?
- raise ActiveRecord::Rollback
- end
end
found_gift_card = nil
@@ -1566,6 +1554,15 @@ module JamRuby
user.save
+ # now that the user is saved, let's
+ if invited_user && invited_user.autofriend && !invited_user.sender.nil?
+ # hookup this user with the sender
+ FriendRequest.invited_path(user, invited_user.sender, invited_user.note)
+ invited_user.accept!
+ invited_user.save
+ end
+
+
if found_gift_card
user.reload
ShoppingCart.apply_gifted_jamtracks(user)
@@ -1613,6 +1610,11 @@ module JamRuby
else
user.email_needs_verification = false
end
+
+ if !invited_user.nil? && invited_user.accepted
+ invited_user.receiver = user
+ invited_user.save
+ end
end
diff --git a/web/app/assets/javascripts/dialog/acceptFriendRequestDialog.js b/web/app/assets/javascripts/dialog/acceptFriendRequestDialog.js
index 66a4fe2f2..8b2bd3be9 100644
--- a/web/app/assets/javascripts/dialog/acceptFriendRequestDialog.js
+++ b/web/app/assets/javascripts/dialog/acceptFriendRequestDialog.js
@@ -159,6 +159,12 @@
renderNoActionPossibleBtns();
})
})
+ .fail(function() {
+ // not logged in :(
+ var redirectPath= '?redirect-to=' + encodeURIComponent(JK.locationPath());
+ window.location.href = '/signin' + redirectPath;
+ return
+ })
}
function events() {
diff --git a/web/app/assets/javascripts/dialog/invitationDialog.js.erb b/web/app/assets/javascripts/dialog/invitationDialog.js.erb
index 7e3424736..8e17c31b6 100644
--- a/web/app/assets/javascripts/dialog/invitationDialog.js.erb
+++ b/web/app/assets/javascripts/dialog/invitationDialog.js.erb
@@ -7,6 +7,7 @@
var waitForUserToStopTypingTimer;
var deferredFbInvite = null;
var facebookHelper = null;
+ var sendingEmails = false
function trackMetrics(emails, googleInviteCount) {
var allInvitations = emails.length; // all email invites, regardless of how they got in the form
@@ -93,25 +94,35 @@
// send invitations one after another, so as not to 'spam' the server very heavily.
// this should be a bulk call, clearly
function sendEmails(e) {
+ if(sendingEmails) {
+ return;
+ }
+ var $button = $(e.target)
var emails = $('#txt-emails').val().split(',');
if(emails.length > 0) {
var max_email = <%= Rails.application.config.max_email_invites_per_request %>;
if (max_email < emails.length) {
app.notifyAlert('Too many emails', 'You can send up to '+max_email.toString()+' email invites. You have '+emails.length.toString());
- return;
+ return;
}
var invalids = invalidEmails(emails);
if (0 < invalids.length) {
app.notifyAlert('Invalid emails', 'Please confirm email addresses');
} else {
+ sendingEmails = true
+ $button.addClass("disabled")
rest.createEmailInvitations(emails, $('#txt-message').val())
.fail(function(jqXHR) {
app.notifyServerError(jqXHR, 'Unable to Invite Users');
app.layout.closeDialog('inviteUsers');
+ sendingEmails = false
+ $button.removeClass("disabled")
})
.done(function() {
app.notifyAlert('Invites sent', 'You sent '+emails.length.toString()+' email invites');
app.layout.closeDialog('inviteUsers');
+ sendingEmails = false
+ $button.removeClass("disabled")
});
trackMetrics(emails, $('#txt-emails').data('google_invite_count'));
}
@@ -229,6 +240,7 @@
}
function beforeShow() {
+ sendingEmails = false
registerEvents(true);
$('#invitation-dialog input[name=email-filter]').val('');
diff --git a/web/app/assets/javascripts/sidebar.js b/web/app/assets/javascripts/sidebar.js
index c4d7871b1..650d6efa8 100644
--- a/web/app/assets/javascripts/sidebar.js
+++ b/web/app/assets/javascripts/sidebar.js
@@ -213,17 +213,17 @@
registerSourceDown();
// watch for Invite More Users events
- $('#sidebar-div .btn-email-invitation').click(function() {
+ $('#sidebar-div .email-invitation-holder').click(function() {
invitationDialog.showEmailDialog();
return false;
});
- $('#sidebar-div .btn-gmail-invitation').click(function() {
+ $('#sidebar-div .gmail-invitation-holder').click(function() {
invitationDialog.showGoogleDialog();
return false;
});
- $('#sidebar-div .btn-facebook-invitation').click(function(evt) {
+ $('#sidebar-div .facebook-invitation-holder').click(function(evt) {
invitationDialog.showFacebookDialog(evt);
return false;
});
diff --git a/web/app/assets/javascripts/web/congratulations.js b/web/app/assets/javascripts/web/congratulations.js
index 31ddf40d4..436531b53 100644
--- a/web/app/assets/javascripts/web/congratulations.js
+++ b/web/app/assets/javascripts/web/congratulations.js
@@ -4,9 +4,9 @@
var congratulations = {};
- congratulations.initialize = function initialize(musician, registrationType) {
+ congratulations.initialize = function initialize(musician, friend) {
if(musician) {
- context.JK.Downloads.listClients(true);
+ context.JK.Downloads.listClients(true, friend);
}
}
diff --git a/web/app/assets/javascripts/web/downloads.js b/web/app/assets/javascripts/web/downloads.js
index 1d7b2ffad..9eba6c360 100644
--- a/web/app/assets/javascripts/web/downloads.js
+++ b/web/app/assets/javascripts/web/downloads.js
@@ -114,14 +114,20 @@
$('body.web .spinner-large').remove();
}
- function flashCongratulations() {
- context.JK.flash('Congratulations!
Your account is ready.', {hide:10})
+ function flashCongratulations(friend) {
+ if(friend) {
+ context.JK.flash('Congratulations!
Soon you can play with ' + friend + '!', {hide:20})
+ }
+ else {
+ context.JK.flash('Congratulations!
Your account is ready.', {hide:20})
+ }
+
}
- function listClients(congratulations) {
+ function listClients(congratulations, friend) {
isCongratulations = congratulations;
if(isCongratulations) {
- flashCongratulations();
+ flashCongratulations(friend);
}
else {
//flashCongratulations();
diff --git a/web/app/assets/stylesheets/client/sidebar.scss b/web/app/assets/stylesheets/client/sidebar.scss
index fd344f1f6..1f743fe54 100644
--- a/web/app/assets/stylesheets/client/sidebar.scss
+++ b/web/app/assets/stylesheets/client/sidebar.scss
@@ -115,6 +115,10 @@
ms-filter: "alpha(opacity=50)";
}
+ .email-invitation-holder, .gmail-invitation-holder, .facebook-invitation-holder {
+ cursor:pointer;
+ }
+
.avatar-small {
float:left;
padding:1px;
diff --git a/web/app/assets/stylesheets/dialogs/acceptFriendRequestDialog.scss b/web/app/assets/stylesheets/dialogs/acceptFriendRequestDialog.scss
index 783c98448..3a9734585 100644
--- a/web/app/assets/stylesheets/dialogs/acceptFriendRequestDialog.scss
+++ b/web/app/assets/stylesheets/dialogs/acceptFriendRequestDialog.scss
@@ -2,6 +2,7 @@
width:500px;
min-height:100px;
height:auto;
+ line-height:normal;
.dialog-inner {
color:white;
diff --git a/web/app/controllers/api_invited_users_controller.rb b/web/app/controllers/api_invited_users_controller.rb
index 33a118fad..089c2bf4d 100644
--- a/web/app/controllers/api_invited_users_controller.rb
+++ b/web/app/controllers/api_invited_users_controller.rb
@@ -21,6 +21,12 @@ class ApiInvitedUsersController < ApiController
@invited_users = []
if (emails = params[:emails]).present?
emails = emails[0...Rails.application.config.max_email_invites_per_request].uniq
+ if emails.include?(current_user.email)
+ @responseobject = { :errors => { :email => ["can't be your own address"]}}
+ render :json => @responseobject, :status => :unprocessable_entity, layout: nil
+ return
+ end
+
msg = params[:note].blank? ? nil : params[:note].strip
@invited_users = emails.collect do |ee|
iu = InvitedUser.new
@@ -29,6 +35,15 @@ class ApiInvitedUsersController < ApiController
iu.autofriend = true
iu.note = msg
iu.save
+
+ if iu.receiver
+ # automatically create friend request for an invitation to an existing user
+ FriendRequest.save(nil,
+ current_user.id,
+ iu.receiver.id,
+ nil,
+ msg)
+ end
iu
end
else
diff --git a/web/app/controllers/users_controller.rb b/web/app/controllers/users_controller.rb
index 6610d0cca..c9b48d6af 100644
--- a/web/app/controllers/users_controller.rb
+++ b/web/app/controllers/users_controller.rb
@@ -39,14 +39,30 @@ class UsersController < ApplicationController
def new
@no_user_dropdown = true
+
+ @invited_user = load_invited_user(params)
+
+ if @invited_user && @invited_user.email
+ user = User.find_by_email(@invited_user.email)
+ if user && (!current_user || current_user.id != user.id)
+ sign_in(user)
+ friend_request = FriendRequest.find_by_user_id_and_friend_id(@invited_user.sender_id, user.id)
+ if !friend_request
+ redirect_url = "/client#/home"
+ else
+ redirect_url = "/client#/home/accept-friend-request/d1=#{friend_request.id}"
+ end
+ redirect_to redirect_url
+ return
+ end
+ end
+
if current_user
if params["redirect-to"]
redirect_to params["redirect-to"]
else
redirect_to client_url
end
-
-
return
end
@@ -78,13 +94,7 @@ class UsersController < ApplicationController
end
@affiliate_partner = load_affiliate_partner(params)
- @invited_user = load_invited_user(params)
- if !@invited_user.nil? && @invited_user.has_required_email? && @invited_user.accepted
- # short-circuit out if this invitation is already accepted
- render "already_signed_up", :layout => 'landing'
- return
- end
@signup_postback = load_postback(@invited_user, @fb_signup, @affiliate_partner)
load_location(request.remote_ip)
@@ -187,7 +197,7 @@ class UsersController < ApplicationController
new_user(@user, signup_hint) # sets a cookie used for GA analytics (one-time new user stuff in JavaScript)
destination = @user.musician ? :congratulations_musician : :congratulations_fan
- redirect_url = handle_signup_hint(@user, signup_hint, {:action => destination, :type => @user.user_authorization('facebook') ? 'Facebook' : 'Native'})
+ redirect_url = handle_signup_hint(@user, signup_hint, {:action => destination, friend: @invited_user.nil? ? nil : @invited_user.sender.name})
redirect_to redirect_url
end
end
diff --git a/web/app/views/clients/_sidebar.html.erb b/web/app/views/clients/_sidebar.html.erb
index 959cf1302..b51a9e779 100644
--- a/web/app/views/clients/_sidebar.html.erb
+++ b/web/app/views/clients/_sidebar.html.erb
@@ -60,7 +60,7 @@