bwmsgsv2_repo.rb

 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	VOICEMAIL_ALT_TRANSCRIPTION = 1
12
13	def initialize(
14		jid: CONFIG[:sgx],
15		redis: LazyObject.new { REDIS },
16		ibr_repo: IBRRepo.new,
17		**kwargs
18	)
19		@jid = jid
20		@redis = redis
21		@ibr_repo = ibr_repo
22		@trivial_repo = TrivialBackendSgxRepo.new(jid: jid, **kwargs)
23	end
24
25	def get(customer_id)
26		sgx = @trivial_repo.get(customer_id)
27		fetch_raw(sgx.from_jid).then do |(((ogm_url, fwd_time, fwd), flags), reg)|
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				alternate_transcription_enabled: flags[VOICEMAIL_ALT_TRANSCRIPTION],
33				registered?: reg
34			)
35		end
36	end
37
38	def put_transcription_enabled(customer_id, enabled)
39		sgx = @trivial_repo.get(customer_id)
40		REDIS.setbit(
41			"catapult_settings_flags-#{sgx.from_jid}",
42			Bwmsgsv2Repo::VOICEMAIL_TRANSCRIPTION_DISABLED,
43			enabled ? 0 : 1
44		)
45	end
46
47	def put_fwd(customer_id, tel, customer_fwd)
48		sgx = @trivial_repo.get(customer_id)
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
58protected
59
60	def set_or_delete(k, v)
61		if v.nil?
62			REDIS.del(k)
63		else
64			REDIS.set(k, v)
65		end
66	end
67
68	def fetch_raw(from_jid)
69		registration(from_jid).then do |r|
70			EMPromise.all([from_redis(from_jid, r ? r.phone : nil), r])
71		end
72	end
73
74	def registration(from_jid)
75		@ibr_repo.registered?(@jid, from: from_jid)
76	end
77
78	def from_redis(from_jid, tel)
79		EMPromise.all([
80			@redis.mget(*[
81				"catapult_ogm_url-#{from_jid}",
82				"catapult_fwd_timeout-#{from_jid}",
83				("catapult_fwd-#{tel}" if tel)
84			].compact),
85			unpack_flags(from_jid)
86		])
87	end
88
89	def unpack_flags(from_jid)
90		@redis.bitfield(
91			"catapult_settings_flags-#{from_jid}",
92			"GET", "u1", VOICEMAIL_TRANSCRIPTION_DISABLED,
93			"GET", "u1", VOICEMAIL_ALT_TRANSCRIPTION
94		).then { |arr| arr.map { |x| x.to_i == 1 } }
95	end
96end