<?php/* * This file is part of the GesdinetJWTRefreshTokenBundle package. * * (c) Gesdinet <http://www.gesdinet.com/> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */namespace Gesdinet\JWTRefreshTokenBundle\Doctrine;use Doctrine\Persistence\ObjectManager;use Gesdinet\JWTRefreshTokenBundle\Generator\RefreshTokenGeneratorInterface;use Gesdinet\JWTRefreshTokenBundle\Model\RefreshTokenInterface;use Gesdinet\JWTRefreshTokenBundle\Model\RefreshTokenManagerInterface;class RefreshTokenManager implements RefreshTokenManagerInterface{ /** * @var ObjectManager */ protected $objectManager; /** * @var class-string<RefreshTokenInterface> */ protected $class; /** * @var RefreshTokenRepositoryInterface<RefreshTokenInterface> */ protected $repository; /** * @param class-string<RefreshTokenInterface> $class * * @throws \LogicException if the object repository does not implement `Gesdinet\JWTRefreshTokenBundle\Doctrine\RefreshTokenRepositoryInterface` */ public function __construct(ObjectManager $om, $class) { $this->objectManager = $om; $repository = $om->getRepository($class); if (!$repository instanceof RefreshTokenRepositoryInterface) { throw new \LogicException(sprintf('Repository mapped for "%s" should implement %s.', $class, RefreshTokenRepositoryInterface::class)); } $this->repository = $repository; $metadata = $om->getClassMetadata($class); $this->class = $metadata->getName(); } /** * Creates an empty RefreshTokenInterface instance. * * @return RefreshTokenInterface * * @deprecated to be removed in 2.0, use a `Gesdinet\JWTRefreshTokenBundle\Generator\RefreshTokenGeneratorInterface` instead. */ public function create() { trigger_deprecation('gesdinet/jwt-refresh-token-bundle', '1.0', '%s() is deprecated and will be removed in 2.0, use a "%s" instance to create new %s objects.', __METHOD__, RefreshTokenGeneratorInterface::class, RefreshTokenInterface::class); $class = $this->getClass(); return new $class(); } /** * @param string $refreshToken * * @return RefreshTokenInterface|null */ public function get($refreshToken) { return $this->repository->findOneBy(['refreshToken' => $refreshToken]); } /** * @param string $username * * @return RefreshTokenInterface|null */ public function getLastFromUsername($username) { return $this->repository->findOneBy(['username' => $username], ['valid' => 'DESC']); } /** * @param bool $andFlush * * @return void */ public function save(RefreshTokenInterface $refreshToken, $andFlush = true) { $this->objectManager->persist($refreshToken); if ($andFlush) { $this->objectManager->flush(); } } /** * @param bool $andFlush * * @return void */ public function delete(RefreshTokenInterface $refreshToken, $andFlush = true) { $this->objectManager->remove($refreshToken); if ($andFlush) { $this->objectManager->flush(); } } /** * @param \DateTimeInterface|null $datetime * @param bool $andFlush * * @return RefreshTokenInterface[] */ public function revokeAllInvalid($datetime = null, $andFlush = true) { $invalidTokens = $this->repository->findInvalid($datetime); foreach ($invalidTokens as $invalidToken) { $this->objectManager->remove($invalidToken); } if ($andFlush) { $this->objectManager->flush(); } return $invalidTokens; } /** * Returns the RefreshToken fully qualified class name. * * @return class-string<RefreshTokenInterface> */ public function getClass() { return $this->class; }}