|
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,54 @@ 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 = []; |
93 | | - |
94 | 91 | $grants = $clientFilter->getGrants(); |
95 | 92 | if ($grants) { |
96 | | - $criteria['grants'] = $grants; |
| 93 | + self::setFieldFilter($qb, 'grants', $grants); |
97 | 94 | } |
98 | 95 |
|
99 | 96 | $redirectUris = $clientFilter->getRedirectUris(); |
100 | 97 | if ($redirectUris) { |
101 | | - $criteria['redirect_uris'] = $redirectUris; |
| 98 | + self::setFieldFilter($qb, 'redirect_uris', $redirectUris); |
102 | 99 | } |
103 | 100 |
|
104 | 101 | $scopes = $clientFilter->getScopes(); |
105 | 102 | if ($scopes) { |
106 | | - $criteria['scopes'] = $scopes; |
| 103 | + self::setFieldFilter($qb, 'scopes', $scopes); |
107 | 104 | } |
| 105 | + } |
108 | 106 |
|
109 | | - return $criteria; |
| 107 | + /** |
| 108 | + * @param list<Scope>|list<RedirectUri>|list<Grant> $values |
| 109 | + */ |
| 110 | + private static function setFieldFilter(QueryBuilder $qb, string $field, array $values): void |
| 111 | + { |
| 112 | + foreach ($values as $key => $value) { |
| 113 | + $qb->andWhere( |
| 114 | + $qb->expr()->orX( |
| 115 | + $qb->expr()->eq('c.' . $field, ':' . $field . $key), |
| 116 | + $qb->expr()->like('c.' . $field, ':space_' . $field . $key), |
| 117 | + $qb->expr()->like('c.' . $field, ':' . $field . '_space' . $key), |
| 118 | + $qb->expr()->like('c.' . $field, ':space_' . $field . '_space' . $key), |
| 119 | + ) |
| 120 | + ) |
| 121 | + ->setParameter($field . $key, (string) $value) |
| 122 | + ->setParameter('space_' . $field . $key, '% ' . (string) $value) |
| 123 | + ->setParameter($field . '_space' . $key, (string) $value . ' %') |
| 124 | + ->setParameter('space_' . $field . '_space' . $key, '% ' . (string) $value . ' %') |
| 125 | + ; |
| 126 | + } |
110 | 127 | } |
111 | 128 | } |
0 commit comments