1# frozen_string_literal: true
2
3require "forwardable"
4require "ruby-bandwidth-iris"
5Faraday.default_adapter = :em_synchrony
6
7require_relative "./catapult"
8
9class BandwidthTNOrder
10 def self.get(id)
11 EMPromise.resolve(nil).then do
12 self.for(BandwidthIris::Order.get_order_response(
13 # https://github.com/Bandwidth/ruby-bandwidth-iris/issues/44
14 BandwidthIris::Client.new,
15 id
16 ))
17 end
18 end
19
20 def self.create(tel, name: "sgx-jmp order #{tel}")
21 EMPromise.resolve(nil).then do
22 Received.new(BandwidthIris::Order.create(
23 name: name,
24 site_id: CONFIG[:bandwidth_site],
25 peer_id: CONFIG[:bandwidth_peer],
26 existing_telephone_number_order_type: {
27 telephone_number_list: { telephone_number: [tel.sub(/^\+?1?/, "")] }
28 }
29 ))
30 end
31 end
32
33 def self.for(bandwidth_order)
34 const_get(bandwidth_order.order_status.capitalize).new(bandwidth_order)
35 rescue NameError
36 new(bandwidth_order)
37 end
38
39 extend Forwardable
40 def_delegators :@order, :id
41
42 def initialize(bandwidth_order)
43 @order = bandwidth_order
44 end
45
46 def status
47 @order[:order_status]&.downcase&.to_sym
48 end
49
50 def error_description
51 @order[:error_list]&.dig(:error, :description)
52 end
53
54 def poll
55 raise "Unknown order status: #{status}"
56 end
57
58 class Received < BandwidthTNOrder
59 def status
60 :received
61 end
62
63 def poll
64 EM.promise_timer(1).then do
65 BandwidthTNOrder.get(id).then(&:poll)
66 end
67 end
68 end
69
70 class Complete < BandwidthTNOrder
71 def status
72 :complete
73 end
74
75 def tel
76 "+1#{@order.completed_numbers[:telephone_number][:full_number]}"
77 end
78
79 def poll
80 catapult_import.then do |http|
81 raise "Catapult import failed" unless http.response_header.status == 201
82
83 self
84 end
85 end
86
87 protected
88
89 # After buying, import to catapult and set v1 voice app
90 def catapult_import
91 CATAPULT.import(
92 number: tel,
93 provider: dashboard_provider
94 )
95 end
96
97 def dashboard_provider
98 {
99 providerName: "bandwidth-dashboard",
100 properties: {
101 accountId: CONFIG[:creds][:account],
102 userName: CONFIG[:creds][:username],
103 password: CONFIG[:creds][:password]
104 }
105 }
106 end
107 end
108
109 class Failed < BandwidthTNOrder
110 def status
111 :failed
112 end
113
114 def poll
115 raise "Order failed: #{id} #{error_description}"
116 end
117 end
118end