Completed
Push — develop ( 800b48...35e2e2 )
by Michiel
13s
created

getAuthorizationRoles()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 8
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 2
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\ORM\EntityRepository;
22
use Doctrine\ORM\Query\Expr\Join;
23
use Surfnet\Stepup\Configuration\Value\InstitutionRole;
24
use Surfnet\Stepup\Identity\Collection\InstitutionCollection;
25
use Surfnet\Stepup\Identity\Value\IdentityId;
26
use Surfnet\Stepup\Identity\Value\Institution;
27
use Surfnet\StepupMiddleware\ApiBundle\Authorization\Value\InstitutionRoleSet;
28
use Surfnet\StepupMiddleware\ApiBundle\Configuration\Entity\InstitutionAuthorization;
29
use Surfnet\StepupMiddleware\ApiBundle\Identity\Entity\InstitutionListing;
30
use Surfnet\StepupMiddleware\ApiBundle\Identity\Entity\RaListing;
31
32
class InstitutionListingRepository extends EntityRepository
33
{
34
    public function save(InstitutionListing $institution)
35
    {
36
        $this->getEntityManager()->persist($institution);
37
        $this->getEntityManager()->flush();
38
    }
39
40
    public function addIfNotExists(Institution $institution)
41
    {
42
        $existsQuery = $this->createQueryBuilder('i')
43
            ->where('i.institution = :institution')
44
            ->setParameter('institution', (string) $institution)
45
            ->getQuery()
46
            ->getOneOrNullResult();
47
48
        if ($existsQuery) {
49
            return;
50
        }
51
52
        $listing = InstitutionListing::createFrom($institution);
53
54
        $this->save($listing);
55
    }
56
57
    /**
58
     * @param InstitutionRoleSet $roleRequirements
59
     * @param IdentityId $actorId
60
     * @return InstitutionCollection
61
     */
62
    public function getInstitutions(InstitutionRoleSet $roleRequirements, IdentityId $actorId)
63
    {
64
        $qb = $this->createQueryBuilder('i')
65
            ->select("a.institution")
66
            ->innerJoin(RaListing::class, 'r', Join::WITH, "i.institution = r.raInstitution")
67
            ->leftJoin(
68
                InstitutionAuthorization::class,
69
                'a',
70
                Join::WITH,
71
                "i.institution = a.institutionRelation AND a.institutionRole IN (:authorizationRoles)"
72
            )
73
            ->where("r.identityId = :identityId AND r.role IN(:roles)")
74
            ->groupBy("a.institution");
75
76
77
        $qb->setParameter('identityId', (string)$actorId);
78
        $qb->setParameter(
79
            'authorizationRoles',
80
            $this->getAuthorizationRoles(
81
                $roleRequirements,
82
                [InstitutionRole::ROLE_USE_RA => InstitutionRole::ROLE_USE_RA, InstitutionRole::ROLE_USE_RAA => InstitutionRole::ROLE_USE_RAA]
83
            )
84
        );
85
        $qb->setParameter(
86
            'roles',
87
            $this->getAuthorizationRoles(
88
                $roleRequirements,
89
                [InstitutionRole::ROLE_USE_RA => 'ra', InstitutionRole::ROLE_USE_RAA => 'raa']
90
            )
91
        );
92
93
        $institutions = $qb->getQuery()->getArrayResult();
94
95
        $result = new InstitutionCollection();
96
        foreach ($institutions as $institution) {
97
            $result->add(new Institution((string)$institution['institution']));
98
        }
99
100
        return $result;
101
    }
102
103
    /**
104
     * @param InstitutionRoleSet $roleRequirements
105
     * @param array $map
106
     * @return array
107
     */
108
    private function getAuthorizationRoles(InstitutionRoleSet $roleRequirements, array $map)
109
    {
110
        $result = [];
111
        foreach ($roleRequirements->getRoles() as $role) {
112
            $result[] = $map[(string)$role];
113
        }
114
        return $result;
115
    }
116
}
117