Repository navigation
Expand file tree
/
Copy pathUserRepository.php
More file actions
111 lines (97 loc) · 4.56 KB
/
Copy pathUserRepository.php
File metadata and controls
111 lines (97 loc) · 4.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<?php
/*
* This file is part of the Silverback API Components Bundle Project
*
* (c) Daniel West <daniel@silverback.is>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Silverback\ApiComponentsBundle\Repository\User;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use Silverback\ApiComponentsBundle\Entity\User\AbstractUser;
use Silverback\ApiComponentsBundle\Exception\InvalidArgumentException;
/**
* @author Daniel West <daniel@silverback.is>
*
* @method AbstractUser|null find($id, $lockMode = null, $lockVersion = null)
* @method AbstractUser|null findOneBy(array $criteria, array $orderBy = null)
* @method AbstractUser[] findAll()
* @method AbstractUser[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class UserRepository extends ServiceEntityRepository implements UserRepositoryInterface
{
private int $passwordRequestTimeout;
private int $newEmailConfirmTimeout;
public function __construct(ManagerRegistry $registry, string $entityClass, int $passwordRequestTimeout, int $newEmailConfirmTimeout)
{
if (!is_subclass_of($entityClass, AbstractUser::class)) {
throw new InvalidArgumentException(\sprintf('The entity class `%s` used for the repository `%s` must be a subclass of `%s`', $entityClass, __CLASS__, AbstractUser::class));
}
parent::__construct($registry, $entityClass);
$this->passwordRequestTimeout = $passwordRequestTimeout;
$this->newEmailConfirmTimeout = $newEmailConfirmTimeout;
}
public function findOneByEmail(string $value): ?AbstractUser
{
return $this->createQueryBuilder('u')
->andWhere('LOWER(u.emailAddress) = :val')
->setParameter('val', strtolower(trim($value)))
->getQuery()
->getOneOrNullResult();
}
public function findOneWithPasswordResetToken(string $username): ?AbstractUser
{
$minimumRequestDateTime = new \DateTime();
$minimumRequestDateTime->modify(\sprintf('-%d seconds', $this->passwordRequestTimeout));
return $this->createQueryBuilder('u')
->andWhere('LOWER(u.username) = :username')
->andWhere('u.newPasswordConfirmationToken IS NOT NULL')
->andWhere('u.passwordRequestedAt > :minimumDateTime')
->setParameter('username', strtolower(trim($username)))
->setParameter('minimumDateTime', $minimumRequestDateTime)
->getQuery()
->getOneOrNullResult();
}
public function findOneByUsernameAndNewEmailAddress(string $username, string $email): ?AbstractUser
{
$minimumRequestDateTime = new \DateTime();
$minimumRequestDateTime->modify(\sprintf('-%d seconds', $this->newEmailConfirmTimeout));
return $this->createQueryBuilder('u')
->andWhere('LOWER(u.username) = :username')
->andWhere('LOWER(u.newEmailAddress) = :email')
->andWhere('u.newEmailConfirmationToken IS NOT NULL')
->andWhere('u.newEmailAddressChangeRequestedAt > :minimumDateTime')
->setParameter('username', strtolower(trim($username)))
->setParameter('email', strtolower(trim($email)))
->setParameter('minimumDateTime', $minimumRequestDateTime)
->getQuery()
->getOneOrNullResult();
}
public function loadUserByUsername(string $identifier): ?AbstractUser
{
return $this->loadUserByIdentifier($identifier);
}
public function loadUserByIdentifier(string $identifier): ?AbstractUser
{
return $this->createQueryBuilder('u')
->andWhere('LOWER(u.username) = :username')
->orWhere('LOWER(u.emailAddress) = :username')
->setParameter('username', strtolower(trim($identifier)))
->getQuery()
->getOneOrNullResult();
}
public function findExistingUserByNewEmail(AbstractUser $user): ?AbstractUser
{
$queryBuilder = $this->createQueryBuilder('u');
$expr = $queryBuilder->expr();
$newEmail = $user->getNewEmailAddress();
$queryBuilder
->andWhere($expr->eq('LOWER(u.emailAddress)', ':email_address'))
->andWhere($expr->neq('u', ':user'))
->setParameter('email_address', $newEmail ? strtolower($newEmail) : null)
->setParameter('user', $user, $this->getClassMetadata()->getTypeOfField('id'));
return $queryBuilder->getQuery()->getOneOrNullResult();
}
}