*/ class SavedExportRepository implements SavedExportRepositoryInterface { private readonly EntityRepository $repository; public function __construct(EntityManagerInterface $entityManager) { $this->repository = $entityManager->getRepository($this->getClassName()); } public function find($id): ?SavedExport { return $this->repository->find($id); } /** * @return array|SavedExport[] */ public function findAll(): array { return $this->repository->findAll(); } public function findBy(array $criteria, ?array $orderBy = null, ?int $limit = null, ?int $offset = null): array { return $this->repository->findBy($criteria, $orderBy, $limit, $offset); } public function findByUser(User $user, ?array $orderBy = [], ?int $limit = null, ?int $offset = null): array { $qb = $this->repository->createQueryBuilder('se'); $qb ->where($qb->expr()->eq('se.user', ':user')) ->setParameter('user', $user); return $this->prepareResult($qb, $orderBy, $limit, $offset); } public function findSharedWithUser(User $user, ?array $orderBy = [], ?int $limit = null, ?int $offset = null, array $filters = []): array { $qb = $this->repository->createQueryBuilder('se'); $qb ->where( $qb->expr()->orX( $qb->expr()->eq('se.user', ':user'), $qb->expr()->isMemberOf(':user', 'se.sharedWithUsers'), $qb->expr()->exists( sprintf('SELECT 1 FROM %s ug WHERE ug MEMBER OF se.sharedWithGroups AND :user MEMBER OF ug.users', UserGroup::class) ) ) ) ->setParameter('user', $user); foreach ($filters as $key => $filter) { if (self::FILTER_TITLE === ($key & self::FILTER_TITLE) || self::FILTER_DESCRIPTION === ($key & self::FILTER_DESCRIPTION)) { $filter = new UnicodeString($filter); $i = 0; foreach ($filter->split(' ') as $word) { $orx = $qb->expr()->orX(); if (self::FILTER_TITLE === ($key & self::FILTER_TITLE)) { $orx->add($qb->expr()->like('LOWER(se.title)', 'LOWER(:qs'.$i.')')); } if (self::FILTER_DESCRIPTION === ($key & self::FILTER_DESCRIPTION)) { $orx->add($qb->expr()->like('LOWER(se.description)', 'LOWER(:qs'.$i.')')); } $qb->andWhere($orx); $qb->setParameter('qs'.$i, '%'.$word->trim().'%'); ++$i; } } } return $this->prepareResult($qb, $orderBy, $limit, $offset); } private function prepareResult(QueryBuilder $qb, ?array $orderBy = [], ?int $limit = null, ?int $offset = null): array { if (null !== $limit) { $qb->setMaxResults($limit); } if (null !== $offset) { $qb->setFirstResult($offset); } foreach ($orderBy as $field => $order) { $qb->addOrderBy('se.'.$field, $order); } return $qb->getQuery()->getResult(); } public function findOneBy(array $criteria): ?SavedExport { return $this->repository->findOneBy($criteria); } public function getClassName(): string { return SavedExport::class; } }