1# frozen_string_literal: true
2
3require "securerandom"
4require "value_semantics/monkey_patched"
5
6require_relative "./catapult"
7require_relative "./mn_words"
8
9class SipAccount
10 def self.find(name)
11 CATAPULT.endpoint_find(name).then do |found|
12 next New.new(username: name) unless found
13
14 new(username: found["name"], url: found["url"])
15 end
16 end
17
18 module Common
19 def with_random_password
20 with(password: MN_WORDS.sample(3).join(" "))
21 end
22
23 protected
24
25 def create
26 CATAPULT.create_endpoint(
27 name: username,
28 credentials: { password: password }
29 ).then do |url|
30 with(url: url)
31 end
32 end
33 end
34
35 include Common
36
37 value_semantics do
38 url String
39 username String
40 password Either(String, nil), default: nil
41 end
42
43 def form
44 form = Blather::Stanza::X.new(:result)
45 form.title = "Sip Account Reset!"
46 form.instructions = "These are your new SIP credentials"
47
48 form.fields = [
49 { var: "username", value: username, label: "Username" },
50 { var: "password", value: password, label: "Password" },
51 { var: "server", value: server, label: "Server" }
52 ]
53
54 form
55 end
56
57 def put
58 delete.then { create }
59 end
60
61 def delete
62 CATAPULT.delete(url).then do |http|
63 unless http.response_header.status == 200
64 raise "Delete old SIP account failed"
65 end
66
67 self
68 end
69 end
70
71protected
72
73 protected :url, :username, :password
74
75 def server
76 CATAPULT.sip_host
77 end
78
79 class New
80 include Common
81
82 value_semantics do
83 username String
84 password String, default_generator: -> { MN_WORDS.sample(3).join(" ") }
85 end
86
87 def put
88 create
89 end
90
91 def with(**kwargs)
92 if kwargs.key?(:url)
93 SipAccount.new(internal_to_h.merge(kwargs))
94 else
95 super
96 end
97 end
98
99 protected :username, :password
100 end
101end