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 redis.get("jmp_customer_activater-#{customer.billing_customer_id}"),
18 customer.activation_date,
19 fetch_was_invited(customer.customer_id),
20 fetch_settled_amount(customer.billing_customer_id)
21 ]).then do |(manual, activater, activated, invited, row)|
22 TrustLevel.for(
23 customer: customer,
24 manual: manual,
25 activated: activated,
26 invited: invited[:used_at],
27 activater: activater,
28 **row
29 )
30 end
31 end
32
33 def find_manual(customer_id)
34 redis.get("jmp_customer_trust_level-#{customer_id}")
35 end
36
37 def put(customer_id, trust_level)
38 if trust_level
39 redis.set("jmp_customer_trust_level-#{customer_id}", trust_level)
40 else
41 redis.del("jmp_customer_trust_level-#{customer_id}")
42 end
43 end
44
45 def incoming_message(customer, stanza)
46 from = stanza.from.node.to_s
47 return if from =~ /^$|^[^+]/ # don't count short codes
48
49 body = stanza.body.to_s
50 return if body =~ /^$|http|code/i
51
52 redis.sismember("jmp_blocked_activation_source", from).then { |blocked|
53 next if blocked.to_s == "1"
54
55 redis.set(
56 "jmp_customer_activater-#{customer.customer_id}", from, "NX"
57 )
58 }
59 end
60
61protected
62
63 def fetch_settled_amount(customer_id)
64 db.query_one(<<~SQL, customer_id, default: {})
65 SELECT COALESCE(SUM(amount), 0) AS settled_amount FROM transactions
66 WHERE customer_id=$1 AND settled_after < LOCALTIMESTAMP AND amount > 0
67 SQL
68 end
69
70 def fetch_was_invited(customer_id)
71 db.query_one(<<~SQL, customer_id, default: {})
72 SELECT used_at FROM invites WHERE used_by_id=$1 AND trusted LIMIT 1
73 SQL
74 end
75end