50 lines
1.6 KiB
PHP
50 lines
1.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Controllers;
|
|
|
|
use App\Core\Response;
|
|
|
|
/**
|
|
* GET /api/me : identite et permissions de l'utilisateur de la session courante.
|
|
*
|
|
* Premier consommateur reel de SessionGuard (RG-6 + RG-T02) et d'Authorizer
|
|
* (RG-T03) : la garde rejette toute session absente/expiree/inactive (401), sinon
|
|
* on renvoie le role et la liste des permissions rechargee depuis la base.
|
|
*
|
|
* NB P2 : les pages admin sont encore des fichiers statiques servis par Apache
|
|
* (hors PHP), donc non couvertes par cette garde. Leur protection arrive en P3
|
|
* quand elles deviennent des vues rendues serveur passant par ce socle.
|
|
*
|
|
* Non `final` a dessein : les tests sous-classent pour injecter des doubles
|
|
* (session en mode test + FakeDatabase) via les hooks proteges.
|
|
*/
|
|
class MeController extends AuthenticatedController
|
|
{
|
|
/**
|
|
* @param array<string, string> $params
|
|
*/
|
|
public function show(array $params = []): Response
|
|
{
|
|
$guard = $this->sessionGuard()->check();
|
|
|
|
if (!$guard->authenticated || $guard->userId === null || $guard->roleId === null) {
|
|
return $this->json(
|
|
['data' => null, 'error' => ['code' => 'AUTH_REQUIRED', 'message' => 'Authentification requise']],
|
|
401,
|
|
);
|
|
}
|
|
|
|
$authorizer = $this->authorizer();
|
|
|
|
return $this->json([
|
|
'data' => [
|
|
'user_id' => $guard->userId,
|
|
'role_id' => $guard->roleId,
|
|
'role_code' => $authorizer->roleCode($guard->roleId),
|
|
'permissions' => $authorizer->permissionsFor($guard->roleId),
|
|
],
|
|
]);
|
|
}
|
|
}
|