From b30139111657210e7ca8f52ee75d13443447932c Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Fri, 4 Jul 2014 01:36:49 +0530 Subject: [PATCH 1/2] FEATURE: redeem Invite when user sign up --- app/models/email_token.rb | 2 ++ app/models/invite.rb | 8 ++++++++ app/models/invite_redeemer.rb | 4 ++++ 3 files changed, 14 insertions(+) diff --git a/app/models/email_token.rb b/app/models/email_token.rb index dc511fbc726..0d02e0d16a1 100644 --- a/app/models/email_token.rb +++ b/app/models/email_token.rb @@ -57,6 +57,8 @@ class EmailToken < ActiveRecord::Base user.save! end end + # redeem invite, if available + Invite.redeem_from_email(user.email) user rescue ActiveRecord::RecordInvalid # If the user's email is already taken, just return nil (failure) diff --git a/app/models/invite.rb b/app/models/invite.rb index bbdf5edbdfc..f60a69f16ba 100644 --- a/app/models/invite.rb +++ b/app/models/invite.rb @@ -130,6 +130,14 @@ class Invite < ActiveRecord::Base i end + def self.redeem_from_email(email) + invite = Invite.find_by(email: Email.downcase(email)) + if invite + InviteRedeemer.new(invite).redeem + end + invite + end + def self.base_directory File.join(Rails.root, "public", "csv", RailsMultisite::ConnectionManagement.current_db) end diff --git a/app/models/invite_redeemer.rb b/app/models/invite_redeemer.rb index 19cf4d3677f..b4ec857df23 100644 --- a/app/models/invite_redeemer.rb +++ b/app/models/invite_redeemer.rb @@ -19,6 +19,10 @@ InviteRedeemer = Struct.new(:invite) do # extracted from User cause it is very specific to invites def self.create_user_from_invite(invite) + + user_exists = User.find_by_email(invite.email) + return user if user_exists + username = UserNameSuggester.suggest(invite.email) DiscourseHub.username_operation do From caf8dbe92fe141bd73e84c7e6ba5780bddc0c005 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Sat, 5 Jul 2014 01:23:41 +0530 Subject: [PATCH 2/2] Add tests for redeem invite feature --- spec/models/invite_spec.rb | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/spec/models/invite_spec.rb b/spec/models/invite_spec.rb index 5e936aca8f8..82704203fbb 100644 --- a/spec/models/invite_spec.rb +++ b/spec/models/invite_spec.rb @@ -349,4 +349,24 @@ describe Invite do result.should be_valid end end + + describe '.redeem_from_email' do + let(:inviter) { Fabricate(:user) } + let(:invite) { Fabricate(:invite, invited_by: inviter, email: 'test@example.com', user_id: nil) } + let(:user) { Fabricate(:user, email: invite.email) } + + it 'redeems the invite from email' do + result = Invite.redeem_from_email(user.email) + invite.reload + invite.should be_redeemed + end + + it 'does not redeem the invite if email does not match' do + result = Invite.redeem_from_email('test24@example.com') + invite.reload + invite.should_not be_redeemed + end + + end + end