<?php
namespace App\Controller\Application\Term;
use App\Controller\AbstractController;
use App\Entity\Company;
use App\Handler\App\Term\SearchTerm\SearchTermHandler;
use App\Handler\App\Term\SearchTerm\SearchTermOptions;
use App\Utils\DTO\Pagination;
use Aura\Payload_Interface\PayloadStatus;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Routing\Annotation\Route;
#[Route(
path: '/terms',
methods: ['GET']
)]
class IndexController extends AbstractController
{
public function __construct(
private SearchTermHandler $searchTermHandler,
private EntityManagerInterface $entityManager,
) {
}
public function __invoke(Request $request): JsonResponse
{
$options = $this->createOptionsResolver($request->query->all());
$format = $options['format'] ?? null;
unset($options['format']);
if (2 == $this->getCompany()->getId() && isset($options['companyUid'])) {
$companySelected = $this->entityManager->getRepository(Company::class)->findOneBy(['uid' => $options['companyUid']]);
if (!$companySelected) {
$this->jsonResponse(
status: PayloadStatus::ERROR,
output: ['Company not found'],
);
}
$options['company'] = $companySelected;
} else {
$options['company'] = $this->getCompany();
}
if (!isset($options['page'])) {
$options['page'] = 1;
}
$options['pagination'] = Pagination::fromArray(['page' => $options['page']]);
unset($options['page']);
$terms = $this->searchTermHandler
->handle(SearchTermOptions::fromArray($options));
/*
if ('keyVal' === $format) {
$terms = collect($terms)
->map(function ($term) {
return ['value' => $term['id'], 'label' => $term['name'], 'taxonomy' => $term['taxonomy'] ,'isDeleted' => $term['isDeleted']];
})
->toArray();
}
*/
return $this->jsonResponse(
output: $terms,
extras: [
'totalPage' => $terms['totalPage'] ?? null,
]
);
}
private function createOptionsResolver(array $options): array
{
$optionsResolver = new OptionsResolver();
$optionsResolver->setDefined([
'name',
'taxonomy',
'format',
'company',
'page',
'noPage',
'companyUid'
]);
return $optionsResolver->resolve($options);
}
}