fix: SA: Fix "...invoked with..." rule.

SA stands for Static Analysis.
This commit is contained in:
Pol Dellaiera 2021-11-16 12:16:02 +01:00
parent a3eb23478a
commit c68bda5c9b
No known key found for this signature in database
GPG Key ID: D476DFE9C67467CA
11 changed files with 183 additions and 355 deletions

View File

@ -85,16 +85,6 @@ parameters:
count: 2 count: 2
path: src/Bundle/ChillActivityBundle/Timeline/TimelineActivityProvider.php path: src/Bundle/ChillActivityBundle/Timeline/TimelineActivityProvider.php
-
message: "#^Method Chill\\\\ActivityBundle\\\\Timeline\\\\TimelineActivityProvider\\:\\:getFromClausePerson\\(\\) invoked with 1 parameter, 0 required\\.$#"
count: 1
path: src/Bundle/ChillActivityBundle/Timeline/TimelineActivityProvider.php
-
message: "#^Method Chill\\\\MainBundle\\\\CRUD\\\\Controller\\\\CRUDController\\:\\:buildQueryEntities\\(\\) invoked with 3 parameters, 2 required\\.$#"
count: 1
path: src/Bundle/ChillAsideActivityBundle/src/Controller/AsideActivityController.php
- -
message: "#^Access to an undefined property Chill\\\\AsideActivityBundle\\\\Entity\\\\AsideActivityCategory\\:\\:\\$oldParent\\.$#" message: "#^Access to an undefined property Chill\\\\AsideActivityBundle\\\\Entity\\\\AsideActivityCategory\\:\\:\\$oldParent\\.$#"
count: 2 count: 2
@ -250,11 +240,6 @@ parameters:
count: 1 count: 1
path: src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php path: src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php
-
message: "#^Class Chill\\\\DocStoreBundle\\\\Entity\\\\DocumentCategory constructor invoked with 0 parameters, 2 required\\.$#"
count: 1
path: src/Bundle/ChillDocStoreBundle/Controller/DocumentCategoryController.php
- -
message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
count: 1 count: 1
@ -360,16 +345,6 @@ parameters:
count: 1 count: 1
path: src/Bundle/ChillMainBundle/CRUD/Controller/AbstractCRUDController.php path: src/Bundle/ChillMainBundle/CRUD/Controller/AbstractCRUDController.php
-
message: "#^Method Chill\\\\MainBundle\\\\CRUD\\\\Controller\\\\AbstractCRUDController\\:\\:getEntity\\(\\) invoked with 4 parameters, 3 required\\.$#"
count: 3
path: src/Bundle/ChillMainBundle/CRUD/Controller/ApiController.php
-
message: "#^Method Chill\\\\MainBundle\\\\CRUD\\\\Controller\\\\ApiController\\:\\:entityPostAction\\(\\) invoked with 4 parameters, 3 required\\.$#"
count: 1
path: src/Bundle/ChillMainBundle/CRUD/Controller/ApiController.php
- -
message: "#^Variable \\$entity in isset\\(\\) is never defined\\.$#" message: "#^Variable \\$entity in isset\\(\\) is never defined\\.$#"
count: 1 count: 1
@ -385,16 +360,6 @@ parameters:
count: 1 count: 1
path: src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php path: src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php
-
message: "#^Method Chill\\\\MainBundle\\\\CRUD\\\\Controller\\\\CRUDController\\:\\:buildQueryEntities\\(\\) invoked with 3 parameters, 2 required\\.$#"
count: 2
path: src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php
-
message: "#^Method Chill\\\\MainBundle\\\\CRUD\\\\Controller\\\\CRUDController\\:\\:onPreDelete\\(\\) invoked with 3 parameters, 2 required\\.$#"
count: 1
path: src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php
- -
message: "#^Parameter \\$scope of method Chill\\\\MainBundle\\\\CRUD\\\\Controller\\\\CRUDController\\:\\:getReachableCenters\\(\\) has invalid type Chill\\\\MainBundle\\\\CRUD\\\\Controller\\\\Scope\\.$#" message: "#^Parameter \\$scope of method Chill\\\\MainBundle\\\\CRUD\\\\Controller\\\\CRUDController\\:\\:getReachableCenters\\(\\) has invalid type Chill\\\\MainBundle\\\\CRUD\\\\Controller\\\\Scope\\.$#"
count: 1 count: 1
@ -520,21 +485,6 @@ parameters:
count: 1 count: 1
path: src/Bundle/ChillMainBundle/Controller/UserController.php path: src/Bundle/ChillMainBundle/Controller/UserController.php
-
message: "#^Method Chill\\\\MainBundle\\\\Controller\\\\UserController\\:\\:createAddLinkGroupCenterForm\\(\\) invoked with 1 parameter, 2 required\\.$#"
count: 1
path: src/Bundle/ChillMainBundle/Controller/UserController.php
-
message: "#^Method Chill\\\\MainBundle\\\\Controller\\\\UserController\\:\\:createEditPasswordForm\\(\\) invoked with 2 parameters, 1 required\\.$#"
count: 1
path: src/Bundle/ChillMainBundle/Controller/UserController.php
-
message: "#^Method Chill\\\\MainBundle\\\\Controller\\\\UserController\\:\\:getDeleteLinkGroupCenterByUser\\(\\) invoked with 1 parameter, 2 required\\.$#"
count: 1
path: src/Bundle/ChillMainBundle/Controller/UserController.php
- -
message: "#^Call to function in_array\\(\\) requires parameter \\#3 to be set\\.$#" message: "#^Call to function in_array\\(\\) requires parameter \\#3 to be set\\.$#"
count: 2 count: 2
@ -720,11 +670,6 @@ parameters:
count: 1 count: 1
path: src/Bundle/ChillMainBundle/Search/Entity/SearchUserApiProvider.php path: src/Bundle/ChillMainBundle/Search/Entity/SearchUserApiProvider.php
-
message: "#^Method Chill\\\\MainBundle\\\\Search\\\\SearchApi\\:\\:buildUnionQuery\\(\\) invoked with 4 parameters, 3 required\\.$#"
count: 1
path: src/Bundle/ChillMainBundle/Search/SearchApi.php
- -
message: "#^Access to an undefined property Chill\\\\MainBundle\\\\Search\\\\SearchApiResult\\:\\:\\$relevance\\.$#" message: "#^Access to an undefined property Chill\\\\MainBundle\\\\Search\\\\SearchApiResult\\:\\:\\$relevance\\.$#"
count: 2 count: 2
@ -750,11 +695,6 @@ parameters:
count: 2 count: 2
path: src/Bundle/ChillMainBundle/Security/Authorization/AbstractChillVoter.php path: src/Bundle/ChillMainBundle/Security/Authorization/AbstractChillVoter.php
-
message: "#^Method Chill\\\\MainBundle\\\\Security\\\\Authorization\\\\AuthorizationHelper\\:\\:userCanReachCenter\\(\\) invoked with 3 parameters, 2 required\\.$#"
count: 1
path: src/Bundle/ChillMainBundle/Security/Authorization/AuthorizationHelper.php
- -
message: "#^Call to function in_array\\(\\) requires parameter \\#3 to be set\\.$#" message: "#^Call to function in_array\\(\\) requires parameter \\#3 to be set\\.$#"
count: 2 count: 2
@ -945,11 +885,6 @@ parameters:
count: 1 count: 1
path: src/Bundle/ChillPersonBundle/Entity/Person.php path: src/Bundle/ChillPersonBundle/Entity/Person.php
-
message: "#^Method Chill\\\\PersonBundle\\\\Entity\\\\Person\\:\\:getCurrentPersonAddress\\(\\) invoked with 1 parameter, 0 required\\.$#"
count: 1
path: src/Bundle/ChillPersonBundle/Entity/Person.php
- -
message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
count: 2 count: 2

