Avoid selecting domains for every short URL in list

This commit is contained in:
Alejandro Celaya 2024-10-30 08:25:28 +01:00
parent 98364a1aae
commit d7ecef94f2
6 changed files with 27 additions and 18 deletions

View File

@ -7,6 +7,7 @@ namespace Shlinkio\Shlink\Core\ShortUrl\Helper;
use Laminas\Diactoros\Uri;
use Shlinkio\Shlink\Core\Config\Options\UrlShortenerOptions;
use Shlinkio\Shlink\Core\ShortUrl\Entity\ShortUrl;
use Shlinkio\Shlink\Core\ShortUrl\Model\ShortUrlIdentifier;
use function sprintf;
@ -18,19 +19,20 @@ readonly class ShortUrlStringifier implements ShortUrlStringifierInterface
) {
}
public function stringify(ShortUrl $shortUrl): string
public function stringify(ShortUrl|ShortUrlIdentifier $shortUrl): string
{
$shortUrlIdentifier = $shortUrl instanceof ShortUrl ? ShortUrlIdentifier::fromShortUrl($shortUrl) : $shortUrl;
$uriWithoutShortCode = (new Uri())->withScheme($this->urlShortenerOptions->schema)
->withHost($this->resolveDomain($shortUrl))
->withHost($this->resolveDomain($shortUrlIdentifier))
->withPath($this->basePath)
->__toString();
// The short code needs to be appended to avoid it from being URL-encoded
return sprintf('%s/%s', $uriWithoutShortCode, $shortUrl->getShortCode());
return sprintf('%s/%s', $uriWithoutShortCode, $shortUrlIdentifier->shortCode);
}
private function resolveDomain(ShortUrl $shortUrl): string
private function resolveDomain(ShortUrlIdentifier $shortUrlIdentifier): string
{
return $shortUrl->getDomain()?->authority ?? $this->urlShortenerOptions->defaultDomain;
return $shortUrlIdentifier->domain ?? $this->urlShortenerOptions->defaultDomain;
}
}

View File

@ -5,8 +5,9 @@ declare(strict_types=1);
namespace Shlinkio\Shlink\Core\ShortUrl\Helper;
use Shlinkio\Shlink\Core\ShortUrl\Entity\ShortUrl;
use Shlinkio\Shlink\Core\ShortUrl\Model\ShortUrlIdentifier;
interface ShortUrlStringifierInterface
{
public function stringify(ShortUrl $shortUrl): string;
public function stringify(ShortUrl|ShortUrlIdentifier $shortUrl): string;
}

View File

@ -33,10 +33,8 @@ final readonly class ShortUrlIdentifier
public static function fromShortUrl(ShortUrl $shortUrl): self
{
$domain = $shortUrl->getDomain();
$domainAuthority = $domain?->authority;
return new self($shortUrl->getShortCode(), $domainAuthority);
$domain = $shortUrl->getDomain()?->authority;
return new self($shortUrl->getShortCode(), $domain);
}
public static function fromShortCodeAndDomain(string $shortCode, string|null $domain = null): self

View File

@ -11,8 +11,8 @@ final readonly class ShortUrlWithVisitsSummary
{
private function __construct(
public ShortUrl $shortUrl,
private string|null $authority,
private VisitsSummary|null $visitsSummary = null,
private string|null $authority = null,
) {
}
@ -23,17 +23,22 @@ final readonly class ShortUrlWithVisitsSummary
{
return new self(
shortUrl: $data['shortUrl'],
authority: $data['authority'] ?? null,
visitsSummary: VisitsSummary::fromTotalAndNonBots(
total: (int) $data['visits'],
nonBots: (int) $data['nonBotVisits'],
),
authority: $data['authority'] ?? null,
);
}
public static function fromShortUrl(ShortUrl $shortUrl): self
{
return new self($shortUrl);
return new self($shortUrl, authority: $shortUrl->getDomain()?->authority);
}
public function toIdentifier(): ShortUrlIdentifier
{
return ShortUrlIdentifier::fromShortCodeAndDomain($this->shortUrl->getShortCode(), $this->authority);
}
public function toArray(): array

View File

@ -6,6 +6,7 @@ namespace Shlinkio\Shlink\Core\ShortUrl\Transformer;
use Shlinkio\Shlink\Core\ShortUrl\Entity\ShortUrl;
use Shlinkio\Shlink\Core\ShortUrl\Helper\ShortUrlStringifierInterface;
use Shlinkio\Shlink\Core\ShortUrl\Model\ShortUrlIdentifier;
use Shlinkio\Shlink\Core\ShortUrl\Model\ShortUrlWithVisitsSummary;
readonly class ShortUrlDataTransformer implements ShortUrlDataTransformerInterface
@ -14,12 +15,14 @@ readonly class ShortUrlDataTransformer implements ShortUrlDataTransformerInterfa
{
}
public function transform(ShortUrlWithVisitsSummary|ShortUrl $data): array
public function transform(ShortUrlWithVisitsSummary|ShortUrl $shortUrl): array
{
$shortUrl = $data instanceof ShortUrlWithVisitsSummary ? $data->shortUrl : $data;
$shortUrlIdentifier = $shortUrl instanceof ShortUrl
? ShortUrlIdentifier::fromShortUrl($shortUrl)
: $shortUrl->toIdentifier();
return [
'shortUrl' => $this->stringifier->stringify($shortUrl),
...$data->toArray(),
'shortUrl' => $this->stringifier->stringify($shortUrlIdentifier),
...$shortUrl->toArray(),
];
}
}

View File

@ -9,5 +9,5 @@ use Shlinkio\Shlink\Core\ShortUrl\Model\ShortUrlWithVisitsSummary;
interface ShortUrlDataTransformerInterface
{
public function transform(ShortUrlWithVisitsSummary|ShortUrl $data): array;
public function transform(ShortUrlWithVisitsSummary|ShortUrl $shortUrl): array;
}