|
8 | 8 | use League\Bundle\OAuth2ServerBundle\Manager\AccessTokenManagerInterface; |
9 | 9 | use League\Bundle\OAuth2ServerBundle\Model\AccessToken; |
10 | 10 | use League\Bundle\OAuth2ServerBundle\Model\AccessTokenInterface; |
| 11 | +use League\Bundle\OAuth2ServerBundle\Model\RefreshToken; |
11 | 12 |
|
12 | 13 | final class AccessTokenManager implements AccessTokenManagerInterface |
13 | 14 | { |
@@ -50,12 +51,39 @@ public function clearExpired(): int |
50 | 51 | return 0; |
51 | 52 | } |
52 | 53 |
|
53 | | - /** @var int */ |
54 | | - return $this->entityManager->createQueryBuilder() |
55 | | - ->delete(AccessToken::class, 'at') |
| 54 | + /** @var array{identifier: string}[] */ |
| 55 | + $results = $this->entityManager->createQueryBuilder() |
| 56 | + ->select('at.identifier') |
| 57 | + ->from(AccessToken::class, 'at') |
56 | 58 | ->where('at.expiry < :expiry') |
57 | 59 | ->setParameter('expiry', new \DateTimeImmutable(), 'datetime_immutable') |
58 | 60 | ->getQuery() |
| 61 | + ->getScalarResult(); |
| 62 | + if (0 === \count($results)) { |
| 63 | + return 0; |
| 64 | + } |
| 65 | + |
| 66 | + /** @var string[] */ |
| 67 | + $ids = array_column($results, 'identifier'); |
| 68 | + |
| 69 | + // unlink access tokens from refresh tokens |
| 70 | + $this->entityManager->createQueryBuilder() |
| 71 | + ->update(RefreshToken::class, 'rt') |
| 72 | + ->set('rt.accessToken', ':null') |
| 73 | + ->where('rt.accessToken IN (:ids)') |
| 74 | + ->setParameter('null', null) |
| 75 | + ->setParameter('ids', $ids) |
| 76 | + ->getQuery() |
59 | 77 | ->execute(); |
| 78 | + |
| 79 | + // delete expired access tokens |
| 80 | + $this->entityManager->createQueryBuilder() |
| 81 | + ->delete(AccessToken::class, 'at') |
| 82 | + ->where('at.identifier IN (:ids)') |
| 83 | + ->setParameter('ids', $ids) |
| 84 | + ->getQuery() |
| 85 | + ->execute(); |
| 86 | + |
| 87 | + return \count($ids); |
60 | 88 | } |
61 | 89 | } |
0 commit comments