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:
Alejandro Celaya 2019-03-30 07:36:57 +01:00
parent 0135f205df
commit 2906d42f97
2 changed files with 30 additions and 23 deletions

View File

@ -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

View File

@ -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);