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		EM.promise_fiber 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}")
19		bw_tel = tel.sub(/^\+?1?/, "")
20		EM.promise_fiber do
21			Received.new(BandwidthIris::Order.create(
22				name: name,
23				site_id: CONFIG[:bandwidth_site],
24				existing_telephone_number_order_type: {
25					telephone_number_list: { telephone_number: [bw_tel] }
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 poll
74			EMPromise.resolve(self)
75		end
76	end
77
78	class Failed < BandwidthTNOrder
79		def status
80			:failed
81		end
82
83		def poll
84			raise "Order failed: #{id} #{error_description}"
85		end
86	end
87end