customer_ogm.rb

 1# frozen_string_literal: true
 2
 3module CustomerOGM
 4	def self.for(url, tel, fetch_vcard)
 5		return Media.new(url) if url
 6
 7		TTS.for(tel, fetch_vcard)
 8	end
 9
10	class Media
11		def initialize(url)
12			@url = url
13		end
14
15		def to_render
16			[:voicemail_ogm_media, { locals: { url: @url } }]
17		end
18	end
19
20	class TTS
21		def self.for(tel, fetch_vcard)
22			fetch_vcard.call.then { |vcard|
23				new(tel, vcard.first.payload_node)
24			}.catch { new(tel, Nokogiri::XML::Document.new) }
25		end
26
27		def initialize(tel, vcard)
28			@tel = tel
29			@vcard = vcard
30		end
31
32		def [](k)
33			value = @vcard.find_first(
34				"./ns:#{k.downcase}/ns:text",
35				ns: "urn:ietf:params:xml:ns:vcard-4.0"
36			)
37			return if !value || value.content.empty?
38
39			value.content
40		end
41
42		def fn
43			self["FN"] || self["NICKNAME"] || formatted_tel
44		end
45
46		def formatted_tel
47			@tel.sub(/\A\+?1?(\d{3})(\d{3})/, "(\\1) \\2-")
48		end
49
50		def to_render
51			[:voicemail_ogm_tts, { locals: { fn: fn } }]
52		end
53	end
54end