# frozen_string_literal: true require "lazy_object" require_relative "customer_fwd" require_relative "ibr_repo" require_relative "trivial_backend_sgx_repo" class Bwmsgsv2Repo VOICEMAIL_TRANSCRIPTION_DISABLED = 0 def initialize( jid: CONFIG[:sgx], redis: LazyObject.new { REDIS }, ibr_repo: IBRRepo.new, **kwargs ) @jid = jid @redis = redis @ibr_repo = ibr_repo @trivial_repo = TrivialBackendSgxRepo.new(jid: jid, **kwargs) end def get(customer_id) sgx = @trivial_repo.get(customer_id) fetch_raw(sgx.from_jid).then do |(((ogm_url, fwd_time, fwd), trans_d), reg)| sgx.with( ogm_url: ogm_url, fwd: CustomerFwd.for(uri: fwd, timeout: fwd_time), transcription_enabled: !trans_d, registered?: reg ) end end def put_transcription_enabled(customer_id, enabled) sgx = @trivial_repo.get(customer_id) REDIS.setbit( "catapult_settings_flags-#{sgx.from_jid}", Bwmsgsv2Repo::VOICEMAIL_TRANSCRIPTION_DISABLED, enabled ? 0 : 1 ) end def put_fwd(customer_id, tel, customer_fwd) sgx = @trivial_repo.get(customer_id) EMPromise.all([ set_or_delete("catapult_fwd-#{tel}", customer_fwd.uri), set_or_delete( "catapult_fwd_timeout-#{sgx.from_jid}", customer_fwd.timeout.to_i ) ]).then do set_default_location(tel) if customer_fwd.v2_safe? end end protected def set_default_location(tel) # Migrate location if needed BandwidthIris::SipPeer.new( site_id: CONFIG[:bandwidth_site], id: CONFIG[:bandwidth_peer] ).move_tns([tel]) end def set_or_delete(k, v) if v.nil? REDIS.del(k) else REDIS.set(k, v) end end def fetch_raw(from_jid) registration(from_jid).then do |r| EMPromise.all([from_redis(from_jid, r ? r.phone : nil), r]) end end def registration(from_jid) @ibr_repo.registered?(@jid, from: from_jid) end def from_redis(from_jid, tel) EMPromise.all([ @redis.mget(*[ "catapult_ogm_url-#{from_jid}", "catapult_fwd_timeout-#{from_jid}", ("catapult_fwd-#{tel}" if tel) ].compact), @redis.getbit( "catapult_settings_flags-#{from_jid}", VOICEMAIL_TRANSCRIPTION_DISABLED ).then { |x| x == 1 } ]) end end