Completed
Pull Request — develop (#256)
by
unknown
02:26
created

RaSecondFactorRepository::removeByIdentityId()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 9
rs 9.9666
c 0
b 0
f 0
cc 1
nc 1
nop 1
1
<?php
2
3
/**
4
 * Copyright 2014 SURFnet bv
5
 *
6
 * Licensed under the Apache License, Version 2.0 (the "License");
7
 * you may not use this file except in compliance with the License.
8
 * You may obtain a copy of the License at
9
 *
10
 *     http://www.apache.org/licenses/LICENSE-2.0
11
 *
12
 * Unless required by applicable law or agreed to in writing, software
13
 * distributed under the License is distributed on an "AS IS" BASIS,
14
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
 * See the License for the specific language governing permissions and
16
 * limitations under the License.
17
 */
18
19
namespace Surfnet\StepupMiddleware\ApiBundle\Identity\Repository;
20
21
use Doctrine\DBAL\Types\Type;
22
use Doctrine\ORM\EntityManager;
23
use Doctrine\ORM\EntityRepository;
24
use Doctrine\ORM\Mapping;
25
use Doctrine\ORM\Query;
26
use Surfnet\Stepup\Exception\RuntimeException;
27
use Surfnet\Stepup\Identity\Value\IdentityId;
28
use Surfnet\StepupMiddleware\ApiBundle\Authorization\Filter\InstitutionAuthorizationRepositoryFilter;
29
use Surfnet\StepupMiddleware\ApiBundle\Doctrine\Type\SecondFactorStatusType;
30
use Surfnet\StepupMiddleware\ApiBundle\Identity\Entity\RaSecondFactor;
31
use Surfnet\StepupMiddleware\ApiBundle\Identity\Query\RaSecondFactorQuery;
32
use Surfnet\StepupMiddleware\ApiBundle\Identity\Value\SecondFactorStatus;
33
34
class RaSecondFactorRepository extends EntityRepository
35
{
36
    /**
37
     * @var InstitutionAuthorizationRepositoryFilter
38
     */
39
    private $authorizationRepositoryFilter;
40
41
    public function __construct(
42
        EntityManager $em,
43
        Mapping\ClassMetadata $class,
44
        InstitutionAuthorizationRepositoryFilter $authorizationRepositoryFilter
45
    ) {
46
        parent::__construct($em, $class);
47
        $this->authorizationRepositoryFilter = $authorizationRepositoryFilter;
48
    }
49
50
51
    /**
52
     * @param string $id
53
     * @return RaSecondFactor|null
54
     */
55
    public function find($id)
56
    {
57
        /** @var RaSecondFactor|null $secondFactor */
58
        $secondFactor = parent::find($id);
59
60
        return $secondFactor;
61
    }
62
63
    /**
64
     * @param string $identityId
65
     * @return RaSecondFactor[]
66
     */
67
    public function findByIdentityId($identityId)
68
    {
69
        return parent::findBy(['identityId' => $identityId]);
0 ignored issues
show
Comprehensibility Bug introduced by
It seems like you call parent on a different method (findBy() instead of findByIdentityId()). Are you sure this is correct? If so, you might want to change this to $this->findBy().

This check looks for a call to a parent method whose name is different than the method from which it is called.

Consider the following code:

class Daddy
{
    protected function getFirstName()
    {
        return "Eidur";
    }

    protected function getSurName()
    {
        return "Gudjohnsen";
    }
}

class Son
{
    public function getFirstName()
    {
        return parent::getSurname();
    }
}

The getFirstName() method in the Son calls the wrong method in the parent class.

Loading history...
70
    }
71
72
    /**
73
     * @SuppressWarnings(PHPMD.CyclomaticComplexity) The amount of if statements do not necessarily make the method
74
     *                                               below complex or hard to maintain.
75
     * @SuppressWarnings(PHPMD.NPathComplexity)
76
     *
77
     * @param RaSecondFactorQuery $query
78
     * @return Query
79
     * @throws \Doctrine\DBAL\DBALException
80
     */
81
    public function createSearchQuery(RaSecondFactorQuery $query)
82
    {
83
        $queryBuilder = $this
84
            ->createQueryBuilder('sf');
85
86
        // Modify query to filter on authorization
87
        $this->authorizationRepositoryFilter->filter($queryBuilder, $query->authorizationContext, 'sf.id', 'sf.institution', 'iac');
88
89
        if ($query->name) {
90
            $queryBuilder->andWhere('sf.name LIKE :name')->setParameter('name', sprintf('%%%s%%', $query->name));
91
        }
92
93
        if ($query->type) {
94
            $queryBuilder->andWhere('sf.type = :type')->setParameter('type', $query->type);
95
        }
96
97
        if ($query->secondFactorId) {
98
            $queryBuilder
99
                ->andWhere('sf.secondFactorId = :secondFactorId')
100
                ->setParameter('secondFactorId', $query->secondFactorId);
101
        }
102
103
        if ($query->email) {
104
            $queryBuilder->andWhere('sf.email LIKE :email')->setParameter('email', sprintf('%%%s%%', $query->email));
105
        }
106
107
        if ($query->institution) {
108
            $queryBuilder->andWhere('sf.institution = :institution')->setParameter('institution', $query->institution);
109
        }
110
111
        if ($query->status) {
112
            $stringStatus = $query->status;
113
            if (!SecondFactorStatus::isValidStatus($stringStatus)) {
114
                throw new RuntimeException(sprintf(
115
                    'Received invalid status "%s" in RaSecondFactorRepository::createSearchQuery',
116
                    is_object($stringStatus) ? get_class($stringStatus) : (string) $stringStatus
117
                ));
118
            }
119
120
            // we need to resolve the string value to database value using the correct doctrine type. Normally this is
121
            // done by doctrine itself, however the queries PagerFanta creates somehow manages to mangle this...
122
            // so we do it by hand
123
            $doctrineType = Type::getType(SecondFactorStatusType::NAME);
124
            $secondFactorStatus = SecondFactorStatus::$stringStatus();
125
126
            $databaseValue = $doctrineType->convertToDatabaseValue(
127
                $secondFactorStatus,
128
                $this->getEntityManager()->getConnection()->getDatabasePlatform()
129
            );
130
131
            $queryBuilder->andWhere('sf.status = :status')->setParameter('status', $databaseValue);
132
        }
133
134
        switch ($query->orderBy) {
135
            case 'name':
136
            case 'type':
137
            case 'secondFactorId':
138
            case 'email':
139
            case 'institution':
140
            case 'status':
141
                $queryBuilder->orderBy(
142
                    sprintf('sf.%s', $query->orderBy),
143
                    $query->orderDirection === 'desc' ? 'DESC' : 'ASC'
144
                );
145
                break;
146
        }
147
148
        return $queryBuilder->getQuery();
149
    }
150
151
    /**
152
     * @param IdentityId $identityId
153
     * @return void
154
     */
155
    public function removeByIdentityId(IdentityId $identityId)
156
    {
157
        $this->getEntityManager()->createQueryBuilder()
158
            ->delete($this->_entityName, 'rasf')
159
            ->where('rasf.identityId = :identityId')
160
            ->setParameter('identityId', $identityId->getIdentityId())
161
            ->getQuery()
162
            ->execute();
163
    }
164
165
    public function save(RaSecondFactor $secondFactor)
166
    {
167
        $this->getEntityManager()->persist($secondFactor);
168
        $this->getEntityManager()->flush();
169
    }
170
171
    /**
172
     * @param RaSecondFactor[] $secondFactors
173
     */
174
    public function saveAll(array $secondFactors)
175
    {
176
        $entityManager = $this->getEntityManager();
177
178
        foreach ($secondFactors as $secondFactor) {
179
            $entityManager->persist($secondFactor);
180
        }
181
182
        $entityManager->flush();
183
    }
184
}
185