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