mirror of
https://github.com/shlinkio/shlink.git
synced 2024-11-24 05:38:06 +03:00
Moved too concrete class from Common to Core
This commit is contained in:
parent
8f929c0ee3
commit
848d574f68
9 changed files with 71 additions and 101 deletions
|
@ -5,9 +5,9 @@ namespace Shlinkio\Shlink\CLI\Command\ShortUrl;
|
||||||
|
|
||||||
use Shlinkio\Shlink\CLI\Util\ExitCodes;
|
use Shlinkio\Shlink\CLI\Util\ExitCodes;
|
||||||
use Shlinkio\Shlink\CLI\Util\ShlinkTable;
|
use Shlinkio\Shlink\CLI\Util\ShlinkTable;
|
||||||
use Shlinkio\Shlink\Common\Paginator\Adapter\PaginableRepositoryAdapter;
|
|
||||||
use Shlinkio\Shlink\Common\Paginator\Util\PaginatorUtilsTrait;
|
use Shlinkio\Shlink\Common\Paginator\Util\PaginatorUtilsTrait;
|
||||||
use Shlinkio\Shlink\Common\Rest\DataTransformerInterface;
|
use Shlinkio\Shlink\Common\Rest\DataTransformerInterface;
|
||||||
|
use Shlinkio\Shlink\Core\Paginator\Adapter\ShortUrlRepositoryAdapter;
|
||||||
use Shlinkio\Shlink\Core\Service\ShortUrlServiceInterface;
|
use Shlinkio\Shlink\Core\Service\ShortUrlServiceInterface;
|
||||||
use Shlinkio\Shlink\Core\Transformer\ShortUrlDataTransformer;
|
use Shlinkio\Shlink\Core\Transformer\ShortUrlDataTransformer;
|
||||||
use Symfony\Component\Console\Command\Command;
|
use Symfony\Component\Console\Command\Command;
|
||||||
|
@ -62,7 +62,7 @@ class ListShortUrlsCommand extends Command
|
||||||
'page',
|
'page',
|
||||||
'p',
|
'p',
|
||||||
InputOption::VALUE_OPTIONAL,
|
InputOption::VALUE_OPTIONAL,
|
||||||
sprintf('The first page to list (%s items per page)', PaginableRepositoryAdapter::ITEMS_PER_PAGE),
|
sprintf('The first page to list (%s items per page)', ShortUrlRepositoryAdapter::ITEMS_PER_PAGE),
|
||||||
'1'
|
'1'
|
||||||
)
|
)
|
||||||
->addOption(
|
->addOption(
|
||||||
|
|
|
@ -3,16 +3,9 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace Shlinkio\Shlink\Common\Entity;
|
namespace Shlinkio\Shlink\Common\Entity;
|
||||||
|
|
||||||
use Doctrine\ORM\Mapping as ORM;
|
|
||||||
|
|
||||||
abstract class AbstractEntity
|
abstract class AbstractEntity
|
||||||
{
|
{
|
||||||
/**
|
/** @var string */
|
||||||
* @var string
|
|
||||||
* @ORM\Id
|
|
||||||
* @ORM\GeneratedValue(strategy="IDENTITY")
|
|
||||||
* @ORM\Column(name="id", type="bigint", options={"unsigned"=true})
|
|
||||||
*/
|
|
||||||
protected $id;
|
protected $id;
|
||||||
|
|
||||||
public function getId(): string
|
public function getId(): string
|
||||||
|
|
|
@ -31,12 +31,6 @@ trait PaginatorUtilsTrait
|
||||||
return $transformer === null ? $items : array_map([$transformer, 'transform'], $items);
|
return $transformer === null ? $items : array_map([$transformer, 'transform'], $items);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if provided paginator is in last page
|
|
||||||
*
|
|
||||||
* @param Paginator $paginator
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
private function isLastPage(Paginator $paginator): bool
|
private function isLastPage(Paginator $paginator): bool
|
||||||
{
|
{
|
||||||
return $paginator->getCurrentPageNumber() >= $paginator->count();
|
return $paginator->getCurrentPageNumber() >= $paginator->count();
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
<?php
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace Shlinkio\Shlink\Common\Repository;
|
|
||||||
|
|
||||||
interface PaginableRepositoryInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Gets a list of elements using provided filtering data
|
|
||||||
*
|
|
||||||
* @param int|null $limit
|
|
||||||
* @param int|null $offset
|
|
||||||
* @param string|null $searchTerm
|
|
||||||
* @param array $tags
|
|
||||||
* @param string|array|null $orderBy
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function findList(
|
|
||||||
?int $limit = null,
|
|
||||||
?int $offset = null,
|
|
||||||
?string $searchTerm = null,
|
|
||||||
array $tags = [],
|
|
||||||
$orderBy = null
|
|
||||||
): array;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Counts the number of elements in a list using provided filtering data
|
|
||||||
*
|
|
||||||
* @param string|null $searchTerm
|
|
||||||
* @param array $tags
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
public function countList(?string $searchTerm = null, array $tags = []): int;
|
|
||||||
}
|
|
|
@ -1,37 +0,0 @@
|
||||||
<?php
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace ShlinkioTest\Shlink\Common\Paginator\Adapter;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
use Prophecy\Prophecy\ObjectProphecy;
|
|
||||||
use Shlinkio\Shlink\Common\Paginator\Adapter\PaginableRepositoryAdapter;
|
|
||||||
use Shlinkio\Shlink\Common\Repository\PaginableRepositoryInterface;
|
|
||||||
|
|
||||||
class PaginableRepositoryAdapterTest extends TestCase
|
|
||||||
{
|
|
||||||
/** @var PaginableRepositoryAdapter */
|
|
||||||
private $adapter;
|
|
||||||
/** @var ObjectProphecy */
|
|
||||||
private $repo;
|
|
||||||
|
|
||||||
public function setUp(): void
|
|
||||||
{
|
|
||||||
$this->repo = $this->prophesize(PaginableRepositoryInterface::class);
|
|
||||||
$this->adapter = new PaginableRepositoryAdapter($this->repo->reveal(), 'search', ['foo', 'bar'], 'order');
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @test */
|
|
||||||
public function getItemsFallbacksToFindList()
|
|
||||||
{
|
|
||||||
$this->repo->findList(10, 5, 'search', ['foo', 'bar'], 'order')->shouldBeCalledOnce();
|
|
||||||
$this->adapter->getItems(5, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @test */
|
|
||||||
public function countFallbacksToCountList()
|
|
||||||
{
|
|
||||||
$this->repo->countList('search', ['foo', 'bar'])->shouldBeCalledOnce();
|
|
||||||
$this->adapter->count();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,20 +1,20 @@
|
||||||
<?php
|
<?php
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Shlinkio\Shlink\Common\Paginator\Adapter;
|
namespace Shlinkio\Shlink\Core\Paginator\Adapter;
|
||||||
|
|
||||||
use Shlinkio\Shlink\Common\Repository\PaginableRepositoryInterface;
|
use Shlinkio\Shlink\Core\Repository\ShortUrlRepositoryInterface;
|
||||||
use Zend\Paginator\Adapter\AdapterInterface;
|
use Zend\Paginator\Adapter\AdapterInterface;
|
||||||
|
|
||||||
use function strip_tags;
|
use function strip_tags;
|
||||||
use function trim;
|
use function trim;
|
||||||
|
|
||||||
class PaginableRepositoryAdapter implements AdapterInterface
|
class ShortUrlRepositoryAdapter implements AdapterInterface
|
||||||
{
|
{
|
||||||
public const ITEMS_PER_PAGE = 10;
|
public const ITEMS_PER_PAGE = 10;
|
||||||
|
|
||||||
/** @var PaginableRepositoryInterface */
|
/** @var ShortUrlRepositoryInterface */
|
||||||
private $paginableRepository;
|
private $repository;
|
||||||
/** @var null|string */
|
/** @var null|string */
|
||||||
private $searchTerm;
|
private $searchTerm;
|
||||||
/** @var null|array|string */
|
/** @var null|array|string */
|
||||||
|
@ -23,12 +23,12 @@ class PaginableRepositoryAdapter implements AdapterInterface
|
||||||
private $tags;
|
private $tags;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
PaginableRepositoryInterface $paginableRepository,
|
ShortUrlRepositoryInterface $repository,
|
||||||
$searchTerm = null,
|
$searchTerm = null,
|
||||||
array $tags = [],
|
array $tags = [],
|
||||||
$orderBy = null
|
$orderBy = null
|
||||||
) {
|
) {
|
||||||
$this->paginableRepository = $paginableRepository;
|
$this->repository = $repository;
|
||||||
$this->searchTerm = $searchTerm !== null ? trim(strip_tags($searchTerm)) : null;
|
$this->searchTerm = $searchTerm !== null ? trim(strip_tags($searchTerm)) : null;
|
||||||
$this->orderBy = $orderBy;
|
$this->orderBy = $orderBy;
|
||||||
$this->tags = $tags;
|
$this->tags = $tags;
|
||||||
|
@ -43,7 +43,7 @@ class PaginableRepositoryAdapter implements AdapterInterface
|
||||||
*/
|
*/
|
||||||
public function getItems($offset, $itemCountPerPage): array
|
public function getItems($offset, $itemCountPerPage): array
|
||||||
{
|
{
|
||||||
return $this->paginableRepository->findList(
|
return $this->repository->findList(
|
||||||
$itemCountPerPage,
|
$itemCountPerPage,
|
||||||
$offset,
|
$offset,
|
||||||
$this->searchTerm,
|
$this->searchTerm,
|
||||||
|
@ -63,6 +63,6 @@ class PaginableRepositoryAdapter implements AdapterInterface
|
||||||
*/
|
*/
|
||||||
public function count(): int
|
public function count(): int
|
||||||
{
|
{
|
||||||
return $this->paginableRepository->countList($this->searchTerm, $this->tags);
|
return $this->repository->countList($this->searchTerm, $this->tags);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -4,10 +4,27 @@ declare(strict_types=1);
|
||||||
namespace Shlinkio\Shlink\Core\Repository;
|
namespace Shlinkio\Shlink\Core\Repository;
|
||||||
|
|
||||||
use Doctrine\Common\Persistence\ObjectRepository;
|
use Doctrine\Common\Persistence\ObjectRepository;
|
||||||
use Shlinkio\Shlink\Common\Repository\PaginableRepositoryInterface;
|
|
||||||
use Shlinkio\Shlink\Core\Entity\ShortUrl;
|
use Shlinkio\Shlink\Core\Entity\ShortUrl;
|
||||||
|
|
||||||
interface ShortUrlRepositoryInterface extends ObjectRepository, PaginableRepositoryInterface
|
interface ShortUrlRepositoryInterface extends ObjectRepository
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Gets a list of elements using provided filtering data
|
||||||
|
*
|
||||||
|
* @param string|array|null $orderBy
|
||||||
|
*/
|
||||||
|
public function findList(
|
||||||
|
?int $limit = null,
|
||||||
|
?int $offset = null,
|
||||||
|
?string $searchTerm = null,
|
||||||
|
array $tags = [],
|
||||||
|
$orderBy = null
|
||||||
|
): array;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Counts the number of elements in a list using provided filtering data
|
||||||
|
*/
|
||||||
|
public function countList(?string $searchTerm = null, array $tags = []): int;
|
||||||
|
|
||||||
public function findOneByShortCode(string $shortCode): ?ShortUrl;
|
public function findOneByShortCode(string $shortCode): ?ShortUrl;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,10 +4,10 @@ declare(strict_types=1);
|
||||||
namespace Shlinkio\Shlink\Core\Service;
|
namespace Shlinkio\Shlink\Core\Service;
|
||||||
|
|
||||||
use Doctrine\ORM;
|
use Doctrine\ORM;
|
||||||
use Shlinkio\Shlink\Common\Paginator\Adapter\PaginableRepositoryAdapter;
|
|
||||||
use Shlinkio\Shlink\Core\Entity\ShortUrl;
|
use Shlinkio\Shlink\Core\Entity\ShortUrl;
|
||||||
use Shlinkio\Shlink\Core\Exception\InvalidShortCodeException;
|
use Shlinkio\Shlink\Core\Exception\InvalidShortCodeException;
|
||||||
use Shlinkio\Shlink\Core\Model\ShortUrlMeta;
|
use Shlinkio\Shlink\Core\Model\ShortUrlMeta;
|
||||||
|
use Shlinkio\Shlink\Core\Paginator\Adapter\ShortUrlRepositoryAdapter;
|
||||||
use Shlinkio\Shlink\Core\Repository\ShortUrlRepository;
|
use Shlinkio\Shlink\Core\Repository\ShortUrlRepository;
|
||||||
use Shlinkio\Shlink\Core\Service\ShortUrl\FindShortCodeTrait;
|
use Shlinkio\Shlink\Core\Service\ShortUrl\FindShortCodeTrait;
|
||||||
use Shlinkio\Shlink\Core\Util\TagManagerTrait;
|
use Shlinkio\Shlink\Core\Util\TagManagerTrait;
|
||||||
|
@ -35,8 +35,8 @@ class ShortUrlService implements ShortUrlServiceInterface
|
||||||
{
|
{
|
||||||
/** @var ShortUrlRepository $repo */
|
/** @var ShortUrlRepository $repo */
|
||||||
$repo = $this->em->getRepository(ShortUrl::class);
|
$repo = $this->em->getRepository(ShortUrl::class);
|
||||||
$paginator = new Paginator(new PaginableRepositoryAdapter($repo, $searchQuery, $tags, $orderBy));
|
$paginator = new Paginator(new ShortUrlRepositoryAdapter($repo, $searchQuery, $tags, $orderBy));
|
||||||
$paginator->setItemCountPerPage(PaginableRepositoryAdapter::ITEMS_PER_PAGE)
|
$paginator->setItemCountPerPage(ShortUrlRepositoryAdapter::ITEMS_PER_PAGE)
|
||||||
->setCurrentPageNumber($page);
|
->setCurrentPageNumber($page);
|
||||||
|
|
||||||
return $paginator;
|
return $paginator;
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace ShlinkioTest\Shlink\Core\Paginator\Adapter;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use Prophecy\Prophecy\ObjectProphecy;
|
||||||
|
use Shlinkio\Shlink\Core\Paginator\Adapter\ShortUrlRepositoryAdapter;
|
||||||
|
use Shlinkio\Shlink\Core\Repository\ShortUrlRepositoryInterface;
|
||||||
|
|
||||||
|
class ShortUrlRepositoryAdapterTest extends TestCase
|
||||||
|
{
|
||||||
|
/** @var ShortUrlRepositoryAdapter */
|
||||||
|
private $adapter;
|
||||||
|
/** @var ObjectProphecy */
|
||||||
|
private $repo;
|
||||||
|
|
||||||
|
public function setUp(): void
|
||||||
|
{
|
||||||
|
$this->repo = $this->prophesize(ShortUrlRepositoryInterface::class);
|
||||||
|
$this->adapter = new ShortUrlRepositoryAdapter($this->repo->reveal(), 'search', ['foo', 'bar'], 'order');
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @test */
|
||||||
|
public function getItemsFallbacksToFindList(): void
|
||||||
|
{
|
||||||
|
$this->repo->findList(10, 5, 'search', ['foo', 'bar'], 'order')->shouldBeCalledOnce();
|
||||||
|
$this->adapter->getItems(5, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @test */
|
||||||
|
public function countFallbacksToCountList(): void
|
||||||
|
{
|
||||||
|
$this->repo->countList('search', ['foo', 'bar'])->shouldBeCalledOnce();
|
||||||
|
$this->adapter->count();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue