bandwidth_tn_order.rb

  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