View File

@ -1,85 +1,44 @@
<?php <?php
/* declare(strict_types=1);
* Chill is a software for social workers
* Copyright (C) 2015 Champs Libres <info@champs-libres.coop>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Chill\ActivityBundle\Timeline; namespace Chill\ActivityBundle\Timeline;
use Chill\MainBundle\Entity\User;
use Chill\MainBundle\Security\Authorization\AuthorizationHelperInterface;
use Chill\MainBundle\Timeline\TimelineProviderInterface; use Chill\MainBundle\Timeline\TimelineProviderInterface;
use Chill\ActivityBundle\Repository\ActivityACLAwareRepository; use Chill\ActivityBundle\Repository\ActivityACLAwareRepository;
use Doctrine\ORM\EntityManager; use Doctrine\ORM\EntityManagerInterface;
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Role\Role; use Symfony\Component\Security\Core\Role\Role;
use Doctrine\ORM\Mapping\ClassMetadata;
use Chill\PersonBundle\Entity\Person; use Chill\PersonBundle\Entity\Person;
use Chill\MainBundle\Entity\Scope;
use Chill\ActivityBundle\Entity\Activity; use Chill\ActivityBundle\Entity\Activity;
use Chill\MainBundle\Timeline\TimelineSingleQuery; use Chill\MainBundle\Timeline\TimelineSingleQuery;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* Provide activity for inclusion in timeline
*
*/
class TimelineActivityProvider implements TimelineProviderInterface class TimelineActivityProvider implements TimelineProviderInterface
{ {
protected EntityManagerInterface $em;
/** protected AuthorizationHelperInterface $helper;
*
* @var EntityManager
*/
protected $em;
/** protected UserInterface $user;
*
* @var AuthorizationHelper
*/
protected $helper;
/**
*
* @var \Chill\MainBundle\Entity\User
*/
protected $user;
protected ActivityACLAwareRepository $aclAwareRepository; protected ActivityACLAwareRepository $aclAwareRepository;
private const SUPPORTED_CONTEXTS = [ 'center', 'person']; private const SUPPORTED_CONTEXTS = [ 'center', 'person'];
/**
* TimelineActivityProvider constructor.
*
* @param EntityManager $em
* @param AuthorizationHelper $helper
* @param TokenStorageInterface $storage
*/
public function __construct( public function __construct(
EntityManager $em, EntityManagerInterface $em,
AuthorizationHelper $helper, AuthorizationHelperInterface $helper,
TokenStorageInterface $storage, TokenStorageInterface $storage,
ActivityACLAwareRepository $aclAwareRepository ActivityACLAwareRepository $aclAwareRepository
) ) {
{
$this->em = $em; $this->em = $em;
$this->helper = $helper; $this->helper = $helper;
$this->aclAwareRepository = $aclAwareRepository; $this->aclAwareRepository = $aclAwareRepository;
if (!$storage->getToken()->getUser() instanceof \Chill\MainBundle\Entity\User) if (!$storage->getToken()->getUser() instanceof User)
{ {
throw new \RuntimeException('A user should be authenticated !'); throw new \RuntimeException('A user should be authenticated !');
} }
@ -108,7 +67,7 @@ class TimelineActivityProvider implements TimelineProviderInterface
'type' => 'activity', 'type' => 'activity',
'date' => $metadataActivity->getTableName() 'date' => $metadataActivity->getTableName()
.'.'.$metadataActivity->getColumnName('date'), .'.'.$metadataActivity->getColumnName('date'),
'FROM' => $this->getFromClausePerson($args['person']), 'FROM' => $this->getFromClausePerson(),
'WHERE' => $where, 'WHERE' => $where,
'parameters' => $parameters 'parameters' => $parameters
]); ]);
@ -152,26 +111,23 @@ class TimelineActivityProvider implements TimelineProviderInterface
]; ];
} }
private function getFromClausePerson() private function getFromClausePerson(): string
{ {
$metadataActivity = $this->em->getClassMetadata(Activity::class); $metadataActivity = $this->em->getClassMetadata(Activity::class);
$metadataPerson = $this->em->getClassMetadata(Person::class); $metadataPerson = $this->em->getClassMetadata(Person::class);
$associationMapping = $metadataActivity->getAssociationMapping('person'); $associationMapping = $metadataActivity->getAssociationMapping('person');
return $metadataActivity->getTableName().' JOIN ' return sprintf(
.$metadataPerson->getTableName().' ON ' "%s JOIN %s ON %s.%s = %s",
.$metadataPerson->getTableName().'.'. $metadataActivity->getTableName(),
$associationMapping['joinColumns'][0]['referencedColumnName'] $metadataPerson->getTableName(),
.' = ' $metadataPerson->getTableName(),
.$associationMapping['joinColumns'][0]['name'] $associationMapping['joinColumns'][0]['referencedColumnName'],
; $associationMapping['joinColumns'][0]['name']
);
} }
/** public function getEntities(array $ids): array
*
* {@inheritDoc}
*/
public function getEntities(array $ids)
{ {
$activities = $this->em->getRepository(Activity::class) $activities = $this->em->getRepository(Activity::class)
->findBy(array('id' => $ids)); ->findBy(array('id' => $ids));
@ -184,11 +140,7 @@ class TimelineActivityProvider implements TimelineProviderInterface
return $result; return $result;
} }
/** public function getEntityTemplate($entity, $context, array $args): array
*
* {@inheritDoc}
*/
public function getEntityTemplate($entity, $context, array $args)
{ {
$this->checkContext($context); $this->checkContext($context);
@ -201,26 +153,25 @@ class TimelineActivityProvider implements TimelineProviderInterface
]; ];
} }
/** public function supportsType($type): bool
*
* {@inheritDoc}
*/
public function supportsType($type)
{ {
return $type === 'activity'; return $type === 'activity';
} }
/** /**
* check if the context is supported * Check if the context is supported.
* *
* @param string $context
* @throws \LogicException if the context is not supported * @throws \LogicException if the context is not supported
*/ */
private function checkContext($context) private function checkContext(string $context)
{ {
if (FALSE === \in_array($context, self::SUPPORTED_CONTEXTS)) { if (FALSE === \in_array($context, self::SUPPORTED_CONTEXTS)) {
throw new \LogicException("The context '$context' is not " throw new \LogicException(
. "supported. Currently only 'person' is supported"); sprintf(
"The context '%s' is not supported. Currently only 'person' is supported",
$context
)
);
} }
} }

