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