From a73d4d758da7a9ed182bef771ccbf9e2352c9a35 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Wed, 29 Jan 2014 21:22:37 -0600 Subject: [PATCH] vrfs152: created one FB invite constraint --- db/manifest | 2 +- db/up/invited_users_allow_email_null.sql | 1 - db/up/invited_users_facebook_support.sql | 3 +++ ruby/lib/jam_ruby/models/invited_user.rb | 13 +++++++++++++ ruby/lib/jam_ruby/models/user.rb | 11 +++++++++++ ruby/spec/jam_ruby/models/invited_user_spec.rb | 17 ++++++++++++++++- 6 files changed, 44 insertions(+), 3 deletions(-) delete mode 100644 db/up/invited_users_allow_email_null.sql create mode 100644 db/up/invited_users_facebook_support.sql diff --git a/db/manifest b/db/manifest index 77ec23aca..732003121 100755 --- a/db/manifest +++ b/db/manifest @@ -91,4 +91,4 @@ music_session_constraints.sql mixes_drop_manifest_add_retry.sql music_sessions_unlogged.sql integrate_icecast_into_sessions.sql -invited_users_allow_email_null.sql +invited_users_facebook_support.sql diff --git a/db/up/invited_users_allow_email_null.sql b/db/up/invited_users_allow_email_null.sql deleted file mode 100644 index ff6042710..000000000 --- a/db/up/invited_users_allow_email_null.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE invited_users ALTER COLUMN email DROP NOT NULL; diff --git a/db/up/invited_users_facebook_support.sql b/db/up/invited_users_facebook_support.sql new file mode 100644 index 000000000..efc79b5de --- /dev/null +++ b/db/up/invited_users_facebook_support.sql @@ -0,0 +1,3 @@ +ALTER TABLE invited_users ALTER COLUMN email DROP NOT NULL; +ALTER TABLE invited_users ADD COLUMN invite_medium VARCHAR(64); + diff --git a/ruby/lib/jam_ruby/models/invited_user.rb b/ruby/lib/jam_ruby/models/invited_user.rb index cf401ba08..d96aec775 100644 --- a/ruby/lib/jam_ruby/models/invited_user.rb +++ b/ruby/lib/jam_ruby/models/invited_user.rb @@ -19,6 +19,7 @@ module JamRuby validates :invitation_code, :presence => true validates :note, length: {maximum: 400}, no_profanity: true # 400 == arbitrary. + validate :one_facebook_invite_per_user, :if => lambda { |iu| iu.invite_medium == FB_MEDIUM } validate :valid_personalized_invitation # validate :not_accepted_twice validate :not_accepted_twice, :if => lambda { |iu| iu.email } @@ -32,6 +33,12 @@ module JamRuby self.sender_id = nil if self.sender_id.blank? # this coercion was done just to make activeadmin work end + FB_MEDIUM = 'facebook' + + def self.facebook_invite(user) + where(:sender_id => user.id, :invite_medium => FB_MEDIUM).limit(1).first + end + def track_user_progression self.sender.update_progression_field(:first_invited_at) unless self.sender.nil? end @@ -68,6 +75,12 @@ module JamRuby def not_accepted_twice errors.add(:accepted, "you can only accept an invitation once") if accepted_twice end + + def one_facebook_invite_per_user + rel = InvitedUser.where(:invite_medium => FB_MEDIUM, :sender_id => self.sender_id) + rel = rel.where(['id != ?',self.id]) if self.id + errors.add(:invite_medium, "one facebook invite allowed per user") if 0 < rel.count + end end end diff --git a/ruby/lib/jam_ruby/models/user.rb b/ruby/lib/jam_ruby/models/user.rb index f1b703f10..2512efebf 100644 --- a/ruby/lib/jam_ruby/models/user.rb +++ b/ruby/lib/jam_ruby/models/user.rb @@ -996,6 +996,17 @@ module JamRuby def first_recording_at Recording.where(:owner_id => self.id).order('created_at ASC').first.try(:created_at) end + + def facebook_invite + unless iu = InvitedUser.facebook_invite(self) + iu = InvitedUser.new + iu.sender = self + iu.autofriend = true + iu.invite_medium = InvitedUser::FB_MEDIUM + iu.save + end + iu + end # devise compatibility diff --git a/ruby/spec/jam_ruby/models/invited_user_spec.rb b/ruby/spec/jam_ruby/models/invited_user_spec.rb index 369608c11..16dccb133 100644 --- a/ruby/spec/jam_ruby/models/invited_user_spec.rb +++ b/ruby/spec/jam_ruby/models/invited_user_spec.rb @@ -106,8 +106,23 @@ describe InvitedUser do it 'accepts empty emails' do user1 = FactoryGirl.create(:user) - invited_user = FactoryGirl.create(:invited_user, :sender => user1, :email => '') + invited_user = FactoryGirl.create(:invited_user, :sender_id => user1.id, :email => '') expect(invited_user.valid?).to eq(true) end + it 'accepts one facebook invite per user' do + user1 = FactoryGirl.create(:user) + invited_user = FactoryGirl.create(:invited_user, :sender_id => user1.id, :invite_medium => InvitedUser::FB_MEDIUM) + expect(invited_user.valid?).to eq(true) + invited_user.autofriend = !invited_user.autofriend + invited_user.save + expect(invited_user.valid?).to eq(true) + invited_user1 = InvitedUser.new(:email => 'foobar@example.com', :sender_id => user1.id) + invited_user1.autofriend = true + invited_user1.invite_medium = InvitedUser::FB_MEDIUM + invited_user1.save + expect(invited_user1.valid?).to eq(false) + expect(InvitedUser.facebook_invite(user1).id).to eq(invited_user.id) + end + end