View File

@ -15,8 +15,7 @@ use Doctrine\Common\Collections\Criteria;
final class AsideActivityController extends CRUDController final class AsideActivityController extends CRUDController
{ {
private AsideActivityCategoryRepository $categoryRepository;
private $categoryRepository;
public function __construct(AsideActivityCategoryRepository $categoryRepository) public function __construct(AsideActivityCategoryRepository $categoryRepository)
{ {
@ -25,7 +24,7 @@ final class AsideActivityController extends CRUDController
protected function buildQueryEntities(string $action, Request $request, ?FilterOrderHelper $filterOrder = null) protected function buildQueryEntities(string $action, Request $request, ?FilterOrderHelper $filterOrder = null)
{ {
$qb = parent::buildQueryEntities($action, $request, $filterOrder); $qb = parent::buildQueryEntities($action, $request);
if ('index' === $action) { if ('index' === $action) {
$qb->where($qb->expr()->eq('e.agent', ':user')); $qb->where($qb->expr()->eq('e.agent', ':user'));

View File

@ -1,5 +1,7 @@
<?php <?php
declare(strict_types=1);
namespace Chill\DocStoreBundle\Controller; namespace Chill\DocStoreBundle\Controller;
use Chill\DocStoreBundle\Entity\DocumentCategory; use Chill\DocStoreBundle\Entity\DocumentCategory;
@ -9,11 +11,9 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Annotation\Route;
use Chill\DocStoreBundle\ChillDocStoreBundle;
/** /**
* Class DocumentCategoryController
*
* @package Chill\DocStoreBundle\Controller
* @Route("/{_locale}/admin/document/category") * @Route("/{_locale}/admin/document/category")
*/ */
class DocumentCategoryController extends AbstractController class DocumentCategoryController extends AbstractController
@ -24,11 +24,14 @@ class DocumentCategoryController extends AbstractController
public function index(): Response public function index(): Response
{ {
$em = $this->getDoctrine()->getManager(); $em = $this->getDoctrine()->getManager();
$categories = $em->getRepository("ChillDocStoreBundle:DocumentCategory")->findAll(); $categories = $em->getRepository(DocumentCategory::class)->findAll();
return $this->render( return $this->render(
'ChillDocStoreBundle:DocumentCategory:index.html.twig', 'ChillDocStoreBundle:DocumentCategory:index.html.twig',
['document_categories' => $categories]); [
'document_categories' => $categories,
]
);
} }
/** /**
@ -37,13 +40,10 @@ class DocumentCategoryController extends AbstractController
public function new(Request $request): Response public function new(Request $request): Response
{ {
$em = $this->getDoctrine()->getManager(); $em = $this->getDoctrine()->getManager();
$documentCategory = new DocumentCategory(); $documentCategory = new DocumentCategory(
$documentCategory ChillDocStoreBundle::class,
->setBundleId('Chill\DocStoreBundle\ChillDocStoreBundle'); $em->getRepository(DocumentCategory::class)->nextIdInsideBundle()
$documentCategory );
->setIdInsideBundle(
$em->getRepository("ChillDocStoreBundle:DocumentCategory")
->nextIdInsideBundle());
$documentCategory $documentCategory
->setDocumentClass(PersonDocument::class); ->setDocumentClass(PersonDocument::class);
@ -56,11 +56,10 @@ class DocumentCategoryController extends AbstractController
$em->flush(); $em->flush();
return $this->redirectToRoute('document_category_index'); return $this->redirectToRoute('document_category_index');
} else {
$documentCategory->setBundleId(
'Chill\DocStoreBundle\ChillDocStoreBundle');
} }
$documentCategory->setBundleId(ChillDocStoreBundle::class);
return $this->render('ChillDocStoreBundle:DocumentCategory:new.html.twig', [ return $this->render('ChillDocStoreBundle:DocumentCategory:new.html.twig', [
'document_category' => $documentCategory, 'document_category' => $documentCategory,
'form' => $form->createView(), 'form' => $form->createView(),

View File

@ -1,5 +1,7 @@
<?php <?php
declare(strict_types=1);
namespace Chill\MainBundle\CRUD\Controller; namespace Chill\MainBundle\CRUD\Controller;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
@ -34,7 +36,7 @@ class ApiController extends AbstractCRUDController
*/ */
protected function entityGet(string $action, Request $request, $id, $_format = 'html'): Response protected function entityGet(string $action, Request $request, $id, $_format = 'html'): Response
{ {
$entity = $this->getEntity($action, $id, $request, $_format); $entity = $this->getEntity($action, $id, $request);
$postFetch = $this->onPostFetchEntity($action, $request, $entity, $_format); $postFetch = $this->onPostFetchEntity($action, $request, $entity, $_format);
@ -86,7 +88,7 @@ class ApiController extends AbstractCRUDController
case Request::METHOD_PATCH: case Request::METHOD_PATCH:
return $this->entityPut('_entity', $request, $id, $_format); return $this->entityPut('_entity', $request, $id, $_format);
case Request::METHOD_POST: case Request::METHOD_POST:
return $this->entityPostAction('_entity', $request, $id, $_format); return $this->entityPostAction('_entity', $request, $id);
case Request::METHOD_DELETE: case Request::METHOD_DELETE:
return $this->entityDelete('_entity', $request, $id, $_format); return $this->entityDelete('_entity', $request, $id, $_format);
default: default:
@ -158,7 +160,7 @@ class ApiController extends AbstractCRUDController
} }
public function entityPut($action, Request $request, $id, string $_format): Response public function entityPut($action, Request $request, $id, string $_format): Response
{ {
$entity = $this->getEntity($action, $id, $request, $_format); $entity = $this->getEntity($action, $id, $request);
$postFetch = $this->onPostFetchEntity($action, $request, $entity, $_format); $postFetch = $this->onPostFetchEntity($action, $request, $entity, $_format);
if ($postFetch instanceof Response) { if ($postFetch instanceof Response) {
@ -221,7 +223,7 @@ class ApiController extends AbstractCRUDController
} }
public function entityDelete($action, Request $request, $id, string $_format): Response public function entityDelete($action, Request $request, $id, string $_format): Response
{ {
$entity = $this->getEntity($action, $id, $request, $_format); $entity = $this->getEntity($action, $id, $request);
if (NULL === $entity) { if (NULL === $entity) {
throw $this->createNotFoundException(sprintf("The %s with id %s " throw $this->createNotFoundException(sprintf("The %s with id %s "

View File

@ -52,7 +52,7 @@ class CRUDController extends AbstractController
*/ */
protected function deleteAction(string $action, Request $request, $id, $formClass = null): Response protected function deleteAction(string $action, Request $request, $id, $formClass = null): Response
{ {
$this->onPreDelete($action, $request, $id); $this->onPreDelete($action, $request);
$entity = $this->getEntity($action, $id, $request); $entity = $this->getEntity($action, $id, $request);
@ -311,11 +311,12 @@ class CRUDController extends AbstractController
*/ */
protected function buildQueryEntities(string $action, Request $request) protected function buildQueryEntities(string $action, Request $request)
{ {
$query = $this->getDoctrine()->getManager() $query = $this
->getDoctrine()
->getManager()
->createQueryBuilder() ->createQueryBuilder()
->select('e') ->select('e')
->from($this->getEntityClass(), 'e') ->from($this->getEntityClass(), 'e');
;
$this->customizeQuery($action, $request, $query); $this->customizeQuery($action, $request, $query);
@ -340,7 +341,7 @@ class CRUDController extends AbstractController
*/ */
protected function queryEntities(string $action, Request $request, PaginatorInterface $paginator, ?FilterOrderHelper $filterOrder = null) protected function queryEntities(string $action, Request $request, PaginatorInterface $paginator, ?FilterOrderHelper $filterOrder = null)
{ {
$query = $this->buildQueryEntities($action, $request, $filterOrder) $query = $this->buildQueryEntities($action, $request)
->setFirstResult($paginator->getCurrentPage()->getFirstItemNumber()) ->setFirstResult($paginator->getCurrentPage()->getFirstItemNumber())
->setMaxResults($paginator->getItemsPerPage()); ->setMaxResults($paginator->getItemsPerPage());
@ -389,7 +390,7 @@ class CRUDController extends AbstractController
*/ */
protected function countEntities(string $action, Request $request, ?FilterOrderHelper $filterOrder = null): int protected function countEntities(string $action, Request $request, ?FilterOrderHelper $filterOrder = null): int
{ {
return $this->buildQueryEntities($action, $request, $filterOrder) return $this->buildQueryEntities($action, $request)
->select('COUNT(e)') ->select('COUNT(e)')
->getQuery() ->getQuery()
->getSingleScalarResult() ->getSingleScalarResult()

View File

@ -1,5 +1,7 @@
<?php <?php
declare(strict_types=1);
namespace Chill\MainBundle\Controller; namespace Chill\MainBundle\Controller;
use Chill\MainBundle\CRUD\Controller\AbstractCRUDController; use Chill\MainBundle\CRUD\Controller\AbstractCRUDController;
@ -7,6 +9,7 @@ use Chill\MainBundle\CRUD\Controller\CRUDController;
use Chill\MainBundle\Pagination\PaginatorInterface; use Chill\MainBundle\Pagination\PaginatorInterface;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
use Symfony\Component\Form\Form;
use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
@ -16,40 +19,23 @@ use Chill\MainBundle\Form\UserType;
use Chill\MainBundle\Entity\GroupCenter; use Chill\MainBundle\Entity\GroupCenter;
use Chill\MainBundle\Form\Type\ComposedGroupCenterType; use Chill\MainBundle\Form\Type\ComposedGroupCenterType;
use Chill\MainBundle\Form\UserPasswordType; use Chill\MainBundle\Form\UserPasswordType;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface; use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface; use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter; use Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter;
/**
* Class UserController
*
* @package Chill\MainBundle\Controller
*/
class UserController extends CRUDController class UserController extends CRUDController
{ {
const FORM_GROUP_CENTER_COMPOSED = 'composed_groupcenter'; const FORM_GROUP_CENTER_COMPOSED = 'composed_groupcenter';
/** private LoggerInterface $logger;
* @var \Psr\Log\LoggerInterface
*/
private $logger;
/** private ValidatorInterface $validator;
* @var ValidatorInterface
*/
private $validator;
private UserPasswordEncoderInterface $passwordEncoder; private UserPasswordEncoderInterface $passwordEncoder;
/**
* UserController constructor.
*
* @param LoggerInterface $logger
* @param ValidatorInterface $validator
*/
public function __construct( public function __construct(
LoggerInterface $chillLogger, LoggerInterface $chillLogger,
ValidatorInterface $validator, ValidatorInterface $validator,
@ -121,7 +107,7 @@ class UserController extends CRUDController
*/ */
public function editPasswordAction(User $user, Request $request) public function editPasswordAction(User $user, Request $request)
{ {
$editForm = $this->createEditPasswordForm($user, $request); $editForm = $this->createEditPasswordForm($user);
$editForm->handleRequest($request); $editForm->handleRequest($request);
if ($editForm->isSubmitted() && $editForm->isValid()) { if ($editForm->isSubmitted() && $editForm->isValid()) {
@ -208,7 +194,7 @@ class UserController extends CRUDController
* @Route("/{_locale}/admin/main/user/{uid}/add_link_groupcenter", * @Route("/{_locale}/admin/main/user/{uid}/add_link_groupcenter",
* name="admin_user_add_groupcenter") * name="admin_user_add_groupcenter")
*/ */
public function addLinkGroupCenterAction(Request $request, $uid): RedirectResponse public function addLinkGroupCenterAction(Request $request, $uid): Response
{ {
$em = $this->getDoctrine()->getManager(); $em = $this->getDoctrine()->getManager();
@ -238,23 +224,22 @@ class UserController extends CRUDController
return $this->redirect($this->generateUrl('chill_crud_admin_user_edit', return $this->redirect($this->generateUrl('chill_crud_admin_user_edit',
\array_merge(['id' => $uid], $returnPathParams))); \array_merge(['id' => $uid], $returnPathParams)));
} else { }
foreach($this->validator->validate($user) as $error)
foreach($this->validator->validate($user) as $error) {
$this->addFlash('error', $error->getMessage()); $this->addFlash('error', $error->getMessage());
} }
} }
return $this->render('@ChillMain/User/edit.html.twig', array( return $this->render('@ChillMain/User/edit.html.twig', [
'entity' => $user, 'entity' => $user,
'edit_form' => $this->createEditForm($user)->createView(), 'edit_form' => $this->createEditForm($user)->createView(),
'add_groupcenter_form' => $this->createAddLinkGroupCenterForm($user)->createView(), 'add_groupcenter_form' => $this->createAddLinkGroupCenterForm($user, $request)->createView(),
'delete_groupcenter_form' => array_map( 'delete_groupcenter_form' => array_map(
function(\Symfony\Component\Form\Form $form) { static fn(Form $form) => $form->createView(),
return $form->createView(); iterator_to_array($this->getDeleteLinkGroupCenterByUser($user, $request), true)
)
}, ]);
iterator_to_array($this->getDeleteLinkGroupCenterByUser($user), true))
));
} }
private function getPersistedGroupCenter(GroupCenter $groupCenter) private function getPersistedGroupCenter(GroupCenter $groupCenter)
@ -279,10 +264,8 @@ class UserController extends CRUDController
* Creates a form to delete a link to a GroupCenter * Creates a form to delete a link to a GroupCenter
* *
* @param mixed $permissionsGroup The entity id * @param mixed $permissionsGroup The entity id
*
* @return \Symfony\Component\Form\Form The form
*/ */
private function createDeleteLinkGroupCenterForm(User $user, GroupCenter $groupCenter, $request) private function createDeleteLinkGroupCenterForm(User $user, GroupCenter $groupCenter, $request): FormInterface
{ {
$returnPathParams = $request->query->has('returnPath') ? ['returnPath' => $request->query->get('returnPath')] : []; $returnPathParams = $request->query->has('returnPath') ? ['returnPath' => $request->query->get('returnPath')] : [];
@ -291,17 +274,13 @@ class UserController extends CRUDController
array_merge($returnPathParams, ['uid' => $user->getId(), 'gcid' => $groupCenter->getId()]))) array_merge($returnPathParams, ['uid' => $user->getId(), 'gcid' => $groupCenter->getId()])))
->setMethod('DELETE') ->setMethod('DELETE')
->add('submit', SubmitType::class, array('label' => 'Delete')) ->add('submit', SubmitType::class, array('label' => 'Delete'))
->getForm() ->getForm();
;
} }
/** /**
* create a form to add a link to a groupcenter * Create a form to add a link to a groupcenter.
*
* @param User $user
* @return \Symfony\Component\Form\Form
*/ */
private function createAddLinkGroupCenterForm(User $user, Request $request) private function createAddLinkGroupCenterForm(User $user, Request $request): FormInterface
{ {
$returnPathParams = $request->query->has('returnPath') ? ['returnPath' => $request->query->get('returnPath')] : []; $returnPathParams = $request->query->has('returnPath') ? ['returnPath' => $request->query->get('returnPath')] : [];
@ -311,19 +290,13 @@ class UserController extends CRUDController
->setMethod('POST') ->setMethod('POST')
->add(self::FORM_GROUP_CENTER_COMPOSED, ComposedGroupCenterType::class) ->add(self::FORM_GROUP_CENTER_COMPOSED, ComposedGroupCenterType::class)
->add('submit', SubmitType::class, array('label' => 'Add a new groupCenter')) ->add('submit', SubmitType::class, array('label' => 'Add a new groupCenter'))
->getForm() ->getForm();
;
} }
/**
*
* @param User $user
*/
private function getDeleteLinkGroupCenterByUser(User $user, Request $request) private function getDeleteLinkGroupCenterByUser(User $user, Request $request)
{ {
foreach ($user->getGroupCenters() as $groupCenter) { foreach ($user->getGroupCenters() as $groupCenter) {
yield $groupCenter->getId() => $this yield $groupCenter->getId() => $this->createDeleteLinkGroupCenterForm($user, $groupCenter, $request);
->createDeleteLinkGroupCenterForm($user, $groupCenter, $request);
} }
} }
} }

View File

@ -1,5 +1,7 @@
<?php <?php
declare(strict_types=1);
namespace Chill\MainBundle\Search; namespace Chill\MainBundle\Search;
use Chill\MainBundle\Search\Entity\SearchUserApiProvider; use Chill\MainBundle\Search\Entity\SearchUserApiProvider;
@ -13,8 +15,6 @@ use Doctrine\ORM\Query\ResultSetMappingBuilder;
use Chill\MainBundle\Search\SearchProvider; use Chill\MainBundle\Search\SearchProvider;
use Symfony\Component\VarDumper\Resources\functions\dump; use Symfony\Component\VarDumper\Resources\functions\dump;
/**
*/
class SearchApi class SearchApi
{ {
private EntityManagerInterface $em; private EntityManagerInterface $em;
@ -28,8 +28,7 @@ class SearchApi
ThirdPartyApiSearch $thirdPartyApiSearch, ThirdPartyApiSearch $thirdPartyApiSearch,
SearchUserApiProvider $searchUser, SearchUserApiProvider $searchUser,
PaginatorFactory $paginator PaginatorFactory $paginator
) ) {
{
$this->em = $em; $this->em = $em;
$this->providers[] = $searchPerson; $this->providers[] = $searchPerson;
$this->providers[] = $thirdPartyApiSearch; $this->providers[] = $thirdPartyApiSearch;
@ -126,7 +125,7 @@ class SearchApi
private function fetchRawResult($queries, $types, $parameters, $paginator): array private function fetchRawResult($queries, $types, $parameters, $paginator): array
{ {
list($union, $parameters) = $this->buildUnionQuery($queries, $types, $parameters, $paginator); list($union, $parameters) = $this->buildUnionQuery($queries, $types, $parameters);
$rsm = new ResultSetMappingBuilder($this->em); $rsm = new ResultSetMappingBuilder($this->em);
$rsm->addScalarResult('key', 'key', Types::STRING) $rsm->addScalarResult('key', 'key', Types::STRING)
->addScalarResult('metadata', 'metadata', Types::JSON) ->addScalarResult('metadata', 'metadata', Types::JSON)

View File

@ -1,21 +1,6 @@
<?php <?php
/* declare(strict_types=1);
* Copyright (C) 2015 Julien Fastré <julien.fastre@champs-libres.coop>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Chill\MainBundle\Security\Authorization; namespace Chill\MainBundle\Security\Authorization;
@ -43,7 +28,6 @@ use Chill\MainBundle\Entity\RoleScope;
* Helper for authorizations. * Helper for authorizations.
* *
* Provides methods for user and entities information. * Provides methods for user and entities information.
*
*/ */
class AuthorizationHelper implements AuthorizationHelperInterface class AuthorizationHelper implements AuthorizationHelperInterface
{ {
@ -74,11 +58,7 @@ class AuthorizationHelper implements AuthorizationHelperInterface
/** /**
* Determines if a user is active on this center * Determines if a user is active on this center
* *
* If
*
* @param User $user
* @param Center|Center[] $center May be an array of center * @param Center|Center[] $center May be an array of center
* @return bool
*/ */
public function userCanReachCenter(User $user, $center): bool public function userCanReachCenter(User $user, $center): bool
{ {
@ -89,7 +69,9 @@ class AuthorizationHelper implements AuthorizationHelperInterface
} }
} }
return false; return false;
} elseif ($center instanceof Center) { }
if ($center instanceof Center) {
foreach ($user->getGroupCenters() as $groupCenter) { foreach ($user->getGroupCenters() as $groupCenter) {
if ($center->getId() === $groupCenter->getCenter()->getId()) { if ($center->getId() === $groupCenter->getCenter()->getId()) {
return true; return true;
@ -99,12 +81,16 @@ class AuthorizationHelper implements AuthorizationHelperInterface
return false; return false;
} }
throw new \UnexpectedValueException(sprintf("The entity given is not an ". throw new \UnexpectedValueException(
"instance of %s, %s given", Center::class, get_class($center))); sprintf(
'The entity given is not an instance of %s, %s given',
Center::class,
get_class($center)
)
);
} }
/** /**
*
* Determines if the user has access to the given entity. * Determines if the user has access to the given entity.
* *
* if the entity implements Chill\MainBundle\Entity\HasScopeInterface, * if the entity implements Chill\MainBundle\Entity\HasScopeInterface,
@ -243,7 +229,7 @@ class AuthorizationHelper implements AuthorizationHelperInterface
} }
foreach ($centers as $center) { foreach ($centers as $center) {
if ($this->userCanReachCenter($user, $center, $role)) { if ($this->userCanReachCenter($user, $center)) {
$results[] = $center; $results[] = $center;
} }
} }

View File

@ -494,6 +494,7 @@ EOF
$openingDateString = trim($row[array_search('opening_date', $headers)]); $openingDateString = trim($row[array_search('opening_date', $headers)]);
$openingDate = $this->processDate($openingDateString, $this->input->getOption('opening_date_format')); $openingDate = $this->processDate($openingDateString, $this->input->getOption('opening_date_format'));
// @TODO: Fix the constructor parameter, $openingDate does not exists.
$person = $openingDate instanceof \DateTime ? new Person($openingDate) : new Person(); $person = $openingDate instanceof \DateTime ? new Person($openingDate) : new Person();
// add the center // add the center
$center = $this->getCenter($row, $headers); $center = $this->getCenter($row, $headers);

View File

@ -1,26 +1,8 @@
<?php <?php
namespace Chill\PersonBundle\Entity; declare(strict_types=1);
/* namespace Chill\PersonBundle\Entity;
* Chill is a software for social workers
*
* Copyright (C) 2014-2015, Champs Libres Cooperative SCRLFS,
* <http://www.champs-libres.coop>, <info@champs-libres.coop>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
use ArrayIterator; use ArrayIterator;
use Chill\MainBundle\Doctrine\Model\TrackCreationInterface; use Chill\MainBundle\Doctrine\Model\TrackCreationInterface;
@ -1330,7 +1312,7 @@ class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateI
*/ */
public function getLastAddress(DateTime $from = null) public function getLastAddress(DateTime $from = null)
{ {
return $this->getCurrentPersonAddress($from); return $this->getCurrentPersonAddress();
} }
/** /**