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