Completed
Push — master ( 5b6d3c...e19d53 )
by Marcel
03:17
created

UserServiceProviderResolver::getServices()   A

Complexity

Conditions 6
Paths 13

Size

Total Lines 38
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 8.1174

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 6
eloc 17
c 1
b 0
f 0
nc 13
nop 1
dl 0
loc 38
ccs 11
cts 18
cp 0.6111
crap 8.1174
rs 9.0777
1
<?php
2
3
namespace App\Service;
4
5
use App\Entity\ServiceProvider;
6
use App\Entity\User;
7
use App\Entity\UserRole;
8
use Doctrine\Common\Collections\ArrayCollection;
9
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
10
11
/**
12
 * Resolves services which users are enabled for.
13
 */
14
class UserServiceProviderResolver {
15
    private $tokenStorage;
16
17 7
    public function __construct(TokenStorageInterface $tokenStorage) {
18 7
        $this->tokenStorage = $tokenStorage;
19 7
    }
20
21 2
    private function getUser() {
22 2
        $token = $this->tokenStorage->getToken();
23
24 2
        if($token === null) {
25
            return null;
26
        }
27
28 2
        $user = $token->getUser();
29 2
        return $user;
30
    }
31
32
    /**
33
     * Returns the list of services the currently loggedin user is enabled for.
34
     *
35
     * @return ArrayCollection
36
     */
37 2
    public function getServicesForCurrentUser() {
38 2
        $user = $this->getUser();
39
40 2
        if(!$user instanceof User) {
41
            return new ArrayCollection();
42
        }
43
44 2
        return $this->getServices($user);
45
    }
46
47
    /**
48
     * Returns a list of services (ServiceProvider) the given user is enabled for.
49
     *
50
     * @param User|null $user
51
     * @return ArrayCollection
52
     */
53 2
    public function getServices(User $user = null) {
54 2
        if($user === null) {
55
            return new ArrayCollection();
56
        }
57
58
        /** @var ServiceProvider[] $userServices */
59 2
        $userServices = $user->getEnabledServices();
60
        /** @var ServiceProvider[] $typeServices */
61 2
        $typeServices = $user->getType()->getEnabledServices();
62
63 2
        $services = [ ];
64
65 2
        foreach($userServices as $service) {
66
            $services[$service->getId()] = $service;
67
        }
68
69 2
        foreach($typeServices as $service) {
70
            $services[$service->getId()] = $service;
71
        }
72
73
        /** @var UserRole[] $userRoles */
74 2
        $userRoles = $user->getUserRoles();
75
76 2
        foreach($userRoles as $role) {
77
            /** @var ServiceProvider[] $roleServices */
78
            $roleServices = $role->getEnabledServices();
79
80
            foreach($roleServices as $service) {
81
                $services[$service->getId()] = $service;
82
            }
83
        }
84
85
        // sort by name
86
        usort($services, function(ServiceProvider $serviceProviderA, ServiceProvider $serviceProviderB) {
87
            return strcmp($serviceProviderA->getName(), $serviceProviderB->getName());
88 2
        });
89
90 2
        return new ArrayCollection(array_values($services));
91
    }
92
}