Spaces:
No application file
No application file
namespace Mautic\UserBundle\Entity; | |
use Mautic\CoreBundle\Entity\CommonRepository; | |
/** | |
* @extends CommonRepository<UserToken> | |
*/ | |
final class UserTokenRepository extends CommonRepository implements UserTokenRepositoryInterface | |
{ | |
/** | |
* @param string $secret | |
*/ | |
public function isSecretUnique($secret): bool | |
{ | |
$tokens = $this->createQueryBuilder('ut') | |
->where('ut.secret = :secret') | |
->setParameter('secret', $secret) | |
->setMaxResults(1) | |
->getQuery()->execute(); | |
return 0 === count($tokens); | |
} | |
public function verify(UserToken $token): bool | |
{ | |
/** @var UserToken[] $userTokens */ | |
$userTokens = $this->createQueryBuilder('ut') | |
->where('ut.user = :user AND ut.authorizator = :authorizator AND ut.secret = :secret AND (ut.expiration IS NULL OR ut.expiration >= :now)') | |
->setParameter('user', $token->getUser()) | |
->setParameter('authorizator', $token->getAuthorizator()) | |
->setParameter('secret', $token->getSecret()) | |
->setParameter('now', new \DateTime()) | |
->setMaxResults(1) | |
->getQuery()->execute(); | |
$verified = (0 !== count($userTokens)); | |
if (false === $verified) { | |
return false; | |
} | |
$userToken = reset($userTokens); | |
if ($userToken->isOneTimeOnly()) { | |
$this->deleteEntity($userToken); | |
} | |
return true; | |
} | |
public function deleteExpired($isDryRun = false): int | |
{ | |
$qb = $this->createQueryBuilder('ut'); | |
if ($isDryRun) { | |
$qb->select('count(ut.id) as records'); | |
} else { | |
$qb->delete(UserToken::class, 'ut'); | |
} | |
return (int) $qb | |
->where('ut.expiration <= :current_datetime') | |
->setParameter('current_datetime', new \DateTime()) | |
->getQuery() | |
->execute(); | |
} | |
} | |