-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathUserApiController.php
More file actions
115 lines (107 loc) · 4.33 KB
/
Copy pathUserApiController.php
File metadata and controls
115 lines (107 loc) · 4.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use OpenApi\Attributes as OA;
use Symfony\Component\HttpFoundation\Response;
#[OA\Get(
path: '/toolkit/user',
operationId: 'getCurrentApiKeyOwner',
summary: 'Retorna o usuário proprietário da API Key',
description: 'O middleware exige a ability user.read, concedida pelos papéis personal ou directory, antes de executar o controller. Autentique preferencialmente por Bearer; api_key é um fallback de demonstração.',
tags: ['API Keys'],
security: [
['bearerAuth' => []],
['apiKeyQuery' => []],
],
responses: [
new OA\Response(
response: 200,
description: 'Usuário proprietário da chave',
content: new OA\JsonContent(ref: '#/components/schemas/CurrentUserResponse')
),
new OA\Response(
response: 401,
description: 'Chave ausente, inválida, expirada ou revogada',
content: new OA\JsonContent(
ref: '#/components/schemas/ErrorResponse',
example: ['message' => 'Unauthenticated.']
)
),
new OA\Response(
response: 403,
description: 'A chave foi autenticada, mas não possui a ability user.read',
content: new OA\JsonContent(ref: '#/components/schemas/ErrorResponse')
),
]
)]
#[OA\Get(
path: '/toolkit/users',
operationId: 'listApiKeyUsers',
summary: 'Lista usuários do diretório',
description: 'O middleware exige a ability users.read.any antes de executar o controller. O endpoint retorna uma página de até 15 usuários com somente id, name e email; esse escopo global é concedido ao papel directory enquanto o owner possuir a permissão-pai administrativa ou o Gate hierárquico admin. Autentique preferencialmente por Bearer; api_key é um fallback de demonstração.',
tags: ['API Keys'],
security: [
['bearerAuth' => []],
['apiKeyQuery' => []],
],
responses: [
new OA\Response(
response: 200,
description: 'Página do diretório de usuários',
content: new OA\JsonContent(ref: '#/components/schemas/DirectoryUsersResponse')
),
new OA\Response(
response: 401,
description: 'Chave ausente, inválida, expirada ou revogada',
content: new OA\JsonContent(
ref: '#/components/schemas/ErrorResponse',
example: ['message' => 'Unauthenticated.']
)
),
new OA\Response(
response: 403,
description: 'A chave foi autenticada, mas não possui users.read.any ou o owner perdeu a autorização elevada',
content: new OA\JsonContent(ref: '#/components/schemas/ErrorResponse')
),
]
)]
class UserApiController extends Controller
{
/** Retorna em JSON somente o usuário proprietário da API Key autenticada. */
public function current(Request $request): JsonResponse
{
// Pega a API Key do request, que foi adicionada pelo middleware de autenticação de API Key.
/** @var \Uspdev\ApiKeys\Models\ApiKey|null $apiKey */
$apiKey = $request->attributes->get(
config('api-keys.middleware.request_attribute', 'apiKey')
);
// Apenas valida se a API Key estiver associada a um usuário;
// A ability user.read já foi autorizada pelo middleware da rota; aqui
// só preservamos a invariante de que a API Key pertence a um usuário.
abort_unless($apiKey?->owner instanceof User, Response::HTTP_FORBIDDEN);
$user = $apiKey->owner;
return response()->json([
'data' => [
'id' => $user->id,
'name' => $user->name,
'email' => $user->email,
],
]);
}
/**
* Retorna uma página do diretório público permitido pela API Key.
*
* O escopo é global deliberadamente concedido pela ability elevada,
* permitindo que a API Key leia qualquer usuário do sistema.
*/
public function index(): JsonResponse
{
$users = User::query()
->select(['id', 'name', 'email'])
->paginate(15);
return response()->json($users);
}
}