diff --git a/app/models/retained_domains.rb b/app/models/retained_domains.rb index b26bbab40..d9ab42b3b 100644 --- a/app/models/retained_domains.rb +++ b/app/models/retained_domains.rb @@ -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 - end + 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 diff --git a/doc/repp/v1/retained_domains.md b/doc/repp/v1/retained_domains.md index 4209b0f58..7484ff8f2 100644 --- a/doc/repp/v1/retained_domains.md +++ b/doc/repp/v1/retained_domains.md @@ -1,16 +1,20 @@ ## 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. #### Parameters -| Field name | Required | Type | Allowed values | Description | -| ---------- | -------- | ---- | -------------- | ----------- | -| type | false | string | ["reserved", "blocked"] | Type of domains to show | +| Field name | Required | Type | Allowed values | Description | +| ---------- | -------- | ---- | -------------- | ----------- | +| type | false | string | ["reserved", "blocked", "disputed"] | Type of domains to show | #### Request diff --git a/test/integration/repp/retained_domains_test.rb b/test/integration/repp/retained_domains_test.rb index dc3a9fd0f..1c9f49f58 100644 --- a/test/integration/repp/retained_domains_test.rb +++ b/test/integration/repp/retained_domains_test.rb @@ -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']