corentin_wakdo/src/app/Auth/UserDirectory.php
Imugiii 65cb3008ee
Some checks failed
CI / secret-scan (push) Successful in 8s
CI / static-tests (push) Successful in 28s
CI / static-tests (pull_request) Successful in 27s
CI / auto-merge (push) Has been skipped
CI / php-lint (push) Successful in 18s
CI / secret-scan (pull_request) Successful in 9s
CI / php-lint (pull_request) Successful in 18s
CI / auto-merge (pull_request) Failing after 4s
feat(admin): shell back-office rendu serveur + garde de page (P3)
AdminController : base des pages back-office. guard(permission?) applique RG-6/RG-T02 (302 vers
/login si session absente/expiree/inactive) puis RG-T03 (403 si permission manquante), sinon renvoie
la GuardResult ; adminView() rend dans le shell admin en injectant identite + permissions + jeton CSRF.
Controller gagne un hook layoutName() (defaut inchange). DashboardController -> GET /admin/dashboard
(landing authentifie ; KPI reels = chunk stats). UserDirectory : nom + libelle de role pour la topbar.
Vues admin/{layout,dashboard,forbidden} : navigation conditionnee aux permissions, logout en POST CSRF,
sorties echappees (RG-T15), assets en chemins absolus. Premier cablage de SessionGuard sur une page.
127 tests (dont 403 garde, echappement XSS), PHPStan L6.
2026-06-15 19:21:52 +00:00

40 lines
1.2 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Auth;
use App\Core\DatabaseInterface;
/**
* Lecture des informations d'affichage d'un utilisateur (nom + libelle de role)
* pour l'entete du back-office. Separe d'Authorizer (qui ne traite que les
* permissions) ; depend de DatabaseInterface pour rester testable avec un double.
*/
final class UserDirectory
{
public function __construct(private readonly DatabaseInterface $db)
{
}
/**
* @return array{name: string, role_label: string}
*/
public function displayInfo(int $userId): array
{
$row = $this->db->fetch(
'SELECT u.first_name, u.last_name, r.label AS role_label '
. 'FROM user u JOIN role r ON r.id = u.role_id WHERE u.id = :id',
['id' => $userId],
);
$first = is_string($row['first_name'] ?? null) ? $row['first_name'] : '';
$last = is_string($row['last_name'] ?? null) ? $row['last_name'] : '';
$name = trim($first . ' ' . $last);
return [
'name' => $name !== '' ? $name : 'Utilisateur',
'role_label' => is_string($row['role_label'] ?? null) ? $row['role_label'] : '',
];
}
}