1# frozen_string_literal: true
2
3require_relative "backend_sgx"
4require_relative "not_loaded"
5
6class TrivialBackendSgxRepo
7 def initialize(
8 jid: CONFIG[:sgx],
9 creds: CONFIG[:creds],
10 component_jid: CONFIG[:component][:jid],
11 redis: LazyObject.new { REDIS },
12 **with
13 )
14 @jid = Blather::JID.new(jid)
15 @creds = creds
16 @component_jid = component_jid
17 @redis = redis
18 @with = with
19 end
20
21 def self.get_unregistered(customer_id, **kwargs)
22 new(**kwargs).get(customer_id).then { |s| s.with(registered?: false) }
23 end
24
25 def get(customer_id, tel: nil)
26 use_jid(customer_id).then do |(sgx_jid, creds)|
27 BackendSgx.new(
28 jid: sgx_jid, creds: creds,
29 from_jid: Blather::JID.new("customer_#{customer_id}", @component_jid),
30 ogm_url: NotLoaded.new(:ogm_url), fwd: NotLoaded.new(:fwd_timeout),
31 transcription_enabled: NotLoaded.new(:transcription_enabled),
32 registered?: tel ? ibr_for(tel) : NotLoaded.new(:registered?)
33 ).with(@with)
34 end
35 end
36
37 def put(cid, target_sgx, target_num)
38 get(cid).then(&:deregister!).then {
39 put_jid(cid, target_sgx)
40 }.then {
41 get(cid)
42 }.then { |sgx|
43 sgx.register!(target_num)
44 }
45 end
46
47protected
48
49 def put_jid(cid, target_sgx)
50 if target_sgx == CONFIG[:sgx]
51 @redis.del("jmp_customer_backend_sgx-#{cid}")
52 else
53 @redis.set("jmp_customer_backend_sgx-#{cid}", target_sgx)
54 end
55 end
56
57 def default_jid_creds
58 EMPromise.resolve([@jid, @creds])
59 end
60
61 def use_jid(customer_id)
62 return default_jid_creds unless @jid.node.nil?
63
64 @redis.get("jmp_customer_backend_sgx-#{customer_id}").then do |sgx_jid|
65 if sgx_jid
66 [Blather::JID.new(sgx_jid), CONFIG[:sgx_creds][sgx_jid.to_sym]]
67 else
68 default_jid_creds
69 end
70 end
71 end
72
73 def ibr_for(tel)
74 ibr = Blather::Stanza::Iq::IBR.new
75 ibr.registered = true
76 ibr.phone = tel
77 ibr
78 end
79end