From 011967d8ea80bb5c6de4e60fe0ab281efbf86e9b Mon Sep 17 00:00:00 2001 From: Maciej Szlosarczyk Date: Thu, 28 May 2020 13:33:52 +0300 Subject: [PATCH 1/3] Add disputes to the list of retained domains --- app/models/retained_domains.rb | 26 ++++++++--- .../integration/repp/retained_domains_test.rb | 43 +++++++++++++++++++ 2 files changed, 64 insertions(+), 5 deletions(-) diff --git a/app/models/retained_domains.rb b/app/models/retained_domains.rb index b26bbab40..8ff8358f0 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,16 +54,30 @@ class RetainedDomains 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 = case domain when ReservedDomain then RESERVED when BlockedDomain then BLOCKED + when Dispute then DISPUTED end - punycode = SimpleIDN.to_ascii(domain.name) + domain_name = case domain + when Dispute then domain.domain_name + else domain.name + end + + punycode = SimpleIDN.to_ascii(domain_name) { - name: domain.name, + name: domain_name, status: status, punycode_name: punycode, } 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'] From 3aa978f722d07423d27e682fcec740707cc19cfa Mon Sep 17 00:00:00 2001 From: Maciej Szlosarczyk Date: Thu, 28 May 2020 14:02:58 +0300 Subject: [PATCH 2/3] Add disputed domains to API documentation --- doc/repp/v1/retained_domains.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) 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 From c7f95c41a2f87746f52dde097a36147eab1746c0 Mon Sep 17 00:00:00 2001 From: Maciej Szlosarczyk Date: Thu, 28 May 2020 14:24:18 +0300 Subject: [PATCH 3/3] Split "big" method into two smaller ones --- app/models/retained_domains.rb | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/app/models/retained_domains.rb b/app/models/retained_domains.rb index 8ff8358f0..d9ab42b3b 100644 --- a/app/models/retained_domains.rb +++ b/app/models/retained_domains.rb @@ -63,17 +63,8 @@ class RetainedDomains end def domain_to_jsonable(domain) - status = case domain - when ReservedDomain then RESERVED - when BlockedDomain then BLOCKED - when Dispute then DISPUTED - end - - domain_name = case domain - when Dispute then domain.domain_name - else domain.name - end - + status = get_status(domain) + domain_name = get_domain_name(domain) punycode = SimpleIDN.to_ascii(domain_name) { @@ -82,4 +73,19 @@ class RetainedDomains 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