|
5 | 5 | namespace League\Bundle\OAuth2ServerBundle\Manager\Doctrine; |
6 | 6 |
|
7 | 7 | use Doctrine\ORM\EntityManagerInterface; |
| 8 | +use Doctrine\ORM\QueryBuilder; |
8 | 9 | use League\Bundle\OAuth2ServerBundle\Event\PreSaveClientEvent; |
9 | 10 | use League\Bundle\OAuth2ServerBundle\Manager\ClientFilter; |
10 | 11 | use League\Bundle\OAuth2ServerBundle\Manager\ClientManagerInterface; |
@@ -74,38 +75,45 @@ public function remove(ClientInterface $client): void |
74 | 75 | public function list(?ClientFilter $clientFilter): array |
75 | 76 | { |
76 | 77 | $repository = $this->entityManager->getRepository($this->clientFqcn); |
77 | | - $criteria = self::filterToCriteria($clientFilter); |
| 78 | + $qb = $repository->createQueryBuilder('c'); |
| 79 | + self::setQueryBuilderFilters($qb, $clientFilter); |
78 | 80 |
|
79 | 81 | /** @var list<AbstractClient> */ |
80 | | - return $repository->findBy($criteria); |
| 82 | + return $qb->getQuery()->getResult(); |
81 | 83 | } |
82 | 84 |
|
83 | | - /** |
84 | | - * @return array{grants?: list<Grant>, redirect_uris?: list<RedirectUri>, scopes?: list<Scope>} |
85 | | - */ |
86 | | - private static function filterToCriteria(?ClientFilter $clientFilter): array |
| 85 | + private static function setQueryBuilderFilters(QueryBuilder $qb, ?ClientFilter $clientFilter): void |
87 | 86 | { |
88 | 87 | if (null === $clientFilter || false === $clientFilter->hasFilters()) { |
89 | | - return []; |
| 88 | + return; |
90 | 89 | } |
91 | 90 |
|
92 | | - $criteria = []; |
| 91 | + self::setFieldFilter($qb, 'grants', $clientFilter->getGrants()); |
93 | 92 |
|
94 | | - $grants = $clientFilter->getGrants(); |
95 | | - if ($grants) { |
96 | | - $criteria['grants'] = $grants; |
97 | | - } |
| 93 | + self::setFieldFilter($qb, 'redirect_uris', $clientFilter->getRedirectUris()); |
98 | 94 |
|
99 | | - $redirectUris = $clientFilter->getRedirectUris(); |
100 | | - if ($redirectUris) { |
101 | | - $criteria['redirect_uris'] = $redirectUris; |
102 | | - } |
| 95 | + self::setFieldFilter($qb, 'scopes', $clientFilter->getScopes()); |
| 96 | + } |
103 | 97 |
|
104 | | - $scopes = $clientFilter->getScopes(); |
105 | | - if ($scopes) { |
106 | | - $criteria['scopes'] = $scopes; |
| 98 | + /** |
| 99 | + * @param list<Scope>|list<RedirectUri>|list<Grant> $values |
| 100 | + */ |
| 101 | + private static function setFieldFilter(QueryBuilder $qb, string $field, array $values): void |
| 102 | + { |
| 103 | + foreach ($values as $key => $value) { |
| 104 | + $qb->andWhere( |
| 105 | + $qb->expr()->orX( |
| 106 | + $qb->expr()->eq('c.' . $field, ':' . $field . $key), |
| 107 | + $qb->expr()->like('c.' . $field, ':space_' . $field . $key), |
| 108 | + $qb->expr()->like('c.' . $field, ':' . $field . '_space' . $key), |
| 109 | + $qb->expr()->like('c.' . $field, ':space_' . $field . '_space' . $key), |
| 110 | + ) |
| 111 | + ) |
| 112 | + ->setParameter($field . $key, (string) $value) |
| 113 | + ->setParameter('space_' . $field . $key, '% ' . (string) $value) |
| 114 | + ->setParameter($field . '_space' . $key, (string) $value . ' %') |
| 115 | + ->setParameter('space_' . $field . '_space' . $key, '% ' . (string) $value . ' %') |
| 116 | + ; |
107 | 117 | } |
108 | | - |
109 | | - return $criteria; |
110 | 118 | } |
111 | 119 | } |
0 commit comments