customer_ogm.rb

 1# frozen_string_literal: true
 2
 3require_relative "tts_template"
 4
 5module CustomerOGM
 6	def self.for(url, tel, fetch_vcard)
 7		return Media.new(url) if url
 8
 9		TTS.for(tel, fetch_vcard)
10	end
11
12	class Media
13		def initialize(url)
14			@url = url
15		end
16
17		def to_render
18			[:voicemail_ogm_media, { locals: { url: @url } }]
19		end
20
21		def as_json(*)
22			{
23				media_url: @url
24			}
25		end
26
27		def to_json(*args)
28			as_json.to_json(*args)
29		end
30	end
31
32	class TTS
33		def self.for(tel, fetch_vcard)
34			fetch_vcard.call.then { |vcard|
35				new(tel, vcard.first.payload_node)
36			}.catch { new(tel, Nokogiri::XML::Document.new) }
37		end
38
39		def initialize(tel, vcard)
40			@tel = tel
41			@vcard = vcard
42		end
43
44		def [](k)
45			value = @vcard.find_first(
46				"./ns:#{k.downcase}/ns:text",
47				ns: "urn:ietf:params:xml:ns:vcard-4.0"
48			)
49			return if !value || value.content.empty?
50
51			value.content
52		end
53
54		def fn
55			self["FN"] || self["NICKNAME"] || formatted_tel
56		end
57
58		def formatted_tel
59			@tel.sub(/\A\+?1(\d{3})(\d{3})(\d+)/, "\\1.\\2.\\3").gsub(/(?=\d)/, " ")
60		end
61
62		def to_render
63			[:voicemail_ogm_tts, { locals: { fn: fn } }]
64		end
65
66		def as_json(*)
67			{
68				tts: TTSTemplate.new(to_render.first).tts(self)
69			}
70		end
71
72		def to_json(*args)
73			as_json.to_json(*args)
74		end
75	end
76end