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