Completed
Push — master ( 5c71f2...630401 )
by Oleg
07:36
created

GenerateTemporaryTokenAction::createToken()   A

Complexity

Conditions 3
Paths 5

Size

Total Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 3.4746

Importance

Changes 0
Metric Value
dl 0
loc 12
ccs 5
cts 8
cp 0.625
rs 9.8666
c 0
b 0
f 0
cc 3
nc 5
nop 2
crap 3.4746
1
<?php
2
declare(strict_types=1);
3
4
namespace SlayerBirden\DataFlowServer\Authentication\Controller;
5
6
use Psr\Http\Message\ResponseInterface;
7
use Psr\Http\Message\ServerRequestInterface;
8
use Psr\Http\Server\MiddlewareInterface;
9
use Psr\Http\Server\RequestHandlerInterface;
10
use Psr\Log\LoggerInterface;
11
use SlayerBirden\DataFlowServer\Authentication\Exception\PermissionDeniedException;
12
use SlayerBirden\DataFlowServer\Authentication\TokenManagerInterface;
13
use SlayerBirden\DataFlowServer\Doctrine\Middleware\ResourceMiddlewareInterface;
14
use SlayerBirden\DataFlowServer\Domain\Entities\User;
15
use SlayerBirden\DataFlowServer\Stdlib\Validation\DataValidationResponseFactory;
16
use SlayerBirden\DataFlowServer\Stdlib\Validation\GeneralErrorResponseFactory;
17
use SlayerBirden\DataFlowServer\Stdlib\Validation\GeneralSuccessResponseFactory;
18
use SlayerBirden\DataFlowServer\Stdlib\Validation\ValidationResponseFactory;
19
use Zend\Hydrator\HydratorInterface;
20
use Zend\InputFilter\InputFilterInterface;
21
22
final class GenerateTemporaryTokenAction implements MiddlewareInterface
23
{
24
    /**
25
     * @var TokenManagerInterface
26
     */
27
    private $tokenManager;
28
    /**
29
     * @var LoggerInterface
30
     */
31
    private $logger;
32
    /**
33
     * @var HydratorInterface
34
     */
35
    private $hydrator;
36
    /**
37
     * @var InputFilterInterface
38
     */
39
    private $inputFilter;
40
41 8
    public function __construct(
42
        InputFilterInterface $inputFilter,
43
        TokenManagerInterface $tokenManager,
44
        LoggerInterface $logger,
45
        HydratorInterface $hydrator
46
    ) {
47 8
        $this->tokenManager = $tokenManager;
48 8
        $this->logger = $logger;
49 8
        $this->hydrator = $hydrator;
50 8
        $this->inputFilter = $inputFilter;
51 8
    }
52
53
    /**
54
     * @inheritdoc
55
     */
56 8
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
57
    {
58 8
        $data = $request->getParsedBody();
59 8
        if (!is_array($data)) {
60
            return (new DataValidationResponseFactory())('token');
61
        }
62 8
        $this->inputFilter->setData($data);
63
64 8
        $user = $request->getAttribute(ResourceMiddlewareInterface::DATA_RESOURCE);
65
66 8
        if ($this->inputFilter->isValid()) {
67 7
            return $this->createToken($user, $data['resources']);
68
        } else {
69 1
            return (new ValidationResponseFactory())('token', $this->inputFilter);
70
        }
71
    }
72
73 7
    private function createToken(User $user, array $resources): ResponseInterface
74
    {
75
        try {
76 7
            $token = $this->tokenManager->getTmpToken($user, $resources);
77 5
            return (new GeneralSuccessResponseFactory())('Token created', 'token', $this->hydrator->extract($token));
78 2
        } catch (PermissionDeniedException $exception) {
79 2
            return (new GeneralErrorResponseFactory())($exception->getMessage(), 'token', 400);
80
        } catch (\Exception $exception) {
81
            $this->logger->error((string)$exception);
82
            return (new GeneralErrorResponseFactory())('There was an error while obtaining tmp token.', 'token', 400);
83
        }
84
    }
85
}
86