1# frozen_string_literal: true
2
3require "lazy_object"
4require "value_semantics/monkey_patched"
5
6require_relative "trust_level"
7
8class TrustLevelRepo
9 value_semantics do
10 db Anything(), default: LazyObject.new { DB }
11 redis Anything(), default: LazyObject.new { REDIS }
12 end
13
14 def find(customer)
15 EMPromise.all([
16 find_manual(customer.customer_id),
17 fetch_settled_amount(customer.billing_customer_id)
18 ]).then do |(manual, row)|
19 TrustLevel.for(
20 manual: manual,
21 plan_name: customer.plan_name,
22 **row
23 )
24 end
25 end
26
27 def find_manual(customer_id)
28 redis.get("jmp_customer_trust_level-#{customer_id}")
29 end
30
31 def put(customer_id, trust_level)
32 if trust_level
33 redis.set("jmp_customer_trust_level-#{customer_id}", trust_level)
34 else
35 redis.del("jmp_customer_trust_level-#{customer_id}")
36 end
37 end
38
39protected
40
41 def fetch_settled_amount(customer_id)
42 db.query_one(<<~SQL, customer_id, default: {})
43 SELECT COALESCE(SUM(amount), 0) AS settled_amount FROM transactions
44 WHERE customer_id=$1 AND settled_after < LOCALTIMESTAMP AND amount > 0
45 SQL
46 end
47end