Commit c7834407 authored by Thibaut Vallee's avatar Thibaut Vallee
Browse files

HistoUser context normalization

parent 251acc4c
Loading
Loading
Loading
Loading
+10 −0
Changes for 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 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 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