Merge pull request #1589 from internetee/add-disputed-domains-to-retained-api

Add disputed domains to retained API
This commit is contained in:
Timo Võhmar 2020-05-28 17:49:19 +03:00 committed by GitHub
commit a8cfba6564
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 84 additions and 15 deletions

View file

@ -3,6 +3,7 @@
class RetainedDomains
RESERVED = 'reserved'.freeze
BLOCKED = 'blocked'.freeze
DISPUTED = 'disputed'.freeze
attr_reader :domains,
:type
@ -26,14 +27,15 @@ class RetainedDomains
case type
when RESERVED then :reserved
when BLOCKED then :blocked
when DISPUTED then :disputed
else :all
end
end
def gather_domains
domains = blocked_domains.to_a.union(reserved_domains.to_a)
domains.sort_by(&:name)
blocked_domains.to_a
.union(reserved_domains.to_a)
.union(disputed_domains.to_a)
end
def blocked_domains
@ -52,18 +54,38 @@ class RetainedDomains
end
end
def domain_to_jsonable(domain)
status = case domain
when ReservedDomain then RESERVED
when BlockedDomain then BLOCKED
def disputed_domains
if %i[all disputed].include?(type)
Dispute.order(domain_name: :desc).active
else
[]
end
end
punycode = SimpleIDN.to_ascii(domain.name)
def domain_to_jsonable(domain)
status = get_status(domain)
domain_name = get_domain_name(domain)
punycode = SimpleIDN.to_ascii(domain_name)
{
name: 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

View file

@ -1,7 +1,11 @@
## GET /repp/v1/retained_domains
Return a list of reserved and blocked domains, along with total count. You can
filter them by type of the domain, which can be either reserved or blocked.
Return a list of disputed, reserved and blocked domains, along with total count.
You can filter them by type of the domain, which can be: `reserved`, `blocked`
or `disputed`.
NB! A domain name can be both `disputed` and `reserved` at the same time, and it
will appear on the list as two separate objects.
In contrast with other endpoints in REPP, this one is publicly available for
anyone without authentication.
@ -10,7 +14,7 @@ anyone without authentication.
| Field name | Required | Type | Allowed values | Description |
| ---------- | -------- | ---- | -------------- | ----------- |
| type | false | string | ["reserved", "blocked"] | Type of domains to show |
| type | false | string | ["reserved", "blocked", "disputed"] | Type of domains to show |
#### Request

View file

@ -37,6 +37,49 @@ class ReppV1RetainedDomainsTest < ActionDispatch::IntegrationTest
assert_equal response_json[:domains], expected_objects
end
def test_get_index_disputed_type
dispute = Dispute.new(domain_name: 'disputed.test', starts_at: Time.zone.today, password: 'disputepw')
dispute.save
get repp_v1_retained_domains_path({ 'type' => 'disputed' })
response_json = JSON.parse(response.body, symbolize_names: true)
assert response_json[:count] == 1
expected_objects = [{ name: 'disputed.test',
status: 'disputed',
punycode_name: 'disputed.test' }]
assert_equal response_json[:domains], expected_objects
end
# A disputed domain can be also reserved, and according
# to business rules it should appear on the list twice.
def test_domain_can_appear_twice_if_it_is_disputed_and_reserved
dispute = Dispute.new(domain_name: 'reserved.test', starts_at: Time.zone.today, password: 'disputepw')
dispute.save
get repp_v1_retained_domains_path
response_json = JSON.parse(response.body, symbolize_names: true)
assert response_json[:count] == 4
expected_objects = [{ name: 'blocked.test',
status: 'blocked',
punycode_name: 'blocked.test' },
{ name: 'blockedäöüõ.test',
status: 'blocked',
punycode_name: 'xn--blocked-cxa7mj0e.test' },
{ name: 'reserved.test',
status: 'reserved',
punycode_name: 'reserved.test' },
{ name: 'reserved.test',
status: 'disputed',
punycode_name: 'reserved.test' }]
assert_equal response_json[:domains], expected_objects
end
def test_etags_cache
get repp_v1_retained_domains_path({ 'type' => 'reserved' })
etag = response.headers['ETag']