mirror of
https://github.com/shlinkio/shlink.git
synced 2025-02-25 18:45:27 -06:00
Updated how existing short URLs are checked, so that not only the first one matching the slug or url is checked
This commit is contained in:
parent
0135f205df
commit
2906d42f97
@ -112,12 +112,18 @@ class UrlShortener implements UrlShortenerInterface
|
|||||||
if ($meta->hasCustomSlug()) {
|
if ($meta->hasCustomSlug()) {
|
||||||
$criteria['shortCode'] = $meta->getCustomSlug();
|
$criteria['shortCode'] = $meta->getCustomSlug();
|
||||||
}
|
}
|
||||||
/** @var ShortUrl|null $shortUrl */
|
/** @var ShortUrl[] $shortUrls */
|
||||||
$shortUrl = $this->em->getRepository(ShortUrl::class)->findOneBy($criteria);
|
$shortUrls = $this->em->getRepository(ShortUrl::class)->findBy($criteria);
|
||||||
if ($shortUrl === null) {
|
if (empty($shortUrls)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Iterate short URLs until one that matches is found, or return null otherwise
|
||||||
|
return array_reduce($shortUrls, function (?ShortUrl $found, ShortUrl $shortUrl) use ($tags, $meta) {
|
||||||
|
if ($found) {
|
||||||
|
return $found;
|
||||||
|
}
|
||||||
|
|
||||||
if ($meta->hasMaxVisits() && $meta->getMaxVisits() !== $shortUrl->getMaxVisits()) {
|
if ($meta->hasMaxVisits() && $meta->getMaxVisits() !== $shortUrl->getMaxVisits()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -138,6 +144,7 @@ class UrlShortener implements UrlShortenerInterface
|
|||||||
);
|
);
|
||||||
|
|
||||||
return $hasAllTags ? $shortUrl : null;
|
return $hasAllTags ? $shortUrl : null;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private function checkUrlExists(string $url): void
|
private function checkUrlExists(string $url): void
|
||||||
|
@ -121,7 +121,7 @@ class UrlShortenerTest extends TestCase
|
|||||||
{
|
{
|
||||||
$repo = $this->prophesize(ShortUrlRepository::class);
|
$repo = $this->prophesize(ShortUrlRepository::class);
|
||||||
$countBySlug = $repo->count(['shortCode' => 'custom-slug'])->willReturn(1);
|
$countBySlug = $repo->count(['shortCode' => 'custom-slug'])->willReturn(1);
|
||||||
$repo->findOneBy(Argument::cetera())->willReturn(null);
|
$repo->findBy(Argument::cetera())->willReturn([]);
|
||||||
$getRepo = $this->em->getRepository(ShortUrl::class)->willReturn($repo->reveal());
|
$getRepo = $this->em->getRepository(ShortUrl::class)->willReturn($repo->reveal());
|
||||||
|
|
||||||
$countBySlug->shouldBeCalledOnce();
|
$countBySlug->shouldBeCalledOnce();
|
||||||
@ -146,7 +146,7 @@ class UrlShortenerTest extends TestCase
|
|||||||
?ShortUrl $expected
|
?ShortUrl $expected
|
||||||
): void {
|
): void {
|
||||||
$repo = $this->prophesize(ShortUrlRepository::class);
|
$repo = $this->prophesize(ShortUrlRepository::class);
|
||||||
$findExisting = $repo->findOneBy(Argument::any())->willReturn($expected);
|
$findExisting = $repo->findBy(Argument::any())->willReturn([$expected]);
|
||||||
$getRepo = $this->em->getRepository(ShortUrl::class)->willReturn($repo->reveal());
|
$getRepo = $this->em->getRepository(ShortUrl::class)->willReturn($repo->reveal());
|
||||||
|
|
||||||
$result = $this->urlShortener->urlToShortCode(new Uri($url), $tags, $meta);
|
$result = $this->urlShortener->urlToShortCode(new Uri($url), $tags, $meta);
|
||||||
|
Loading…
Reference in New Issue
Block a user