bwmsgsv2_repo.rb

  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