Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
22 / 22
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
RefreshTokenAction
100.00% covered (success)
100.00%
22 / 22
100.00% covered (success)
100.00%
2 / 2
3
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 __invoke
100.00% covered (success)
100.00%
21 / 21
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3declare(strict_types=1);
4
5namespace App\Action\Auth;
6
7use App\Domain\Auth\Service\AuthService;
8use App\Renderer\JsonRenderer;
9use InvalidArgumentException;
10use Psr\Http\Message\ResponseInterface;
11use Psr\Http\Message\ServerRequestInterface;
12
13/**
14 * Refresh access token.
15 *
16 * POST /api/auth/refresh
17 */
18final readonly class RefreshTokenAction
19{
20    public function __construct(
21        private AuthService $authService,
22        private JsonRenderer $renderer
23    ) {}
24
25    public function __invoke(
26        ServerRequestInterface $request,
27        ResponseInterface $response,
28    ): ResponseInterface {
29        // Get request data
30        $data = (array)$request->getParsedBody();
31
32        // Validate required fields
33        if (empty($data['refreshToken'])) {
34            throw new InvalidArgumentException('Missing required field: refreshToken');
35        }
36
37        // Refresh tokens
38        $tokens = $this->authService->refreshToken($data['refreshToken']);
39
40        // Get user info from the new access token
41        $user = $this->authService->getCurrentUser($tokens->accessToken);
42
43        // Return new tokens and user info
44        return $this->renderer->json($response, [
45            'success' => true,
46            'message' => 'Token refreshed successfully',
47            'data' => [
48                'user' => [
49                    'userId' => $user->userId,
50                    'username' => $user->username,
51                    'email' => $user->email,
52                    'role' => $user->role,
53                ],
54                'accessToken' => $tokens->accessToken,
55                'refreshToken' => $tokens->refreshToken,
56                'tokenType' => $tokens->tokenType,
57                'expiresIn' => $tokens->expiresIn,
58            ],
59        ]);
60    }
61}