Completed
Push — master ( 29656f...126d00 )
by Philip
08:08
created

AccessTokenRepository::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 5
ccs 4
cts 4
cp 1
rs 9.4285
cc 1
eloc 3
nc 1
nop 2
crap 1
1
<?php
2
3
namespace Dontdrinkandroot\RestBundle\Repository;
4
5
use Doctrine\ORM\EntityManager;
6
use Doctrine\ORM\EntityRepository;
7
use Doctrine\ORM\Mapping;
8
use Doctrine\ORM\Query;
9
use Dontdrinkandroot\Repository\TransactionManager;
10
use Dontdrinkandroot\RestBundle\Entity\AccessToken;
11
12
/**
13
 * @author Philip Washington Sorst <[email protected]>
14
 */
15
class AccessTokenRepository extends EntityRepository implements AccessTokenRepositoryInterface
16
{
17
    /**
18
     * @var TransactionManager
19
     */
20
    private $transactionManager;
21
22 92
    public function __construct(EntityManager $em, Mapping\ClassMetadata $class)
23
    {
24 92
        parent::__construct($em, $class);
25 92
        $this->transactionManager = new TransactionManager($em);
26 92
    }
27
28
    /**
29
     * {@inheritdoc}
30
     */
31 50
    public function findUserByToken($token)
32
    {
33 50
        return $this->transactionManager->transactional(
34
            function () use ($token) {
35
                /** @var AccessToken $accessToken */
36 50
                $accessToken = $this->createFindUserByTokenQuery($token)->getOneOrNullResult();
37 50
                if (null === $accessToken) {
38 2
                    return null;
39
                }
40
41 50
                if ($this->isExpired($accessToken)) {
42 2
                    $this->getEntityManager()->remove($accessToken);
43
44 2
                    return null;
45
                }
46
47 48
                return $accessToken->getUser();
48 50
            }
49
        );
50
    }
51
52
    /**
53
     * @param string $token
54
     *
55
     * @return Query
56
     */
57 50
    protected function createFindUserByTokenQuery($token)
58
    {
59 50
        $queryBuilder = $this->createQueryBuilder('accessToken');
60 50
        $queryBuilder->where('accessToken.token = :token');
61 50
        $queryBuilder->setParameter('token', $token);
62
63 50
        return $queryBuilder->getQuery();
64
    }
65
66
    /**
67
     * {@inheritdoc}
68
     */
69 2
    public function findExpiredTokens()
70
    {
71 2
        $queryBuilder = $this->createQueryBuilder('token');
72 2
        $queryBuilder->where('token.expiry < :now');
73 2
        $queryBuilder->setParameter('now', new \DateTime());
74
75 2
        return $queryBuilder->getQuery()->getResult();
76
    }
77
78 50
    private function isExpired(AccessToken $accessToken): bool
79
    {
80 50
        if (null !== $accessToken->getExpiry()) {
81 2
            return $accessToken->getExpiry() < new \DateTime();
82
        }
83
84 48
        return false;
85
    }
86
87
    /**
88
     * {@inheritdoc}
89
     */
90 2
    public function persist(AccessToken $accessToken): AccessToken
91
    {
92 2
        $this->transactionManager->transactional(
93
            function () use ($accessToken) {
94 2
                $this->getEntityManager()->persist($accessToken);
95 2
            }
96
        );
97
98 2
        return $accessToken;
99
    }
100
101
    /**
102
     * {@inheritdoc}
103
     */
104 4
    public function remove(AccessToken $accessToken)
105
    {
106 4
        $this->transactionManager->transactional(
107 4
            function () use ($accessToken) {
108 4
                $this->getEntityManager()->remove($accessToken);
109 4
            }
110
        );
111 4
    }
112
}
113