Move more persistence into the repo layer

Stephen Paul Weber created

BackendSGX shouldn't touch Redis, instead get one of the repos to save the data
we want saved wherever that repo saves it (in this case, those same Redis keys).

Change summary

lib/backend_sgx.rb         |  8 ---
lib/bwmsgsv2_repo.rb       | 28 +++++++++++++
lib/customer.rb            |  2 
lib/customer_repo.rb       | 30 +++++++++++++-
lib/registration.rb        | 11 +---
sgx_jmp.rb                 | 10 ++--
test/test_customer_repo.rb | 81 +++++++++++++++++++++++++++++++++++++++
test/test_registration.rb  | 10 ++--
8 files changed, 150 insertions(+), 30 deletions(-)

Detailed changes

lib/backend_sgx.rb 🔗

@@ -36,14 +36,6 @@ class BackendSgx
 		end
 	end
 
-	def set_fwd(uri)
-		REDIS.set("catapult_fwd-#{registered?.phone}", uri)
-	end
-
-	def set_fwd_timeout(timeout)
-		REDIS.set("catapult_fwd_timeout-#{from_jid}", timeout)
-	end
-
 	def set_ogm_url(url)
 		REDIS.set("catapult_ogm_url-#{from_jid}", url)
 	end

lib/bwmsgsv2_repo.rb 🔗

@@ -27,8 +27,36 @@ class Bwmsgsv2Repo
 		end
 	end
 
+	def put_transcription_enabled(customer_id, enabled)
+		sgx = @trivial_repo.get(customer_id)
+		REDIS.setbit(
+			"catapult_settings_flags-#{sgx.from_jid}",
+			Bwmsgsv2Repo::VOICEMAIL_TRANSCRIPTION_DISABLED,
+			enabled ? 0 : 1
+		)
+	end
+
+	def put_fwd(customer_id, tel, customer_fwd)
+		sgx = @trivial_repo.get(customer_id)
+		EMPromise.all([
+			set_or_delete("catapult_fwd-#{tel}", customer_fwd.uri),
+			set_or_delete(
+				"catapult_fwd_timeout-#{sgx.from_jid}",
+				customer_fwd.timeout.to_i
+			)
+		])
+	end
+
 protected
 
+	def set_or_delete(k, v)
+		if v.nil?
+			REDIS.del(k)
+		else
+			REDIS.set(k, v)
+		end
+	end
+
 	def fetch_raw(from_jid)
 		registration(from_jid).then do |r|
 			EMPromise.all([from_redis(from_jid, r ? r.phone : nil), r])

lib/customer.rb 🔗

@@ -23,7 +23,7 @@ class Customer
 	def_delegators :@plan, :active?, :activate_plan_starting_now, :bill_plan,
 	               :currency, :merchant_account, :plan_name, :auto_top_up_amount
 	def_delegators :@sgx, :register!, :registered?, :set_ogm_url,
-	               :set_fwd, :fwd, :transcription_enabled
+	               :fwd, :transcription_enabled
 	def_delegators :@usage, :usage_report, :message_usage, :incr_message_usage
 
 	def initialize(

lib/customer_repo.rb 🔗

@@ -59,12 +59,36 @@ class CustomerRepo
 		end
 	end
 
+	def put_lidb_name(customer, lidb_name)
+		BandwidthIris::Lidb.create(
+			customer_order_id: customer.customer_id,
+			lidb_tn_groups: { lidb_tn_group: {
+				telephone_numbers: [customer.registered?.phone.sub(/\A\+1/, "")],
+				subscriber_information: lidb_name,
+				use_type: "RESIDENTIAL",
+				visibility: "PUBLIC"
+			} }
+		)
+	end
+
+	def put_transcription_enabled(customer, transcription_enabled)
+		@sgx_repo.put_transcription_enabled(
+			customer.customer_id, transcription_enabled
+		)
+	end
+
+	def put_fwd(customer, customer_fwd)
+		@sgx_repo.put_fwd(
+			customer.customer_id,
+			customer.registered?.phone,
+			customer_fwd
+		)
+	end
+
 protected
 
 	def new_sgx(customer_id)
-		TrivialBackendSgxRepo.new.get(customer_id).with(
-			registered?: false
-		)
+		TrivialBackendSgxRepo.new.get(customer_id).with(registered?: false)
 	end
 
 	def find_legacy_customer(jid)

lib/registration.rb 🔗

@@ -445,10 +445,6 @@ class Registration
 			}.then { |tel| Finish.new(@customer, tel).write }
 		end
 
