Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
27 / 27
100.00% covered (success)
100.00%
3 / 3
CRAP
100.00% covered (success)
100.00%
1 / 1
VerifyApieUser
100.00% covered (success)
100.00%
27 / 27
100.00% covered (success)
100.00%
3 / 3
12
100.00% covered (success)
100.00%
1 / 1
 handle
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
5
 supports
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
4
 createResponse
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
3
1<?php
2
3namespace Apie\LaravelApie\Wrappers\Security;
4
5use Apie\Cms\Controllers\FormCommitController;
6use Apie\Common\ValueObjects\DecryptedAuthenticatedUser;
7use Apie\Core\Actions\ActionResponse;
8use Apie\Core\Actions\ActionResponseStatus;
9use Apie\Core\BoundedContext\BoundedContextId;
10use Apie\Core\ContextConstants;
11use Apie\Core\Entities\EntityInterface;
12use Apie\RestApi\Exceptions\InvalidContentTypeException;
13use Closure;
14use Illuminate\Support\Facades\Auth;
15use Psr\Http\Message\ResponseInterface;
16use Psr\Http\Message\ServerRequestInterface;
17use Symfony\Component\HttpFoundation\Request;
18use Symfony\Component\HttpFoundation\Response;
19
20class VerifyApieUser extends FormCommitController
21{
22    public function handle(Request $request, Closure $next): Response
23    {
24        $psrRequest = app(ServerRequestInterface::class);
25        try {
26            $context = $this->contextBuilderFactory->createFromRequest($psrRequest);
27            $decryptedAuthenticatedUser = $context->getContext(DecryptedAuthenticatedUser::class, false);
28            if ($context->hasContext(ContextConstants::AUTHENTICATED_USER)
29                && $decryptedAuthenticatedUser instanceof DecryptedAuthenticatedUser) {
30                $userIdentifier = $decryptedAuthenticatedUser->toNative();
31                $user = resolve(ApieUserProvider::class)->retrieveById($userIdentifier);
32                Auth::login($user);
33            }
34        } catch (InvalidContentTypeException) {
35            // Ignore invalid content type exceptions here.
36        }
37        
38        if (!$this->supports($psrRequest)) {
39            return $next($request);
40        }
41        $this->__invoke($psrRequest);
42        return $next($request);
43    }
44
45    private function supports(ServerRequestInterface $request): bool
46    {
47        return $request->getAttribute('_is_apie', false)
48            && $request->getAttribute(ContextConstants::OPERATION_ID)
49            && str_starts_with($request->getAttribute(ContextConstants::OPERATION_ID), 'call-method-')
50            && 'verifyAuthentication' === $request->getAttribute(ContextConstants::METHOD_NAME);
51    }
52
53    protected function createResponse(ServerRequestInterface $psrRequest, ActionResponse $actionResponse): ResponseInterface
54    {
55        if ($actionResponse->status === ActionResponseStatus::SUCCESS && $actionResponse->result instanceof EntityInterface) {
56            $decryptedUserId = DecryptedAuthenticatedUser::createFromEntity(
57                $actionResponse->result,
58                new BoundedContextId($psrRequest->getAttribute(ContextConstants::BOUNDED_CONTEXT_ID)),
59                time() + 3600
60            );
61            $userIdentifier = $decryptedUserId->toNative();
62            $user = resolve(ApieUserProvider::class)->retrieveById($userIdentifier);
63            Auth::login($user);
64        }
65        return parent::createResponse($psrRequest, $actionResponse);
66    }
67}