mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-07 18:44:08 +00:00
91 lines
2.8 KiB
PHP
91 lines
2.8 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Chill is a software for social workers
|
|
*
|
|
* For the full copyright and license information, please view
|
|
* the LICENSE file that was distributed with this source code.
|
|
*/
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Chill\DocStoreBundle\Repository;
|
|
|
|
use Chill\DocStoreBundle\Entity\PersonDocument;
|
|
use Chill\DocStoreBundle\Security\Authorization\PersonDocumentVoter;
|
|
use Chill\MainBundle\Security\Authorization\AuthorizationHelperInterface;
|
|
use Chill\MainBundle\Security\Resolver\CenterResolverDispatcher;
|
|
use Chill\PersonBundle\Entity\Person;
|
|
use Doctrine\ORM\EntityManagerInterface;
|
|
use Doctrine\ORM\QueryBuilder;
|
|
use Symfony\Component\Security\Core\Security;
|
|
|
|
class PersonDocumentACLAwareRepository implements PersonDocumentACLAwareRepositoryInterface
|
|
{
|
|
private AuthorizationHelperInterface $authorizationHelper;
|
|
|
|
private CenterResolverDispatcher $centerResolverDispatcher;
|
|
|
|
private EntityManagerInterface $em;
|
|
|
|
private Security $security;
|
|
|
|
public function __construct(EntityManagerInterface $em, AuthorizationHelperInterface $authorizationHelper, CenterResolverDispatcher $centerResolverDispatcher, Security $security)
|
|
{
|
|
$this->em = $em;
|
|
$this->authorizationHelper = $authorizationHelper;
|
|
$this->centerResolverDispatcher = $centerResolverDispatcher;
|
|
$this->security = $security;
|
|
}
|
|
|
|
public function buildQueryByPerson(Person $person): QueryBuilder
|
|
{
|
|
$qb = $this->em->getRepository(PersonDocument::class)->createQueryBuilder('d');
|
|
|
|
$qb
|
|
->where($qb->expr()->eq('d.person', ':person'))
|
|
->setParameter('person', $person);
|
|
|
|
return $qb;
|
|
}
|
|
|
|
public function countByPerson(Person $person): int
|
|
{
|
|
$qb = $this->buildQueryByPerson($person)->select('COUNT(d)');
|
|
|
|
$this->addACL($qb, $person);
|
|
|
|
return $qb->getQuery()->getSingleScalarResult();
|
|
}
|
|
|
|
public function findByPerson(Person $person, array $orderBy = [], int $limit = 20, int $offset = 0): array
|
|
{
|
|
$qb = $this->buildQueryByPerson($person)->select('d');
|
|
|
|
$this->addACL($qb, $person);
|
|
|
|
foreach ($orderBy as $field => $order) {
|
|
$qb->addOrderBy('d.' . $field, $order);
|
|
}
|
|
|
|
$qb->setFirstResult($offset)->setMaxResults($limit);
|
|
|
|
return $qb->getQuery()->getResult();
|
|
}
|
|
|
|
private function addACL(QueryBuilder $qb, Person $person): void
|
|
{
|
|
$center = $this->centerResolverDispatcher->resolveCenter($person);
|
|
|
|
$reachableScopes = $this->authorizationHelper
|
|
->getReachableScopes(
|
|
$this->security->getUser(),
|
|
PersonDocumentVoter::SEE,
|
|
$center
|
|
);
|
|
|
|
$qb->andWhere($qb->expr()->in('d.scope', ':scopes'))
|
|
->setParameter('scopes', $reachableScopes);
|
|
}
|
|
}
|