# frozen_string_literal: true require "forwardable" require "ruby-bandwidth-iris" Faraday.default_adapter = :em_synchrony class BandwidthTNOrder def self.get(id) EM.promise_fiber do self.for(BandwidthIris::Order.get_order_response( # https://github.com/Bandwidth/ruby-bandwidth-iris/issues/44 BandwidthIris::Client.new, id )) end end def self.create(tel, name: "sgx-jmp order #{tel}") bw_tel = tel.sub(/^\+?1?/, "") EM.promise_fiber do Received.new(BandwidthIris::Order.create( name: name, site_id: CONFIG[:bandwidth_site], existing_telephone_number_order_type: { telephone_number_list: { telephone_number: [bw_tel] } } )) end end def self.for(bandwidth_order) const_get(bandwidth_order.order_status.capitalize).new(bandwidth_order) rescue NameError new(bandwidth_order) end extend Forwardable def_delegators :@order, :id def initialize(bandwidth_order) @order = bandwidth_order end def status @order[:order_status]&.downcase&.to_sym end def error_description @order[:error_list]&.dig(:error, :description) end def poll raise "Unknown order status: #{status}" end class Received < BandwidthTNOrder def status :received end def poll EM.promise_timer(1).then do BandwidthTNOrder.get(id).then(&:poll) end end end class Complete < BandwidthTNOrder def status :complete end def poll EMPromise.resolve(self) end end class Failed < BandwidthTNOrder def status :failed end def poll raise "Order failed: #{id} #{error_description}" end end end