# frozen_string_literal: true require "em-synchrony/em-http" # For aget vs get 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