person: rewrite social issue api controller for ordering

This commit is contained in:
nobohan 2022-02-01 16:49:14 +01:00
parent de1dddbb85
commit eb32b13bcc
4 changed files with 106 additions and 42 deletions

View File

@ -14,40 +14,96 @@ namespace Chill\PersonBundle\Controller;
use Chill\MainBundle\CRUD\Controller\ApiController; use Chill\MainBundle\CRUD\Controller\ApiController;
use Chill\MainBundle\Doctrine\ORM\Hydration\FlatHierarchyEntityHydrator; use Chill\MainBundle\Doctrine\ORM\Hydration\FlatHierarchyEntityHydrator;
use Chill\MainBundle\Pagination\PaginatorInterface; use Chill\MainBundle\Pagination\PaginatorInterface;
use Chill\MainBundle\Serializer\Model\Collection;
use Chill\PersonBundle\Entity\SocialWork\SocialIssue;
use DateTimeImmutable; use DateTimeImmutable;
use Doctrine\ORM\Query; use Doctrine\ORM\Query;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Serializer\SerializerInterface;
class SocialIssueApiController extends ApiController //class SocialIssueApiController extends ApiController
class SocialIssueApiController extends AbstractController
{ {
protected function customizeQuery(string $action, Request $request, $query): void
private SerializerInterface $serializer;
public function __construct(
SerializerInterface $serializer
) {
$this->serializer = $serializer;
}
// protected function customizeQuery(string $action, Request $request, $query): void
// {
// $query->where(
// $query->expr()->orX(
// $query->expr()->gt('e.desactivationDate', ':now'),
// $query->expr()->isNull('e.desactivationDate')
// )
// );
// $query->setParameter('now', new DateTimeImmutable());
// }
// protected function getQueryResult(string $action, Request $request, string $_format, int $totalItems, PaginatorInterface $paginator, $query)
// {
// // In order to work, this hydrator only works with
// // entities having the field "children" set up.
// return $query
// ->getQuery()
// ->setHint(Query::HINT_INCLUDE_META_COLUMNS, true)
// ->getResult(FlatHierarchyEntityHydrator::LIST);
// }
// protected function onPostIndexBuildQuery(string $action, Request $request, string $_format, int $totalItems, PaginatorInterface $paginator, $query): ?Response
// {
// $query
// ->orderBy('GET_JSON_FIELD_BY_KEY(e.title, :locale)', 'ASC')
// ->setParameter(':locale', $request->getLocale());
// return null;
// }
// protected function orderQuery(string $action, $query, Request $request, PaginatorInterface $paginator, $_format)
// {
// $query->addOrderBy('ordering', 'ASC');
// return $query;
// }
/*
* @Route("/api/1.0/person/social-work/social-issue.json", name="social_work_social_issue")
*/
public function indexAction(Request $request): JsonResponse
{ {
$query->where( $this->denyAccessUnlessGranted('ROLE_USER');
$query->expr()->orX(
$query->expr()->gt('e.desactivationDate', ':now'), $qb = $this->getDoctrine()->getManager()->createQueryBuilder();
$query->expr()->isNull('e.desactivationDate')
$qb->select('si')->from(SocialIssue::class, 'si');
$qb->where(
$qb->expr()->orX(
$qb->expr()->gt('si.desactivationDate', ':now'),
$qb->expr()->isNull('si.desactivationDate')
) )
); );
$query->setParameter('now', new DateTimeImmutable()); $qb->setParameter('now', new DateTimeImmutable());
} $qb->addOrderBy('si.ordering', 'ASC');
protected function getQueryResult(string $action, Request $request, string $_format, int $totalItems, PaginatorInterface $paginator, $query) $qb->getQuery()
{
// In order to work, this hydrator only works with
// entities having the field "children" set up.
return $query
->getQuery()
->setHint(Query::HINT_INCLUDE_META_COLUMNS, true) ->setHint(Query::HINT_INCLUDE_META_COLUMNS, true)
->getResult(FlatHierarchyEntityHydrator::LIST); ->getResult(FlatHierarchyEntityHydrator::LIST);
}
protected function onPostIndexBuildQuery(string $action, Request $request, string $_format, int $totalItems, PaginatorInterface $paginator, $query): ?Response $socialIssues = $qb->getQuery()->getResult();
{
$query
->orderBy('GET_JSON_FIELD_BY_KEY(e.title, :locale)', 'ASC')
->setParameter(':locale', $request->getLocale());
return null; return new JsonResponse(
$this->serializer->serialize(['count' => count($socialIssues), 'results' => $socialIssues], 'json', ['groups' => ['read']]),
JsonResponse::HTTP_OK,
[],
true
);
} }
} }

View File

@ -455,27 +455,27 @@ class ChillPersonExtension extends Extension implements PrependExtensionInterfac
], ],
], ],
], ],
[ // [
'class' => \Chill\PersonBundle\Entity\SocialWork\SocialIssue::class, // 'class' => \Chill\PersonBundle\Entity\SocialWork\SocialIssue::class,
'name' => 'social_work_social_issue', // 'name' => 'social_work_social_issue',
'controller' => \Chill\PersonBundle\Controller\SocialIssueApiController::class, // 'controller' => \Chill\PersonBundle\Controller\SocialIssueApiController::class,
'base_path' => '/api/1.0/person/social-work/social-issue', // 'base_path' => '/api/1.0/person/social-work/social-issue',
'base_role' => 'ROLE_USER', // 'base_role' => 'ROLE_USER',
'actions' => [ // 'actions' => [
'_index' => [ // '_index' => [
'methods' => [ // 'methods' => [
Request::METHOD_GET => true, // Request::METHOD_GET => true,
Request::METHOD_HEAD => true, // Request::METHOD_HEAD => true,
], // ],
], // ],
'_entity' => [ // '_entity' => [
'methods' => [ // 'methods' => [
Request::METHOD_GET => true, // Request::METHOD_GET => true,
Request::METHOD_HEAD => true, // Request::METHOD_HEAD => true,
], // ],
], // ],
], // ],
], // ],
[ [
'class' => \Chill\PersonBundle\Entity\Person::class, 'class' => \Chill\PersonBundle\Entity\Person::class,
'name' => 'person', 'name' => 'person',

View File

@ -199,3 +199,7 @@ chill_person_social_result_admin:
chill_person_controllers: chill_person_controllers:
resource: "@ChillPersonBundle/Controller" resource: "@ChillPersonBundle/Controller"
type: annotation type: annotation
social_work_social_issue:
path: "/api/1.0/person/social-work/social-issue.json"
controller: Chill\PersonBundle\Controller\SocialIssueApiController::indexAction

View File

@ -66,3 +66,7 @@ services:
Chill\PersonBundle\Controller\RelationshipApiController: Chill\PersonBundle\Controller\RelationshipApiController:
autowire: true autowire: true
tags: ['controller.service_arguments'] tags: ['controller.service_arguments']
Chill\PersonBundle\Controller\SocialIssueApiController:
autowire: true
autoconfigure: true