From 565fe4c348bb50cf89a253dd56fa5e95fefcbce0 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Tue, 3 Aug 2021 17:00:26 +0200 Subject: [PATCH] Added redirects to the list of domains --- docs/swagger/paths/v2_domains.json | 28 +++++++++++++---- module/Core/src/Config/NotFoundRedirects.php | 5 ++++ module/Core/src/Domain/Model/DomainItem.php | 2 ++ .../Domain/Repository/DomainRepository.php | 1 - .../src/Action/Domain/ListDomainsAction.php | 2 -- .../Rest/test-api/Action/ListDomainsTest.php | 30 +++++++++++++++++++ 6 files changed, 60 insertions(+), 8 deletions(-) diff --git a/docs/swagger/paths/v2_domains.json b/docs/swagger/paths/v2_domains.json index d92ae995..ef63ee4e 100644 --- a/docs/swagger/paths/v2_domains.json +++ b/docs/swagger/paths/v2_domains.json @@ -18,7 +18,7 @@ ], "responses": { "200": { - "description": "The list of tags", + "description": "The list of domains", "content": { "application/json": { "schema": { @@ -33,13 +33,16 @@ "type": "array", "items": { "type": "object", - "required": ["domain", "isDefault"], + "required": ["domain", "isDefault", "redirects"], "properties": { "domain": { "type": "string" }, "isDefault": { "type": "boolean" + }, + "redirects": { + "$ref": "../definitions/NotFoundRedirects.json" } } } @@ -56,15 +59,30 @@ "data": [ { "domain": "example.com", - "isDefault": true + "isDefault": true, + "redirects": { + "baseUrlRedirect": "https://example.com/my-landing-page", + "regular404Redirect": null, + "invalidShortUrlRedirect": "https://example.com/invalid-url" + } }, { "domain": "aaa.com", - "isDefault": false + "isDefault": false, + "redirects": { + "baseUrlRedirect": null, + "regular404Redirect": null, + "invalidShortUrlRedirect": null + } }, { "domain": "bbb.com", - "isDefault": false + "isDefault": false, + "redirects": { + "baseUrlRedirect": null, + "regular404Redirect": null, + "invalidShortUrlRedirect": "https://example.com/invalid-url" + } } ] } diff --git a/module/Core/src/Config/NotFoundRedirects.php b/module/Core/src/Config/NotFoundRedirects.php index c00d35d0..9f277be5 100644 --- a/module/Core/src/Config/NotFoundRedirects.php +++ b/module/Core/src/Config/NotFoundRedirects.php @@ -28,6 +28,11 @@ final class NotFoundRedirects implements JsonSerializable return new self(null, null, null); } + public static function fromConfig(NotFoundRedirectConfigInterface $config): self + { + return new self($config->baseUrlRedirect(), $config->regular404Redirect(), $config->invalidShortUrlRedirect()); + } + public function baseUrlRedirect(): ?string { return $this->baseUrlRedirect; diff --git a/module/Core/src/Domain/Model/DomainItem.php b/module/Core/src/Domain/Model/DomainItem.php index bad7d5cf..cfd09d90 100644 --- a/module/Core/src/Domain/Model/DomainItem.php +++ b/module/Core/src/Domain/Model/DomainItem.php @@ -6,6 +6,7 @@ namespace Shlinkio\Shlink\Core\Domain\Model; use JsonSerializable; use Shlinkio\Shlink\Core\Config\NotFoundRedirectConfigInterface; +use Shlinkio\Shlink\Core\Config\NotFoundRedirects; use Shlinkio\Shlink\Core\Entity\Domain; final class DomainItem implements JsonSerializable @@ -32,6 +33,7 @@ final class DomainItem implements JsonSerializable return [ 'domain' => $this->authority, 'isDefault' => $this->isDefault, + 'redirects' => NotFoundRedirects::fromConfig($this->notFoundRedirectConfig), ]; } diff --git a/module/Core/src/Domain/Repository/DomainRepository.php b/module/Core/src/Domain/Repository/DomainRepository.php index 33538011..1741cea7 100644 --- a/module/Core/src/Domain/Repository/DomainRepository.php +++ b/module/Core/src/Domain/Repository/DomainRepository.php @@ -5,7 +5,6 @@ declare(strict_types=1); namespace Shlinkio\Shlink\Core\Domain\Repository; use Doctrine\ORM\Query\Expr\Join; -use Doctrine\ORM\QueryBuilder; use Happyr\DoctrineSpecification\Repository\EntitySpecificationRepository; use Happyr\DoctrineSpecification\Spec; use Shlinkio\Shlink\Core\Domain\Spec\IsDomain; diff --git a/module/Rest/src/Action/Domain/ListDomainsAction.php b/module/Rest/src/Action/Domain/ListDomainsAction.php index 3d9205f8..c8f9a475 100644 --- a/module/Rest/src/Action/Domain/ListDomainsAction.php +++ b/module/Rest/src/Action/Domain/ListDomainsAction.php @@ -25,8 +25,6 @@ class ListDomainsAction extends AbstractRestAction $apiKey = AuthenticationMiddleware::apiKeyFromRequest($request); $domainItems = $this->domainService->listDomains($apiKey); - // TODO Support including not found redirects if requested via query param - return new JsonResponse([ 'domains' => [ 'data' => $domainItems, diff --git a/module/Rest/test-api/Action/ListDomainsTest.php b/module/Rest/test-api/Action/ListDomainsTest.php index 075b6d09..5f33c20b 100644 --- a/module/Rest/test-api/Action/ListDomainsTest.php +++ b/module/Rest/test-api/Action/ListDomainsTest.php @@ -31,30 +31,60 @@ class ListDomainsTest extends ApiTestCase [ 'domain' => 'doma.in', 'isDefault' => true, + 'redirects' => [ + 'baseUrlRedirect' => null, + 'regular404Redirect' => null, + 'invalidShortUrlRedirect' => null, + ], ], [ 'domain' => 'detached-with-redirects.com', 'isDefault' => false, + 'redirects' => [ + 'baseUrlRedirect' => 'foo.com', + 'regular404Redirect' => 'bar.com', + 'invalidShortUrlRedirect' => null, + ], ], [ 'domain' => 'example.com', 'isDefault' => false, + 'redirects' => [ + 'baseUrlRedirect' => null, + 'regular404Redirect' => null, + 'invalidShortUrlRedirect' => null, + ], ], [ 'domain' => 'some-domain.com', 'isDefault' => false, + 'redirects' => [ + 'baseUrlRedirect' => null, + 'regular404Redirect' => null, + 'invalidShortUrlRedirect' => null, + ], ], ]]; yield 'author API key' => ['author_api_key', [ [ 'domain' => 'doma.in', 'isDefault' => true, + 'redirects' => [ + 'baseUrlRedirect' => null, + 'regular404Redirect' => null, + 'invalidShortUrlRedirect' => null, + ], ], ]]; yield 'domain API key' => ['domain_api_key', [ [ 'domain' => 'example.com', 'isDefault' => false, + 'redirects' => [ + 'baseUrlRedirect' => null, + 'regular404Redirect' => null, + 'invalidShortUrlRedirect' => null, + ], ], ]]; }