Completed
Push — bugfix/fix-auth-filter ( b05c6b...5039f0 )
by
unknown
02:40
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\AST\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
        $qb = $this->createQueryBuilder('i')
64
            ->select("a.institution")
65
            ->innerJoin(RaListing::class, 'r', Join::WITH, "i.institution = r.raInstitution")
66
            ->leftJoin(InstitutionAuthorization::class, 'a', Join::WITH, "i.institution = a.institutionRelation AND a.institutionRole IN (:authorizationRoles)")
67
            ->where("r.identityId = :identityId AND r.role IN(:roles)")
68
            ->groupBy("a.institution");
69
70
71
        $qb->setParameter('identityId', (string)$actorId);
72
        $qb->setParameter('authorizationRoles', $this->getAuthorizationRoles($roleRequirements, [InstitutionRole::ROLE_USE_RA => InstitutionRole::ROLE_USE_RA, InstitutionRole::ROLE_USE_RAA => InstitutionRole::ROLE_USE_RAA]));
73
        $qb->setParameter('roles', $this->getAuthorizationRoles($roleRequirements, [InstitutionRole::ROLE_USE_RA => 'ra', InstitutionRole::ROLE_USE_RAA => 'raa']));
74
75
        $institutions = $qb->getQuery()->getArrayResult();
76
77
        $result = new InstitutionCollection();
78
        foreach ($institutions as $institution) {
79
            $result->add(new Institution((string)$institution['institution']));
80
        }
81
82
        return $result;
83
    }
84
85
    /**
86
     * @param InstitutionRoleSet $roleRequirements
87
     * @param array $map
88
     * @return array
89
     */
90
    private function getAuthorizationRoles(InstitutionRoleSet $roleRequirements, array $map)
91
    {
92
        $result = [];
93
        foreach ($roleRequirements->getRoles() as $role) {
94
            $result[] = $map[(string)$role];
95
        }
96
        return $result;
97
    }
98
}
99