<?php
declare(strict_types=1);
namespace App\Controller\User\Privates;
use App\Controller\Traits\ExceptionTrait;
use App\Enum\GenderEnum;
use App\Manager\PaginatorManager;
use App\Normalizer\Enum\EnumStringNormalizer;
use App\Normalizer\PriceNormalizer;
use App\Repository\UserRepository;
use App\Serializer\Serializer;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Serializer\Exception\ExceptionInterface;
/**
* @Route(
* "/users",
* methods={"GET"}
* )
* @IsGranted("ROLE_CUSTOMER_READ")
* Class ListController
* @package App\Controller\User\Privates
*/
class ListController
{
use ExceptionTrait;
private Serializer $serializer;
private PaginatorManager $paginator;
private UserRepository $userRepository;
/**
* ListController constructor.
* @param Serializer $serializer
* @param PaginatorManager $paginator
* @param UserRepository $userRepository
*/
public function __construct(
Serializer $serializer,
PaginatorManager $paginator,
UserRepository $userRepository
) {
$this->serializer = $serializer;
$this->paginator = $paginator;
$this->userRepository = $userRepository;
}
public function __invoke(Request $request): JsonResponse
{
try {
$request->query->set('deletedAt', ['isnull' => true]);
return new JsonResponse(
$this->serializer
->getSerializer(
[
new PriceNormalizer(),
new EnumStringNormalizer(GenderEnum::class),
]
)
->normalize(
$this->paginator->addMetaPagination(
$request,
$this->userRepository->filter($request->query->all())
),
null,
[
'groups' => [
'user:detail',
'user:edit',
'area:detail'
],
]
)
);
} catch (ExceptionInterface $e) {
return $this->exceptionOutput($e);
}
}
}