customer_info_form.rb

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