Fix for parent codes

Stephen Paul Weber created

Put them in the right place and also check from the InviteCodes handler

Change summary

lib/parent_code_repo.rb   |  2 +-
lib/registration.rb       | 26 ++++++++++++++++++++++----
test/test_registration.rb | 20 ++++++++++++++++++++
3 files changed, 43 insertions(+), 5 deletions(-)

Detailed changes

lib/parent_code_repo.rb 🔗

@@ -19,7 +19,7 @@ class ParentCodeRepo
 			code = "p#{Multibases.pack('base32upper', SecureRandom.bytes(4))}"
 			EMPromise.all([
 				@redis.set("jmp_customer_group_code-#{customer_id}", code),
-				@redis.hset("jmp_group_codes", code, customer_id)
+				@redis.hset("jmp_parent_codes", code, customer_id)
 			]).then { code }
 		end
 	end

lib/registration.rb 🔗

@@ -429,7 +429,7 @@ class Registration
 					msg = if customer.balance.positive?
 						"Account balance not enough to cover the activation"
 					end
-					new(customer, tel, error: msg)
+					new(customer, tel, error: msg, finish: Finish)
 				end
 			end
 
@@ -444,10 +444,12 @@ class Registration
 				required: true
 			}].freeze
 
-			def initialize(customer, tel, error: nil, **)
+			def initialize(customer, tel, error: nil, finish: Finish, **)
 				@customer = customer
 				@tel = tel
 				@error = error
+				@finish = finish
+				@parent_code_repo = ParentCodeRepo.new(REDIS)
 			end
 
 			def add_form(reply)
@@ -484,8 +486,24 @@ class Registration
 			end
 
 			def verify(code)
-				InvitesRepo.new(DB, REDIS).claim_code(customer_id, code) do
-					@customer.activate_plan_starting_now
+				@parent_code_repo.find(code).then do |parent_customer_id|
+					if parent_customer_id
+						set_parent(parent_customer_id)
+					else
+						InvitesRepo.new(DB, REDIS).claim_code(customer_id, code) do
+							@customer.activate_plan_starting_now
+						end
+					end
+				end
+			end
+
+			def set_parent(parent_customer_id)
+				@customer = @customer.with_plan(
+					@customer.plan_name,
+					parent_customer_id: parent_customer_id
+				)
+				@customer.save_plan!.then do
+					self.class.for(@customer, @tel, finish: @finish)
 				end
 			end
 		end

test/test_registration.rb 🔗

@@ -749,6 +749,11 @@ class RegistrationTest < Minitest::Test
 						EMPromise.resolve(nil),
 						["jmp_invite_tries-test"]
 					)
+					Registration::Payment::InviteCode::REDIS.expect(
+						:hget,
+						EMPromise.resolve(nil),
+						["jmp_parent_codes", "abc"]
+					)
 					Command::COMMAND_MANAGER.expect(
 						:write,
 						EMPromise.resolve(
@@ -782,6 +787,11 @@ class RegistrationTest < Minitest::Test
 						EMPromise.resolve(0),
 						["jmp_invite_tries-test"]
 					)
+					Registration::Payment::InviteCode::REDIS.expect(
+						:hget,
+						EMPromise.resolve(nil),
+						["jmp_parent_codes", "abc"]
+					)
 					Registration::Payment::InviteCode::DB.expect(
 						:transaction,
 						[]
@@ -850,6 +860,11 @@ class RegistrationTest < Minitest::Test
 						EMPromise.resolve(0),
 						["jmp_invite_tries-test"]
 					)
+					Registration::Payment::InviteCode::REDIS.expect(
+						:hget,
+						EMPromise.resolve(nil),
+						["jmp_parent_codes", "abc"]
+					)
 					Registration::Payment::InviteCode::DB.expect(
 						:transaction,
 						[]
@@ -918,6 +933,11 @@ class RegistrationTest < Minitest::Test
 						EMPromise.resolve(11),
 						["jmp_invite_tries-test"]
 					)
+					Registration::Payment::InviteCode::REDIS.expect(
+						:hget,
+						EMPromise.resolve(nil),
+						["jmp_parent_codes", "abc"]
+					)
 					Command::COMMAND_MANAGER.expect(
 						:write,
 						EMPromise.resolve(