customer_info_form.rb

 1# frozen_string_literal: true
 2
 3require_relative "bwmsgsv2_repo"
 4require_relative "customer_repo"
 5require_relative "proxied_jid"
 6require_relative "legacy_customer"
 7
 8class CustomerInfoForm
 9	def initialize(customer_repo=CustomerRepo.new(sgx_repo: Bwmsgsv2Repo.new))
10		@customer_repo = customer_repo
11	end
12
13	def picker_form
14		form = Blather::Stanza::X.new(:form)
15		form.title = "Pick Customer"
16		form.instructions = "Tell us something about the customer and we'll try " \
17			"to get more information for you"
18
19		form.fields = {
20			var: "q", type: "text-single",
21			label: "Something about the customer",
22			description: "Supported things include: customer ID, JID, phone number"
23		}
24
25		form
26	end
27
28	def find_customer(response)
29		parse_something(response.form.field("q").value)
30	end
31
32	class NoCustomer
33		class AdminInfo
34			def fields
35				[{ var: "Account Status", value: "Not Found" }]
36			end
37		end
38
39		def admin_info
40			AdminInfo.new
41		end
42	end
43
44	def parse_something(value)
45		parser = Parser.new(@customer_repo)
46
47		EMPromise.all([
48			parser.as_customer_id(value),
49			parser.as_jid(value),
50			parser.as_phone(value),
51			EMPromise.resolve(NoCustomer.new)
52		]).then { |approaches| approaches.compact.first }
53	end
54
55	class Parser
56		def initialize(customer_repo)
57			@customer_repo = customer_repo
58		end
59
60		def as_customer_id(value)
61			@customer_repo.find(value).catch { nil }
62		end
63
64		def as_cheo(value)
65			ProxiedJID.proxy(Blather::JID.new(value))
66		end
67
68		def as_jid(value)
69			EMPromise.all([
70				@customer_repo.find_by_jid(value).catch { nil },
71				@customer_repo.find_by_jid(as_cheo(value)).catch { nil }
72			]).then { |approaches| approaches.compact.first }
73		end
74
75		def as_phone(value)
76			unless value.gsub(/[^0-9]/, "") =~ /^\+?1?(\d{10})$/
77				return EMPromise.resolve(nil)
78			end
79
80			@customer_repo.find_by_tel("+1#{$1}").catch { nil }
81		end
82	end
83end