RbacMiddleware::__invoke()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 13
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 5
dl 0
loc 13
rs 10
c 1
b 0
f 0
cc 2
nc 2
nop 3
1
<?php
2
3
namespace Potievdev\SlimRbac\Component;
4
5
use Doctrine\ORM\Query\QueryException;
6
use Potievdev\SlimRbac\Component\PermissionNameExtractor\PermissionNameExtractor;
7
use Potievdev\SlimRbac\Component\UserIdExtractor\UserIdExtractor;
8
use Potievdev\SlimRbac\Exception\InvalidArgumentException;
9
use Psr\Http\Message\ServerRequestInterface;
10
use Psr\Http\Message\ResponseInterface;
11
12
/**
13
 * Checking Access Middleware
14
 * Class RbacMiddleware
15
 * @package Potievdev\SlimRbac\Component
16
 */
17
class RbacMiddleware
18
{
19
    public const PERMISSION_DENIED_CODE = 403;
20
    public const PERMISSION_DENIED_MESSAGE = 'Permission denied';
21
22
    /** @var RbacAccessChecker */
23
    private $accessChecker;
24
25
    /** @var UserIdExtractor */
26
    private $userIdExtractor;
27
28
    /** @var PermissionNameExtractor */
29
    private $permissionNameExtractor;
30
31
    /**
32
     * @param RbacAccessChecker $accessChecker
33
     * @param UserIdExtractor $userIdExtractor
34
     */
35
    public function __construct(
36
        RbacAccessChecker $accessChecker,
37
        UserIdExtractor $userIdExtractor,
38
        PermissionNameExtractor $permissionNameExtractor
39
    ) {
40
        $this->accessChecker = $accessChecker;
41
        $this->userIdExtractor = $userIdExtractor;
42
        $this->permissionNameExtractor = $permissionNameExtractor;
43
    }
44
45
    /**
46
     * Check access.
47
     *
48
     * @param  ServerRequestInterface $request PSR7 request
49
     * @param  ResponseInterface $response PSR7 response
50
     * @param  callable $next Next middleware
51
     *
52
     * @return ResponseInterface
53
     * @throws QueryException
54
     * @throws InvalidArgumentException
55
     */
56
    public function __invoke(
57
        ServerRequestInterface $request,
58
        ResponseInterface $response,
59
        callable $next
60
    ): ResponseInterface {
61
        $userId = $this->userIdExtractor->getUserId($request);
62
        $permissionName = $this->permissionNameExtractor->getPermissionName($request);
63
64
        if ($this->accessChecker->hasAccess($userId, $permissionName)) {
65
            return $next($request, $response);
66
        }
67
68
        return $response->withStatus(self::PERMISSION_DENIED_CODE, self::PERMISSION_DENIED_MESSAGE);
69
    }
70
}
71