~singpolyma/dev

This thread contains a patchset. You're looking at the original emails, but you may wish to use the patch review UI. Review patch

[PATCH] dont write cdr if tombed

Details
Message ID
<20241029183625.455292-1-phdavis1027@gmail.com>
DKIM signature
pass
Download raw message
Patch: +82 -8
---
 lib/trust_level.rb | 20 ++++++++++++++++++++
 test/test_web.rb   | 42 ++++++++++++++++++++++++++++++++++++++++--
 web.rb             | 28 ++++++++++++++++++++++------
 3 files changed, 82 insertions(+), 8 deletions(-)

diff --git a/lib/trust_level.rb b/lib/trust_level.rb
index 49958ac..aa75c0b 100644
--- a/lib/trust_level.rb
+++ b/lib/trust_level.rb
@@ -32,6 +32,10 @@ module TrustLevel
			new if manual == "Tomb"
		end

		def write_cdr?
			false
		end

		def support_call?(*)
			false
		end
@@ -58,6 +62,10 @@ module TrustLevel
			new if manual == "Basement" || (!manual && settled_amount < 10)
		end

		def write_cdr?
			true
		end

		def support_call?(rate, concurrency)
			rate <= 0.02 && concurrency < 1
		end
@@ -84,6 +92,10 @@ module TrustLevel
			new if manual == "Paragon" || (!manual && settled_amount > 60)
		end

		def write_cdr?
			true
		end

		def support_call?(_, concurrency)
			concurrency < 10
		end
@@ -110,6 +122,10 @@ module TrustLevel
			new if manual == "Olympias"
		end

		def write_cdr?
			true
		end

		def support_call?(*)
			true
		end
@@ -151,6 +167,10 @@ module TrustLevel
			@max_rate = EXPENSIVE_ROUTE.fetch(plan_name, 0.1)
		end

		def write_cdr?
			true
		end

		def support_call?(rate, concurrency)
			rate <= @max_rate && concurrency < 4
		end
diff --git a/test/test_web.rb b/test/test_web.rb
index 8b76b43..85dc91e 100644
--- a/test/test_web.rb
+++ b/test/test_web.rb
@@ -17,6 +17,10 @@ ReachableRedis = Minitest::Mock.new
class WebTest < Minitest::Test
	include Rack::Test::Methods

	def setup
		@cdr_repo = CDRRepo.new(db: FakeDB.new)
	end

	def app
		Web.opts[:customer_repo] = CustomerRepo.new(
			redis: FakeRedis.new(
@@ -33,7 +37,8 @@ class WebTest < Minitest::Test
				"jmp_customer_jid-customerid_reach" => "customerid_reach@example.com",
				"catapult_jid-+15551234563" => "customer_customerid_reach@component",
				"jmp_customer_jid-customerid2" => "customer2@example.com",
				"catapult_jid-+15551230000" => "customer_customerid2@component"
				"catapult_jid-+15551230000" => "customer_customerid2@component",
				"jmp_customer_jid-customerid_tombed" => "customer_tombed@example.com"
			),
			db: FakeDB.new(
				["customerid"] => [{
@@ -65,6 +70,11 @@ class WebTest < Minitest::Test
					"balance" => BigDecimal(10),
					"plan_name" => "test_usd",
					"expires_at" => Time.now + 100
				}],
				["customerid_tombed"] => [{
					"balance" => BigDecimal(10),
					"plan_name" => "test_usd",
					"expires_at" => Time.now + 100
				}]
			),
			sgx_repo: Bwmsgsv2Repo.new(
@@ -129,7 +139,13 @@ class WebTest < Minitest::Test
				)
			)
		)
		Web.opts[:cdr_repo] = CDRRepo.new(db: FakeDB.new)
		Web.opts[:cdr_repo] = @cdr_repo
		Web.opts[:trust_level_repo] = TrustLevelRepo.new(
			db: FakeDB.new,
			redis: FakeRedis.new(
				"jmp_customer_trust_level-customerid_tombed" => "Tomb"
			)
		)
		Web.opts[:common_logger] = FakeLog.new
		Web.opts[:reachability_repo] = ReachabilityRepo::Voice.new(
			redis: ReachableRedis,
@@ -424,6 +440,28 @@ class WebTest < Minitest::Test
	end
	em :test_outbound_disconnect

	def test_outbound_disconnect_tombed
		@cdr_repo.stub(:put, ->(*) { raise "put called" }) do
			post(
				"/outbound/calls/status",
				{
					eventType: "disconnect",
					from: "ccustomerid_tombed",
					to: "+15557654321",
					callId: "acall",
					startTime: Time.now.to_s,
					endTime: Time.now.to_s,
					cause: "hangup"
				}.to_json,
				{ "CONTENT_TYPE" => "application/json" }
			)
		end

		assert last_response.ok?
		assert_equal("OK", last_response.body)
	end
	em :test_outbound_disconnect_tombed

	def test_inbound
		CustomerFwd::BANDWIDTH_VOICE.expect(
			:create_call,
diff --git a/web.rb b/web.rb
index 69b5564..3e9a835 100644
--- a/web.rb
+++ b/web.rb
@@ -10,6 +10,7 @@ require "sentry-ruby"
require "thin"

require_relative "lib/call_attempt_repo"
require_relative "lib/trust_level_repo"
require_relative "lib/cdr"
require_relative "lib/cdr_repo"
require_relative "lib/oob"
@@ -109,6 +110,10 @@ class Web < Roda
		opts[:customer_repo] || CustomerRepo.new(**kwargs)
	end

	def trust_level_repo(**kwargs)
		opts[:trust_level_repo] || TrustLevelRepo.new(**kwargs)
	end

	def reachability_repo(**kwargs)
		opts[:reachability_repo] || ReachabilityRepo::Voice.new(**kwargs)
	end
@@ -433,13 +438,24 @@ class Web < Roda
				r.post "status" do
					log.info "#{params['eventType']} #{params['callId']}", loggable_params
					if params["eventType"] == "disconnect"
						customer_id = params["from"].sub(/^(?:\+|c)/, "")
						call_attempt_repo.ending_call(customer_id, params["callId"])
						cdr_repo
							.put(CDR.for_outbound(customer_id, params))
							.catch(&method(:log_error))
						from = params["from"].sub(/^(?:\+|c)/, "")

						customer_repo.find_by_format(from).then { |customer|
							trust_level_repo.find(customer).then { |tl| [customer, tl] }
						}.then { |(customer, trust_level)|
							next "OK" unless trust_level.write_cdr?

							customer_id = customer.customer_id
							call_attempt_repo.ending_call(customer_id, params["callId"])
							cdr_repo
								.put(CDR.for_outbound(customer_id, params))
								.catch(&method(:log_error))

							"OK"
						}
					else
						"OK"
					end
					"OK"
				end

				r.post do
-- 
2.34.1
Reply to thread Export thread (mbox)