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}")
19 EMPromise.resolve(nil).then do
20 Received.new(BandwidthIris::Order.create(
21 name: name,
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