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

UserCreateEvent

parent 84734294
Loading
Loading
Loading
Loading
+10 −13
Changes for src/Command/CreateUserCommand.php: 10 added lines, 13 removed lines.
Original line number Diff line number Diff line
@@ -2,25 +2,27 @@

namespace Unicaen\Utilisateur\Command;

use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Unicaen\Utilisateur\Entity\Role;
use Unicaen\Utilisateur\Entity\User;
use Unicaen\Utilisateur\Repository\UtilisateurRepository;
use Unicaen\Utilisateur\Service\UtilisateurService;

#[AsCommand(name: 'utilisateur:create-user')]
class CreateUserCommand extends Command
{
    private EntityManagerInterface $entityManager;
    private UtilisateurService $utilisateurService;
    private UserPasswordHasherInterface $passwordHasher;

    public function __construct(EntityManagerInterface $entityManager, UserPasswordHasherInterface $passwordHasher)
    public function __construct(UtilisateurService $utilisateurService,
                                UserPasswordHasherInterface $passwordHasher)
    {
        $this->entityManager = $entityManager;

        $this->utilisateurService = $utilisateurService;
        $this->passwordHasher = $passwordHasher;

        parent::__construct();
@@ -39,7 +41,7 @@ class CreateUserCommand extends Command
        $io->info("Création d'un compte utilisateur local");

        $username = $io->ask('Username');
        $existingUser = $this->entityManager->getRepository(User::class)->findOneBy(['username' => $username]);
        $existingUser = $this->utilisateurService->findOneBy(['username' => $username]);
        if ($existingUser) {
            $io->error('Un utilisateur avec ce username existe déjà');
            return Command::FAILURE;
@@ -47,7 +49,7 @@ class CreateUserCommand extends Command

        $email = $io->ask('Email');
        // Check if user with same mail exists
        $existingUser = $this->entityManager->getRepository(User::class)->findOneBy(['email' => $email]);
        $existingUser = $this->utilisateurService->findOneBy(['email' => $email]);
        if ($existingUser) {
            $io->error('Un utilisateur avec cette adresse mail existe déjà');
            return Command::FAILURE;
@@ -66,13 +68,8 @@ class CreateUserCommand extends Command
        $user->setDisplayName($dipslayName);
        $user->setEmail($email);
        $user->setPassword($this->passwordHasher->hashPassword($user,$password));
        $roleUser = $this->entityManager->getRepository(Role::class)->findOneBy(['code' => 'ROLE_USER']);
        if ($roleUser) {
            $user->addRole($roleUser);
        }

        $this->entityManager->persist($user);
        $this->entityManager->flush();
        $this->utilisateurService->add($user);

        $io->success('Utilisateur créé.');
        return Command::SUCCESS;
+36 −0
Changes for src/Event/UserCreateEvent.php: 36 added lines, 0 removed lines.
Original line number Diff line number Diff line
<?php

namespace Unicaen\Utilisateur\Event;

use Symfony\Contracts\EventDispatcher\Event;
use Symfony\Component\Security\Core\User\UserInterface;
use Unicaen\Utilisateur\Entity\User;

/**
 * Evevenement generer par UnicaenAuthentification lorsque l'authentification est réussite mais qu'il n'y a pas d'utilisateur correspondant
 * (cas d'une première authentification via LDAP/CAS/Shib)
 * Pré-remplie l'utilisateur avec les données issue de l'authentification.
 * Charge au listener éventuel d'enregistrer cette utilisateur en base de données
 */
class UserCreateEvent extends Event
{

    public function __construct(?User $user = null) {
        $this->user = $user;
        return $this;
    }

    protected ?User $user = null;
    public function getUser(): ?User
    {
        return $this->user;
    }

    public function setUser(?User $user): static
    {
        $this->user = $user;
        return $this;
    }

    public const CREATE_USER = 'unicaen.utilisateur.create-user';
}
+39 −0
Changes for src/Event/UserCreateListener.php: 39 added lines, 0 removed lines.
Original line number Diff line number Diff line
<?php


namespace Unicaen\Utilisateur\Event;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Unicaen\Utilisateur\Entity\User;
use Unicaen\Utilisateur\Repository\UtilisateurRepository;
use Symfony\Component\Security\Core\User\UserInterface;
use Unicaen\Utilisateur\Service\UtilisateurService;

/**
 * Cretion automatique de l'utilisateur si celà est autorisé
 * basé sur
 * @see Symfony\Component\Security\Http\EventListener\UserProviderListener
 */
class UserCreateListener
    implements EventSubscriberInterface
{

    public function __construct(
        private UtilisateurService $utilisateurService,
    ) {}

    public function onCreateUser(UserCreateEvent $userCreateEvent): ?User
    {
        $user = $userCreateEvent->getUser();
        $exist = $this->utilisateurService->findOneBy(['username' => $user->getUsername()]);
        if($exist) {return null;}

        return $this->utilisateurService->add($user);

    }

    public static function getSubscribedEvents(): array
    {
        return [UserCreateEvent::CREATE_USER => ['onCreateUser', 1]];
    }
}
+17 −1
Changes for src/Service/UtilisateurService.php: 17 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -3,16 +3,32 @@
namespace Unicaen\Utilisateur\Service;

use Doctrine\ORM\EntityManagerInterface;
use Unicaen\Utilisateur\Entity\User;
use  Unicaen\Utilisateur\Model\UserInterface;
use Unicaen\Utilisateur\Repository\UtilisateurRepository;

class UtilisateurService
{
    public function __construct(
        private EntityManagerInterface $em
        private EntityManagerInterface $em,
        private UtilisateurRepository $repository,
    )
    {
    }

    public function findOneBy(array $criteria, array|null $orderBy = null) : ?User
    {
        return $this->repository->findOneBy($criteria, $orderBy);
    }

    public function add(User $user) : User
    {
        $this->em->persist($user);
        $this->em->flush();
        return $user;
    }


    public function setDefaultActiveRoleForUser(UserInterface $user): void
    {
        if (!$user->getActiveRole() && !$user->getFullRoles()->isEmpty()) {
+1 −3
Changes for src/State/UtilisateurMeStateProvider.php: 1 added line, 3 removed lines.
Original line number Diff line number Diff line
@@ -5,7 +5,6 @@ namespace Unicaen\Utilisateur\State;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProviderInterface;
use Symfony\Bundle\SecurityBundle\Security;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Unicaen\Privilege\Service\PrivilegeService;
use Unicaen\Utilisateur\Dto\PerimetreUtilisateurMeDto;
use Unicaen\Utilisateur\Dto\UtilisateurMeResource;
@@ -17,8 +16,7 @@ readonly class UtilisateurMeStateProvider implements ProviderInterface
    public function __construct(
        private Security              $security,
        private PrivilegeService      $privilegeService,
        private UtilisateurService $utilisateurService,
        private ParameterBagInterface $parameterBag,
        private UtilisateurService    $utilisateurService
    ) {
    }