From 60f6cd95b44d71daf4711cfa732ef9c795f228e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Mon, 23 Apr 2018 21:33:07 +0200 Subject: [PATCH] improve single task list - move to a new controller - refactor to be more adaptive to context - partial autowiring --- Controller/SingleTaskController.php | 122 +++++++++++++++++---- Controller/TaskController.php | 86 --------------- DependencyInjection/ChillTaskExtension.php | 15 ++- Resources/config/services/controller.yml | 7 +- Resources/config/services/repositories.yml | 2 + 5 files changed, 121 insertions(+), 111 deletions(-) diff --git a/Controller/SingleTaskController.php b/Controller/SingleTaskController.php index 1594b3e7b..36494ab17 100644 --- a/Controller/SingleTaskController.php +++ b/Controller/SingleTaskController.php @@ -14,28 +14,14 @@ use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\FormFactoryInterface; use Chill\TaskBundle\Security\Authorization\TaskVoter; use Symfony\Component\Security\Core\Role\Role; +use Chill\MainBundle\Entity\User; +use Chill\PersonBundle\Security\Authorization\PersonVoter; +use Chill\TaskBundle\Repository\SingleTaskRepository; +use Chill\MainBundle\Pagination\PaginatorFactory; class SingleTaskController extends Controller { - /** - * - * @var EntityManager - */ - protected $em; - - /** - * - * @var FormFactoryInterface - */ - protected $formFactory; - - /*public function __construct( - EntityManager $em, - FormFactoryInterface $formFactory) - { - $this->em = $em; - $this->formFactory = $formFactory; - }*/ + /** * @Route("/{_locale}/task/single-task/new") @@ -73,10 +59,15 @@ class SingleTaskController extends Controller if ($form->isValid()) { $em = $this->getDoctrine()->getManager(); $em->persist($task); + + $em->flush(); $this->addFlash('success', "The task is created"); - - $em->flush(); + + return $this->redirectToRoute('chill_task_task_list', [ + 'personId' => $task->getPerson()->getId() + ]); + } else { $this->addFlash('error', "This form contains errors"); } @@ -104,5 +95,94 @@ class SingleTaskController extends Controller return $form; } + + /** + * @Route( + * "/{_locale}/task/task/list/person/{personId}", + * name="chill_task_task_list" + * ) + */ + public function listAction( + Request $request, + Person $personId, + PaginatorFactory $paginatorFactory + ) { + $person = $personId; + /* @var $taskRepository SingleTaskRepository */ + $taskRepository = $this->get('chill_task.single_task_repository'); + /* @var $viewParams array The parameters for the view */ + $viewParams['person'] = $person; + + // collect parameters for filter + $params['person'] = $person; + + if ($request->query->has('date_status')) { + $statuses = $request->query->get('date_status'); + $singleStatus = count($statuses) === 1; + // check for invalid parameters + $diff = \array_diff( + $statuses, + SingleTaskRepository::DATE_STATUSES) + ; + + if (count($diff) > 0) { + return new Response( + 'date_status not allowed: '. \implode(', ', $diff), + Response::HTTP_BAD_REQUEST + ); + } + } + + foreach(SingleTaskRepository::DATE_STATUSES as $type) { + if($request->query->has('date_status') + && FALSE === \in_array($type, $statuses ?? [])) { + continue; + } + + $params['date_status'] = $type; + $count = $taskRepository + ->countByParameters($params, $this->getUser()) + ; + $paginator = $paginatorFactory->create($count); + $viewParams['single_task_'.$type.'_count'] = $count; + $viewParams['single_task_'.$type.'_paginator'] = $paginator; + $viewParams['single_task_'.$type.'_tasks'] = $taskRepository + ->findByParameters($params, $this->getUser(), + $singleStatus ? $paginator->getCurrentPage()->getFirstItemNumber() : 0, + $singleStatus ? $paginator->getItemsPerPage() : 10) + ; + } + + return $this->render('ChillTaskBundle:Task:index.html.twig', $viewParams); + } + + protected function getPersonParam(Request $request, EntityManagerInterface $em) + { + $person = $em->getRepository(Person::class) + ->find($request->query->getInt('person_id')) + ; + + if (NULL === $person) { + throw $this->createNotFoundException('person not found'); + } + + $this->denyAccessUnlessGranted(PersonVoter::SEE, $person, "You are " + . "not allowed to see this person"); + + return $person; + } + + protected function getUserParam(Request $request, EntityManagerInterface $em) + { + $user = $em->getRepository(User::class) + ->find($request->query->getInt('user_id')) + ; + + if (NULL === $user) { + throw $this->createNotFoundException('user not found'); + } + + return $user; + } } diff --git a/Controller/TaskController.php b/Controller/TaskController.php index 91094c480..a2d66f01a 100644 --- a/Controller/TaskController.php +++ b/Controller/TaskController.php @@ -14,92 +14,6 @@ use Symfony\Component\HttpFoundation\Response; class TaskController extends Controller { - /** - * @Route( - * "/{_locale}/task/task/list/{personId}", - * name="chill_task_task_list" - * ) - */ - public function listAction(Request $request, Person $personId) - { - $person = $personId; - /* @var $taskRepository SingleTaskRepository */ - $taskRepository = $this->get('chill_task.single_task_repository'); - /* @var $paginatorFactory \Chill\MainBundle\Pagination\PaginatorFactory */ - $paginatorFactory = $this->get('chill_main.paginator_factory'); - /* @var $viewParams array The parameters for the view */ - $viewParams['person'] = $person; - - // collect parameters for filter - $params['person'] = $person; - - if ($request->query->has('date_status')) { - $statuses = $request->query->get('date_status'); - $singleStatus = count($statuses) === 1; - // check for invalid parameters - $diff = \array_diff( - $statuses, - SingleTaskRepository::DATE_STATUSES) - ; - - if (count($diff) > 0) { - return new Response( - 'date_status not allowed: '. \implode(', ', $diff), - Response::HTTP_BAD_REQUEST - ); - } - } - - foreach(SingleTaskRepository::DATE_STATUSES as $type) { - if($request->query->has('date_status') - && FALSE === \in_array($type, $statuses ?? [])) { - continue; - } - - $params['date_status'] = $type; - $count = $taskRepository - ->countByParameters($params, $this->getUser()) - ; - $paginator = $paginatorFactory->create($count); - $viewParams['single_task_'.$type.'_count'] = $count; - $viewParams['single_task_'.$type.'_paginator'] = $paginator; - $viewParams['single_task_'.$type.'_tasks'] = $taskRepository - ->findByParameters($params, $this->getUser(), - $singleStatus ? $paginator->getCurrentPage()->getFirstItemNumber() : 0, - $singleStatus ? $paginator->getItemsPerPage() : 10) - ; - } - - return $this->render('ChillTaskBundle:Task:index.html.twig', $viewParams); - } - - protected function getPersonParam(Request $request, EntityManagerInterface $em) - { - $person = $em->getRepository(Person::class) - ->find($request->query->getInt('person_id')) - ; - if (NULL === $person) { - throw $this->createNotFoundException('person not found'); - } - - $this->denyAccessUnlessGranted(PersonVoter::SEE, $person, "You are " - . "not allowed to see this person"); - - return $person; - } - - protected function getUserParam(Request $request, EntityManagerInterface $em) - { - $user = $em->getRepository(User::class) - ->find($request->query->getInt('user_id')) - ; - - if (NULL === $user) { - throw $this->createNotFoundException('user not found'); - } - - return $user; - } } diff --git a/DependencyInjection/ChillTaskExtension.php b/DependencyInjection/ChillTaskExtension.php index b9c44e94f..c1603516b 100644 --- a/DependencyInjection/ChillTaskExtension.php +++ b/DependencyInjection/ChillTaskExtension.php @@ -33,9 +33,22 @@ class ChillTaskExtension extends Extension implements PrependExtensionInterface public function prepend(ContainerBuilder $container) { $this->prependAuthorization($container); + $this->prependRoute($container); } - public function prependAuthorization(ContainerBuilder $container) + protected function prependRoute(ContainerBuilder $container) + { + //declare routes for person bundle + $container->prependExtensionConfig('chill_main', array( + 'routing' => array( + 'resources' => array( + '@ChillTaskBundle/Resources/config/routing.yml' + ) + ) + )); + } + + protected function prependAuthorization(ContainerBuilder $container) { $container->prependExtensionConfig('security', array( 'role_hierarchy' => array( diff --git a/Resources/config/services/controller.yml b/Resources/config/services/controller.yml index 9edb4e9ad..ffc82a48a 100644 --- a/Resources/config/services/controller.yml +++ b/Resources/config/services/controller.yml @@ -1,4 +1,5 @@ services: - #chill_task.single_task_controller: - # class: Chill\TaskBundle\Controller\SingleTaskController - # autowire: true + Chill\TaskBundle\Controller\: + #autowire: true + resource: '../../../Controller' + tags: ['controller.service_arguments'] diff --git a/Resources/config/services/repositories.yml b/Resources/config/services/repositories.yml index 3951cdeed..062a3fa95 100644 --- a/Resources/config/services/repositories.yml +++ b/Resources/config/services/repositories.yml @@ -8,3 +8,5 @@ services: - method: setAuthorizationHelper arguments: - "@chill.main.security.authorization.helper" + + Chill\TaskBundle\Repository\SingleTaskRepository: '@chill_task.single_task_repository'