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 find_customer(response)
13		parse_something(response.form.field("q").value)
14	end
15
16	class NoCustomer
17		def form
18			FormTemplate.render("no_customer_info")
19		end
20
21		def admin_info
22			self
23		end
24
25		def registered?
26			false
27		end
28	end
29
30	def parse_something(value)
31		return EMPromise.resolve(NoCustomer.new) if value.to_s.empty?
32
33		EMPromise.all([
34			find_customer_one(value),
35			find_customer_one(Blather::JID.new(value)),
36			find_customer_one(ProxiedJID.proxy(value)),
37			find_customer_by_phone(value),
38			EMPromise.resolve(NoCustomer.new)
39		]).then { |approaches| approaches.compact.first }
40	end
41
42	def find_customer_one(q)
43		@customer_repo.find_by_format(q).catch { nil }
44	end
45
46	def find_customer_by_phone(value)
47		value
48			.gsub(/\D/, "")
49			.match(/\A1?(\d{10})\Z/)
50			&.[](1)
51			&.then { |tn| find_customer_one("+1#{tn}") }
52	end
53end