# frozen_string_literal: true
require "securerandom"
require "value_semantics/monkey_patched"
require_relative "./catapult"
require_relative "./mn_words"
class SipAccount
def self.find(name)
CATAPULT.endpoint_find(name).then do |found|
next New.new(username: name) unless found
new(username: found["name"], url: found["url"])
end
end
module Common
def with_random_password
with(password: MN_WORDS.sample(3).join(" "))
end
protected
def create
CATAPULT.create_endpoint(
name: username,
credentials: { password: password }
).then do |url|
with(url: url)
end
end
end
include Common
value_semantics do
url String
username String
password Either(String, nil), default: nil
end
def form
form = Blather::Stanza::X.new(:result)
form.title = "Sip Account Reset!"
form.instructions = "These are your new SIP credentials"
form.fields = [
{ var: "username", value: username, label: "Username" },
{ var: "password", value: password, label: "Password" },
{ var: "server", value: server, label: "Server" }
]
form
end
def put
delete.then { create }
end
def delete
CATAPULT.delete(url).then do |http|
unless http.response_header.status == 200
raise "Delete old SIP account failed"
end
self
end
end
protected
protected :url, :username, :password
def server
CATAPULT.sip_host
end
class New
include Common
value_semantics do
username String
password String, default_generator: -> { MN_WORDS.sample(3).join(" ") }
end
def put
create
end
def with(**kwargs)
if kwargs.key?(:url)
SipAccount.new(internal_to_h.merge(kwargs))
else
super
end
end
protected :username, :password
end
end