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(customer_id, target_sgx)
38		get(customer_id).then(&:deregister!).then {
39			if target_sgx == CONFIG[:sgx]
40				@redis.del("jmp_customer_backend_sgx-#{customer_id}")
41			else
42				@redis.set("jmp_customer_backend_sgx-#{customer_id}", target_sgx)
43			end
44		}.then { get(customer_id) }
45	end
46
47protected
48
49	def default_jid_creds
50		EMPromise.resolve([@jid, @creds])
51	end
52
53	def use_jid(customer_id)
54		return default_jid_creds unless @jid.node.nil?
55
56		@redis.get("jmp_customer_backend_sgx-#{customer_id}").then do |sgx_jid|
57			if sgx_jid
58				[Blather::JID.new(sgx_jid), CONFIG[:sgx_creds][sgx_jid.to_sym]]
59			else
60				default_jid_creds
61			end
62		end
63	end
64
65	def ibr_for(tel)
66		ibr = Blather::Stanza::Iq::IBR.new
67		ibr.registered = true
68		ibr.phone = tel
69		ibr
70	end
71end