diff --git a/lib/trust_level.rb b/lib/trust_level.rb index 49958acfd540a62c937b2f2298f9dff79fd2198d..aa75c0be1be0d8abd59c0e98354d9d645e8ea57e 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 8b76b43dad70b82aa9fd0ec3872bc4542605e3f1..85dc91e25a8035c6d6c0e1d62cf35971cac55c2a 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 69b5564ae7032178229d6d464cc38be357d8ba61..3e9a835f540c34d5caae9f52721e514235dcafa3 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