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