trust_level_repo.rb

 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