# frozen_string_literal: true
require "forwardable"
require "ruby-bandwidth-iris"
Faraday.default_adapter = :em_synchrony
require_relative "./catapult"
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 tel
"+1#{@order.completed_numbers[:telephone_number][:full_number]}"
end
def poll
catapult_import.then do |http|
raise "Catapult import failed" unless http.response_header.status == 201
self
end
end
protected
# After buying, import to catapult and set v1 voice app
def catapult_import
CATAPULT.import(
number: tel,
provider: dashboard_provider
)
end
def dashboard_provider
{
providerName: "bandwidth-dashboard",
properties: {
accountId: CONFIG[:creds][:account],
userName: CONFIG[:creds][:username],
password: CONFIG[:creds][:password]
}
}
end
end
class Failed < BandwidthTNOrder
def status
:failed
end
def poll
raise "Order failed: #{id} #{error_description}"
end
end
end