bandwidth_tn_order.rb

 1# frozen_string_literal: true
 2
 3require "forwardable"
 4require "ruby-bandwidth-iris"
 5Faraday.default_adapter = :em_synchrony
 6
 7class BandwidthTNOrder
 8	def self.get(id)
 9		EMPromise.resolve(nil).then do
10			self.for(BandwidthIris::Order.get_order_response(
11				# https://github.com/Bandwidth/ruby-bandwidth-iris/issues/44
12				BandwidthIris::Client.new,
13				id
14			))
15		end
16	end
17
18	def self.create(tel, name: "sgx-jmp order #{tel}", **kwargs)
19		EMPromise.resolve(nil).then do
20			Received.new(BandwidthIris::Order.create(
21				name: name, **kwargs,
22				site_id: CONFIG[:bandwidth_site],
23				peer_id: CONFIG[:bandwidth_peer],
24				existing_telephone_number_order_type: {
25					telephone_number_list: { telephone_number: [tel.sub(/^\+?1?/, "")] }
26				}
27			))
28		end
29	end
30
31	def self.for(bandwidth_order)
32		const_get(bandwidth_order.order_status.capitalize).new(bandwidth_order)
33	rescue NameError
34		new(bandwidth_order)
35	end
36
37	extend Forwardable
38	def_delegators :@order, :id
39
40	def initialize(bandwidth_order)
41		@order = bandwidth_order
42	end
43
44	def status
45		@order[:order_status]&.downcase&.to_sym
46	end
47
48	def error_description
49		@order[:error_list]&.dig(:error, :description)
50	end
51
52	def poll
53		raise "Unknown order status: #{status}"
54	end
55
56	class Received < BandwidthTNOrder
57		def status
58			:received
59		end
60
61		def poll
62			EM.promise_timer(1).then do
63				BandwidthTNOrder.get(id).then(&:poll)
64			end
65		end
66	end
67
68	class Complete < BandwidthTNOrder
69		def status
70			:complete
71		end
72
73		def tel
74			"+1#{@order.completed_numbers[:telephone_number][:full_number]}"
75		end
76
77		def poll
78			EMPromise.resolve(self)
79		end
80	end
81
82	class Failed < BandwidthTNOrder
83		def status
84			:failed
85		end
86
87		def poll
88			raise "Order failed: #{id} #{error_description}"
89		end
90	end
91end