trivial_backend_sgx_repo.rb

 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