1# frozen_string_literal: true
 2
 3require "lazy_object"
 4
 5require_relative "customer_fwd"
 6require_relative "ibr_repo"
 7require_relative "trivial_backend_sgx_repo"
 8
 9class Bwmsgsv2Repo
10	VOICEMAIL_TRANSCRIPTION_DISABLED = 0
11
12	def initialize(
13		jid: CONFIG[:sgx],
14		redis: LazyObject.new { REDIS },
15		ibr_repo: IBRRepo.new,
16		**kwargs
17	)
18		@jid = jid
19		@redis = redis
20		@ibr_repo = ibr_repo
21		@trivial_repo = TrivialBackendSgxRepo.new(jid: jid, redis: redis, **kwargs)
22	end
23
24	def get(customer_id, tel: nil)
25		@trivial_repo.get(customer_id, tel: tel)
26			.then { |sgx| EMPromise.all([fetch_raw(sgx), sgx]) }
27			.then do |((((ogm_url, fwd_time, fwd), flags), reg), sgx)|
28				sgx.with(
29					ogm_url: ogm_url,
30					fwd: CustomerFwd.for(uri: fwd, timeout: fwd_time),
31					transcription_enabled: !flags[VOICEMAIL_TRANSCRIPTION_DISABLED],
32					registered?: reg
33				)
34			end
35	end
36
37	def put_transcription_enabled(customer_id, enabled)
38		@trivial_repo.get(customer_id).then do |sgx|
39			REDIS.setbit(
40				"catapult_settings_flags-#{sgx.from_jid}",
41				Bwmsgsv2Repo::VOICEMAIL_TRANSCRIPTION_DISABLED,
42				enabled ? 0 : 1
43			)
44		end
45	end
46
47	def put_fwd(customer_id, tel, customer_fwd)
48		@trivial_repo.get(customer_id).then do |sgx|
49			EMPromise.all([
50				set_or_delete("catapult_fwd-#{tel}", customer_fwd.uri),
51				set_or_delete(
52					"catapult_fwd_timeout-#{sgx.from_jid}",
53					customer_fwd.timeout.to_i
54				)
55			])
56		end
57	end
58
59protected
60
61	def set_or_delete(k, v)
62		if v.nil?
63			REDIS.del(k)
64		else
65			REDIS.set(k, v)
66		end
67	end
68
69	def fetch_raw(sgx)
70		registration(sgx).then do |r|
71			EMPromise.all([from_redis(sgx.from_jid, r ? r.phone : nil), r])
72		end
73	end
74
75	def registration(sgx)
76		EMPromise.resolve(sgx.registered?)
77	rescue NotLoaded::NotLoadedError
78		@ibr_repo.registered?(sgx.jid, from: sgx.from_jid)
79	end
80
81	def from_redis(from_jid, tel)
82		EMPromise.all([
83			@redis.mget(*[
84				"catapult_ogm_url-#{from_jid}",
85				"catapult_fwd_timeout-#{from_jid}",
86				("catapult_fwd-#{tel}" if tel)
87			].compact),
88			unpack_flags(from_jid)
89		])
90	end
91
92	def unpack_flags(from_jid)
93		@redis.bitfield(
94			"catapult_settings_flags-#{from_jid}",
95			"GET", "u1", VOICEMAIL_TRANSCRIPTION_DISABLED
96		).then { |arr| arr.map { |x| x.to_i == 1 } }
97	end
98end