Commit 765d7ddf authored by Thibaut Vallee's avatar Thibaut Vallee
Browse files

HistoUser context normalization

parent 692412c4
Loading
Loading
Loading
Loading
Loading
+6 −0
Changes for CHANGELOG.md: 6 added lines, 0 removed lines.
Original line number Diff line number Diff line
CHANGELOG
=========
0.2.3 (28/11/2025)
------------------
- Config : nouveau Paramétre unicaen.user_class et unicaen.role_class
- Config : nouveau Paramétre histo.histo_default_username pour pouvoir définir l'utilisateur par défaut lors de l'historisation
- Mise en place du HistoContextBuilder

0.2.1 (17/10/2025)
------------------
- Ajout de RestaurerProcessor
+10 −0
Changes for api/config/services.yaml: 10 added lines, 0 removed lines.
Original line number Diff line number Diff line
parameters:
  unicaen.user_class: 'Unicaen\Utilisateur\Entity\User'
  unicaen.role_class: 'Unicaen\Utilisateur\Entity\Role'
  histo.histo_default_username:  '%env(trim:HISTO_DEFAULT_USERNAME)%'

services:
  _defaults:
    autowire: true
@@ -5,3 +10,8 @@ services:

  Unicaen\Utilisateur\:
    resource: '../src/*'

  'Unicaen\Utilisateur\Serializer\HistoContextBuilder':
    decorates: 'api_platform.serializer.context_builder'
    arguments: [ '@Unicaen\Utilisateur\Serializer\HistoContextBuilder.inner' ]
    autoconfigure: false
+1 −1
Changes for api/src/Entity/AbstractUser.php: 1 added line, 1 removed line.
Original line number Diff line number Diff line
@@ -50,7 +50,7 @@ abstract class AbstractUser implements UnicaenUserInterface, PasswordAuthenticat
    #[ORM\Column(length: 180, unique: true)]
    protected string $email;

    #[Groups(['user:read', 'user:create', 'user:update'])]
    #[Groups(['user:read', 'user:create', 'user:update', 'histoUser:read'])]
    #[ORM\Column(length: 180, nullable: true)]
    protected ?string $displayName = null;

+39 −0
Changes for api/src/Serializer/HistoContextBuilder.php: 39 added lines, 0 removed lines.
Original line number Diff line number Diff line
<?php

namespace App\Serializer;

use ApiPlatform\State\SerializerContextBuilderInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Unicaen\Utilisateur\Model\HistoriqueAwareInterface;

class HistoContextBuilder  implements SerializerContextBuilderInterface
{
    private $decorated;
    private $authorizationChecker;

    public function __construct(SerializerContextBuilderInterface $decorated, AuthorizationCheckerInterface $authorizationChecker)
    {
        $this->decorated = $decorated;
        $this->authorizationChecker = $authorizationChecker;
    }

    public function createFromRequest(Request $request, bool $normalization, ?array $extractedAttributes = null): array
    {
        $context = $this->decorated->createFromRequest($request, $normalization, $extractedAttributes);
        $resourceClass = $context['resource_class'] ?? null;
        //Vérification sur le fait que la class demandé existe
        if(!$resourceClass || ! class_exists($resourceClass)) { return $context;}
        //Vérification que la class est une HistoriqueAwareInterface
        if(!is_a(new $resourceClass(), HistoriqueAwareInterface::class)) {return $context;}
        $method = $request->getMethod();
        //  Ajout du groupe histoUser:read pour la méthode GET
        //  ce context de normalisation ne permet d'acceder qu'au displayName de l'utilisateur et pas aux autres informations tel que la liste de ces rôles
        switch ($method) {
            case 'GET':
                $context['groups'][] = 'histoUser:read';
            break;
        }
        return $context;
    }
}
 No newline at end of file
+9 −0
Changes for documentation/Historique.md: 9 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -73,6 +73,15 @@ class XXX implements HistoriqueAwareInterface

_Note : trouver comment mettre automatiquement les annotations sur les attributs d'historisation permettrait de ne pas avoir a le faire dans chaque entités historisable_

### HistoriqueContextBuilder
Afin de limiter les infos d'utilisateur accessible pour les entités historisé, un nouveau context de Normalisation a été défini : `histoUser:read`

Ce context permet de n'acceder qu'à l'attribut displayName de l'utilisateur dans le cadre de l'affichage des histoUser. Les autres attributs tel que les rôles des utilisateurs ne sont pas fournis dans se context.

Le contextBuilder `HistoriqueContextBuilder` permet de rajouter automatiquement aux entités implémentant l'interface `HistoriqueAwareInterface` le context de normalisation `histoUser:read`
Lorsque l'on est en GET. Il n'y a donc rien a faire pour récuperer le nom des HistoUser.


### HistoriqueStateProcessor

Les attributs d'histoCreation et histoModification sont automatiquement définie par le processor `HistoriqueStateProcessor` lors de la mise à jours des données via Doctrine.