diff --git a/lib/invites_repo.rb b/lib/invites_repo.rb index 1dc4b71712dfbe824e5eaedf25bfc5ef858591ad..b862d33054a5e6d9b291d896803e1fcf8842f191 100644 --- a/lib/invites_repo.rb +++ b/lib/invites_repo.rb @@ -21,6 +21,20 @@ class InvitesRepo @redis.set("jmp_customer_pending_invite-#{customer_id}", code) end + def use_pending_group_code(customer_id) + @redis.get("jmp_customer_pending_invite-#{customer_id}").then do |code| + EMPromise.all([ + @redis.del("jmp_customer_pending_invite-#{customer_id}"), + @redis.hget("jmp_group_codes", code) + ]).then do |(_, credit_to)| + next false if credit_to.to_s.strip == "" + + create_claimed_code(credit_to, customer_id) + credit_to + end + end + end + CLAIM_SQL = <<~SQL UPDATE invites SET used_by_id=$1, used_at=LOCALTIMESTAMP WHERE code=$2 AND used_by_id IS NULL @@ -39,6 +53,13 @@ class InvitesRepo end end + def create_claimed_code(creator_id, used_by_id) + @db.exec(<<~SQL, [creator_id, used_by_id]) + INSERT INTO invites (creator_id, used_by_id, used_at) + VALUES ($1, $2, LOCALTIMESTAMP) + SQL + end + CREATE_N_SQL = <<~SQL INSERT INTO invites SELECT unnest(array_fill($1::text, array[$2::int])) diff --git a/lib/registration.rb b/lib/registration.rb index e8492e9739187877727c6fb9a7af0aaeb527d04b..78f28d10bf824cc37f343ce8283a321568d3bce8 100644 --- a/lib/registration.rb +++ b/lib/registration.rb @@ -215,10 +215,10 @@ class Registration def activate DB.transaction do if @credit_to - DB.exec(<<~SQL, [@credit_to, customer.customer_id]) - INSERT INTO invites (creator_id, used_by_id, used_at) - VALUES ($1, $2, LOCALTIMESTAMP) - SQL + InvitesRepo.new(DB, REDIS).create_claimed_code( + @credit_to, + customer.customer_id + ) end @customer.activate_plan_starting_now end @@ -519,6 +519,7 @@ class Registration def initialize(customer, tel) @customer = customer @tel = tel + @invites = InvitesRepo.new(DB, REDIS) end def write @@ -561,11 +562,26 @@ class Registration )) end + def use_referral_code + @invites.use_pending_group_code(@customer.customer_id).then do |credit_to| + next unless credit_to + + Transaction.new( + customer_id: @customer.customer_id, + transaction_id: "referral_#{@customer.customer_id}_#{credit_to}", + amount: @customer.monthly_price, + note: "Referral Bonus", + bonus_eligible?: false + ).insert + end + end + def customer_active_tel_purchased @customer.register!(@tel).catch(&method(:raise_setup_error)).then { EMPromise.all([ REDIS.del("pending_tel_for-#{@customer.jid}"), - put_default_fwd + put_default_fwd, + use_referral_code ]) }.then do FinishOnboarding.for(@customer, @tel).then(&:write) diff --git a/test/test_registration.rb b/test/test_registration.rb index b3bb2c31c8b648227d5761c3aea4abd8d8191392..33651e4d13db524141363397b4a0ec66badfef35 100644 --- a/test/test_registration.rb +++ b/test/test_registration.rb @@ -767,6 +767,7 @@ class RegistrationTest < Minitest::Test Command::COMMAND_MANAGER = Minitest::Mock.new Registration::Finish::TEL_SELECTIONS = FakeTelSelections.new Registration::Finish::REDIS = Minitest::Mock.new + Registration::Finish::DB = Minitest::Mock.new Bwmsgsv2Repo::REDIS = Minitest::Mock.new Registration::FinishOnboarding::DB = FakeDB.new @@ -813,6 +814,21 @@ class RegistrationTest < Minitest::Test nil, ["pending_tel_for-test@example.net"] ) + Registration::Finish::REDIS.expect( + :get, + nil, + ["jmp_customer_pending_invite-test"] + ) + Registration::Finish::REDIS.expect( + :del, + nil, + ["jmp_customer_pending_invite-test"] + ) + Registration::Finish::REDIS.expect( + :hget, + nil, + ["jmp_group_codes", nil] + ) Bwmsgsv2Repo::REDIS.expect( :set, nil, @@ -902,6 +918,21 @@ class RegistrationTest < Minitest::Test nil, ["pending_tel_for-test\\40onboarding.example.com@proxy"] ) + Registration::Finish::REDIS.expect( + :get, + nil, + ["jmp_customer_pending_invite-test"] + ) + Registration::Finish::REDIS.expect( + :del, + nil, + ["jmp_customer_pending_invite-test"] + ) + Registration::Finish::REDIS.expect( + :hget, + nil, + ["jmp_group_codes", nil] + ) Bwmsgsv2Repo::REDIS.expect( :set, nil,