Test Failed
Pull Request — master (#494)
by
unknown
03:32
created

AccessChecker::process()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 11
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 5
nc 3
nop 2
dl 0
loc 11
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace App\Http\Middleware;
6
7
use App\Modules\User\UserService;
8
use Psr\Http\Message\ResponseFactoryInterface;
9
use Psr\Http\Message\ResponseInterface;
10
use Psr\Http\Message\ServerRequestInterface;
11
use Psr\Http\Server\MiddlewareInterface;
12
use Psr\Http\Server\RequestHandlerInterface;
13
use Yiisoft\Http\Status;
14
15
final class AccessChecker implements MiddlewareInterface
16
{
17
    private ?string $permission = null;
18
19
    public function __construct(
20
        private ResponseFactoryInterface $responseFactory,
21
        private UserService $userService
22
    ) {
23
    }
24
25
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
26
    {
27
        if ($this->permission === null) {
28
            throw new \InvalidArgumentException('Permission not set.');
29
        }
30
31
        if (!$this->userService->hasPermission($this->permission)) {
32
            return $this->responseFactory->createResponse(Status::FORBIDDEN);
33
        }
34
35
        return $handler->handle($request);
36
    }
37
38
    public function withPermission(string $permission): self
39
    {
40
        $new = clone $this;
41
        $new->permission = $permission;
42
        return $new;
43
    }
44
}
45