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