ListShortUrlsAction.php 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. <?php
  2. declare(strict_types=1);
  3. namespace Shlinkio\Shlink\Rest\Action\ShortUrl;
  4. use Cake\Chronos\Chronos;
  5. use InvalidArgumentException;
  6. use Laminas\Diactoros\Response\JsonResponse;
  7. use Psr\Http\Message\ResponseInterface as Response;
  8. use Psr\Http\Message\ServerRequestInterface as Request;
  9. use Psr\Log\LoggerInterface;
  10. use Shlinkio\Shlink\Common\Paginator\Util\PaginatorUtilsTrait;
  11. use Shlinkio\Shlink\Common\Util\DateRange;
  12. use Shlinkio\Shlink\Core\Service\ShortUrlServiceInterface;
  13. use Shlinkio\Shlink\Core\Transformer\ShortUrlDataTransformer;
  14. use Shlinkio\Shlink\Rest\Action\AbstractRestAction;
  15. class ListShortUrlsAction extends AbstractRestAction
  16. {
  17. use PaginatorUtilsTrait;
  18. protected const ROUTE_PATH = '/short-urls';
  19. protected const ROUTE_ALLOWED_METHODS = [self::METHOD_GET];
  20. private ShortUrlServiceInterface $shortUrlService;
  21. private array $domainConfig;
  22. public function __construct(
  23. ShortUrlServiceInterface $shortUrlService,
  24. array $domainConfig,
  25. ?LoggerInterface $logger = null
  26. ) {
  27. parent::__construct($logger);
  28. $this->shortUrlService = $shortUrlService;
  29. $this->domainConfig = $domainConfig;
  30. }
  31. /**
  32. * @throws InvalidArgumentException
  33. */
  34. public function handle(Request $request): Response
  35. {
  36. $params = $this->queryToListParams($request->getQueryParams());
  37. $shortUrls = $this->shortUrlService->listShortUrls(...$params);
  38. return new JsonResponse(['shortUrls' => $this->serializePaginator($shortUrls, new ShortUrlDataTransformer(
  39. $this->domainConfig,
  40. ))]);
  41. }
  42. /**
  43. * @param array $query
  44. * @return array
  45. */
  46. private function queryToListParams(array $query): array
  47. {
  48. return [
  49. (int) ($query['page'] ?? 1),
  50. $query['searchTerm'] ?? null,
  51. $query['tags'] ?? [],
  52. $query['orderBy'] ?? null,
  53. $this->determineDateRangeFromQuery($query),
  54. ];
  55. }
  56. private function determineDateRangeFromQuery(array $query): DateRange
  57. {
  58. return new DateRange(
  59. isset($query['startDate']) ? Chronos::parse($query['startDate']) : null,
  60. isset($query['endDate']) ? Chronos::parse($query['endDate']) : null,
  61. );
  62. }
  63. }