app/models/retained_domains.rb
# Hiding the queries behind its own class will allow us to include disputed or
# auctioned domains without meddling up with controller logic.
class RetainedDomains
RESERVED = 'reserved'.freeze
BLOCKED = 'blocked'.freeze
DISPUTED = 'disputed'.freeze
attr_reader :domains,
:type
def initialize(params)
@type = establish_type(params)
@domains = gather_domains
end
delegate :count, to: :domains
def to_jsonable
domains.map { |el| domain_to_jsonable(el) }
end
private
def establish_type(params)
type = params[:type]
case type
when RESERVED then :reserved
when BLOCKED then :blocked
when DISPUTED then :disputed
else :all
end
end
def gather_domains
blocked_domains.to_a
.union(reserved_domains.to_a)
.union(disputed_domains.to_a)
end
def blocked_domains
if %i[all blocked].include?(type)
BlockedDomain.order(name: :desc).all
else
[]
end
end
def reserved_domains
if %i[all reserved].include?(type)
ReservedDomain.order(name: :desc).all
else
[]
end
end
def disputed_domains
if %i[all disputed].include?(type)
Dispute.order(domain_name: :desc).active
else
[]
end
end
def domain_to_jsonable(domain)
status = get_status(domain)
domain_name = get_domain_name(domain)
punycode = SimpleIDN.to_ascii(domain_name)
{
name: domain_name,
status: status,
punycode_name: punycode,
}
end
def get_status(domain)
case domain
when ReservedDomain then RESERVED
when BlockedDomain then BLOCKED
when Dispute then DISPUTED
end
end
def get_domain_name(domain)
case domain
when Dispute then domain.domain_name
else domain.name
end
end
end