---
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