-		def cheogram_sip_addr
-			"sip:#{ERB::Util.url_encode(@customer.jid)}@sip.cheogram.com"
-		end
-
 		def raise_setup_error(e)
 			Command.log.error "@customer.register! failed", e
 			Command.finish(
@@ -459,11 +455,12 @@ class Registration
 		end
 
 		def customer_active_tel_purchased
-			@customer.register!(@tel).catch(&method(:raise_setup_error)).then { |sgx|
+			@customer.register!(@tel).catch(&method(:raise_setup_error)).then {
 				EMPromise.all([
 					REDIS.del("pending_tel_for-#{@customer.jid}"),
-					sgx.set_fwd(cheogram_sip_addr),
-					sgx.set_fwd_timeout(25) # ~5 seconds / ring, 5 rings
+					Bwmsgsv2Repo.new.put_fwd(@customer.customer_id, @tel, CustomerFwd.for(
+						uri: "xmpp:#{@customer.jid}", timeout: 25 # ~5 seconds / ring, 5 rings
+					))
 				])
 			}.then do
 				Command.finish("Your JMP account has been activated as #{@tel}")

sgx_jmp.rb 🔗

@@ -617,12 +617,12 @@ Command.new(
 			if ["1", "true"].include?(fwd.form.field("change_fwd")&.value.to_s)
 				# Migrate location if needed
 				BandwidthIris::SipPeer.new(
-					site_id: CONFIG[:bandwidth_site],
-					id: CONFIG[:bandwidth_peer]
+					site_id: CONFIG[:bandwidth_site], id: CONFIG[:bandwidth_peer]
 				).move_tns([customer.registered?.phone])
-				customer.set_fwd(sip_account.uri).then do
-					Command.finish("Inbound calls will now forward to SIP.")
-				end
+				Command.execution.customer_repo.put_fwd(
+					customer,
+					customer.fwd.with(uri: sip_account.uri)
+				).then { Command.finish("Inbound calls will now forward to SIP.") }
 			else
 				Command.finish
 			end

test/test_customer_repo.rb 🔗

@@ -3,6 +3,10 @@
 require "test_helper"
 require "customer_repo"
 
+class CustomerRepo
+	attr_reader :sgx_repo
+end
+
 class CustomerRepoTest < Minitest::Test
 	FAKE_REDIS = FakeRedis.new(
 		# sgx-jmp customer
@@ -51,7 +55,13 @@ class CustomerRepoTest < Minitest::Test
 		db: FAKE_DB,
 		braintree: Minitest::Mock.new
 	)
-		CustomerRepo.new(redis: redis, db: db, braintree: braintree)
+		sgx_repo = Minitest::Mock.new(TrivialBackendSgxRepo.new)
+		CustomerRepo.new(
+			redis: redis,
+			db: db,
+			braintree: braintree,
+			sgx_repo: sgx_repo
+		)
 	end
 
 	def setup
@@ -153,4 +163,73 @@ class CustomerRepoTest < Minitest::Test
 		assert_mock redis
 	end
 	em :test_create
+
+	def test_put_lidb_name
+		post = stub_request(
+			:post,
+			"https://dashboard.bandwidth.com/v1.0/accounts//lidbs"
+		).with(body: {
+			CustomerOrderId: "test",
+			LidbTnGroups: {
+				LidbTnGroup: {
+					TelephoneNumbers: "5556667777",
+					SubscriberInformation: "Hank",
+					UseType: "RESIDENTIAL",
+					Visibility: "PUBLIC"
+				}
+			}
+		}.to_xml(root: "LidbOrder", indent: 0)).to_return(
+			status: 201,
+			headers: { location: "/boop/123" }
+		)
+
+		stub_request(
+			:get,
+			"https://dashboard.bandwidth.com/v1.0/accounts//lidbs/123"
+		)
+
+		@repo.put_lidb_name(
+			Customer.new(
+				"test",
+				"test@exmple.com",
+				sgx: OpenStruct.new(registered?: OpenStruct.new(phone: "+15556667777"))
+			),
+			"Hank"
+		)
+
+		assert_requested post
+	end
+	em :test_put_lidb_name
+
+	def test_put_transcription_enabled
+		@repo.sgx_repo.expect(
+			:put_transcription_enabled,
+			EMPromise.resolve(nil),
+			["test", true]
+		)
+		@repo.put_transcription_enabled(
+			Customer.new("test", "test@exmple.com"),
+			true
+		)
+		assert_mock @repo.sgx_repo
+	end
+	em :test_put_transcription_enabled
+
+	def test_put_fwd
+		@repo.sgx_repo.expect(
+			:put_fwd,
+			EMPromise.resolve(nil),
+			["test", "+15556667777", :fwd]
+		)
+		@repo.put_fwd(
+			Customer.new(
+				"test",
+				"test@exmple.com",
+				sgx: OpenStruct.new(registered?: OpenStruct.new(phone: "+15556667777"))
+			),
+			:fwd
+		)
+		assert_mock @repo.sgx_repo
+	end
+	em :test_put_fwd
 end

test/test_registration.rb 🔗

@@ -517,7 +517,7 @@ class RegistrationTest < Minitest::Test
 		Command::COMMAND_MANAGER = Minitest::Mock.new
 		Registration::Finish::TEL_SELECTIONS = FakeTelSelections.new
 		Registration::Finish::REDIS = Minitest::Mock.new
-		BackendSgx::REDIS = Minitest::Mock.new
+		Bwmsgsv2Repo::REDIS = Minitest::Mock.new
 
 		def setup
 			@sgx = Minitest::Mock.new(TrivialBackendSgxRepo.new.get("test"))
@@ -568,15 +568,15 @@ class RegistrationTest < Minitest::Test
 				nil,
 				["pending_tel_for-test@example.net"]
 			)
-			BackendSgx::REDIS.expect(
+			Bwmsgsv2Repo::REDIS.expect(
 				:set,
 				nil,
 				[
 					"catapult_fwd-+15555550000",
-					"sip:test%40example.net@sip.cheogram.com"
+					"xmpp:test@example.net"
 				]
 			)
-			BackendSgx::REDIS.expect(
+			Bwmsgsv2Repo::REDIS.expect(
 				:set,
 				nil,
 				["catapult_fwd_timeout-customer_test@component", 25]
@@ -608,7 +608,7 @@ class RegistrationTest < Minitest::Test
 			assert_requested create_order
 			assert_mock @sgx
 			assert_mock Registration::Finish::REDIS
-			assert_mock BackendSgx::REDIS
+			assert_mock Bwmsgsv2Repo::REDIS
 			assert_mock blather
 		end
 		em :test_write