Passed
Push — master ( a1c8ef...32b200 )
by ABDULMALIK
10:56
created

RbacMiddleware::getCurrentUserId()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 23
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

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