sip_account.rb

  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