diff --git a/appli_sf/src/Command/AddClientCommand.php b/appli_sf/src/Command/AddClientCommand.php
index 0f0746644bf7ced78cc217532020e12bd3618a61..b9fe201ebbc9ec9f30bc5a3375684ada154717c2 100644
--- a/appli_sf/src/Command/AddClientCommand.php
+++ b/appli_sf/src/Command/AddClientCommand.php
@@ -10,10 +10,13 @@ use App\Utility\Validator;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
+use Symfony\Component\Stopwatch\Stopwatch;
use Symfony\Contracts\Translation\TranslatorInterface;
+use function Symfony\Component\String\u;
class AddClientCommand extends Command
{
@@ -49,7 +52,22 @@ class AddClientCommand extends Command
protected function configure()
{
$this
- ->setDescription('Ajout d\'un nouvel utilisateur en base de données');
+ ->setDescription('Ajout d\'un nouvel utilisateur en base de données')
+ ->addOption('username', 'u', InputOption::VALUE_REQUIRED, 'Identifiant du nouvel utilisateur')
+ ->addOption('password', 'p', InputOption::VALUE_REQUIRED, 'Mot de passe du nouvel utilisateur')
+ ->addOption('email', 'm', InputOption::VALUE_REQUIRED, 'Email du nouvel utilisateur')
+ ->addOption('role', 'r', InputOption::VALUE_REQUIRED, 'Role du nouvel utilisateur')
+ ->addOption('name', 'd', InputOption::VALUE_REQUIRED, 'Nom du nouvel utilisateur')
+ ->addOption('service', null, InputOption::VALUE_OPTIONAL, 'Service du nouvel utilisateur')
+ ->addOption('address', null, InputOption::VALUE_OPTIONAL, 'Adresse du nouvel utilisateur')
+ ->addOption(
+ 'additional-address',
+ null,
+ InputOption::VALUE_OPTIONAL,
+ 'Complément d\'adresse du nouvel utilisateur'
+ )
+ ->addOption('postal-code', null, InputOption::VALUE_OPTIONAL, 'Code postal du nouvel utilisateur')
+ ->addOption('town', null, InputOption::VALUE_OPTIONAL, 'Ville du nouvel utilisateur');
}
protected function initialize(InputInterface $input, OutputInterface $output): void
@@ -57,121 +75,312 @@ class AddClientCommand extends Command
$this->io = new SymfonyStyle($input, $output);
}
- protected function execute(
- InputInterface $input,
- OutputInterface $output
- ): int {
+ protected function interact(InputInterface $input, OutputInterface $output)
+ {
$this->io->title("Ajout d'un utilisateur");
- $username = $this->io->ask(
- $this->translator->trans('addUserCmd.login'),
- null,
- [$this->validator, 'validateUsername']
- );
+ $username = $input->getOption('username');
- $user = new User();
- $user->setUsername($username);
+ if (null !== $username) {
+ $this->io->text(' > '.$this->translator->trans('addUserCmd.login').': '.$username);
+ } else {
+ $username = $this->io->ask(
+ $this->translator->trans('addUserCmd.login'),
+ null,
+ [$this->validator, 'validateUsername']
+ );
+ $input->setOption('username', $username);
+ }
- $email = $this->io->ask(
- $this->translator->trans('addUserCmd.email'),
- null,
- [$this->validator, 'validateEmail']
- );
+ $email = $input->getOption('email');
- $user->setEmail($email);
+ if (null !== $email) {
+ $this->io->text(' > '.$this->translator->trans('addUserCmd.email').': '.$email);
+ } else {
+ $email = $this->io->ask(
+ $this->translator->trans('addUserCmd.email'),
+ null,
+ [$this->validator, 'validateEmail']
+ );
+ $input->setOption('email', $email);
+ }
- $password = $this->io->askHidden(
- $this->translator->trans('addUserCmd.password'),
- [$this->validator, 'validatePassword']
- );
+ $password = $input->getOption('password');
- $encodedPassword = $this->passwordEncoder->encodePassword($user, $password);
- $user->setPassword($encodedPassword);
+ if (null !== $password) {
+ $this->io->text(
+ ' > '.$this->translator->trans('addUserCmd.password').': '
+ .u('*')->repeat(u($password)->length())
+ );
+ } else {
+ $password = $this->io->askHidden(
+ $this->translator->trans('addUserCmd.password'),
+ [$this->validator, 'validatePassword']
+ );
- $confirmPassword = $this->io->askHidden(
- $this->translator->trans('addUserCmd.confirmPassword'),
- function ($confirmPassword) use ($password) {
- if (empty($confirmPassword)) {
- throw new \RuntimeException($this->translator->trans('addUser.error.notEmpty'));
- }
+ $confirmPassword = $this->io->askHidden(
+ $this->translator->trans('addUserCmd.confirmPassword'),
+ function ($confirmPassword) use ($password) {
+ if (empty($confirmPassword)) {
+ throw new \RuntimeException($this->translator->trans('addUser.error.notEmpty'));
+ }
+
+ if ($confirmPassword !== $password) {
+ throw new \RuntimeException(
+ $this->translator->trans('addUser.error.confirmPasswordNoMatch')
+ );
+ }
- if ($confirmPassword !== $password) {
- throw new \RuntimeException(
- $this->translator->trans('addUser.error.confirmPasswordNoMatch')
- );
+ return $confirmPassword;
}
+ );
- return $confirmPassword;
- }
- );
+ if ($password !== $confirmPassword) {
+ $this->io->error($this->translator->trans('addUser.error.confirmPasswordNoMatch'));
- if ($password !== $confirmPassword) {
- $this->io->error($this->translator->trans('addUser.error.confirmPasswordNoMatch'));
+ return 3;
+ }
- return 3;
+ $input->setOption('password', $password);
}
- $rolesList = [
- 1 => $this->translator->trans('ROLE_NOTARY'),
- 2 => $this->translator->trans('ROLE_AGENT'),
- 3 => $this->translator->trans('ROLE_ADMIN'),
- ];
- $roleValue = $this->io->choice($this->translator->trans('addUserCmd.role'), $rolesList, 3);
- $roleKey = array_search($roleValue, $rolesList);
- $role = UserHelper::getRoleFromInt($roleKey);
- $user->setRoles([$role]);
+ $role = $input->getOption('role');
- $name = $this->io->ask(
- $this->translator->trans('addUserCmd.name'),
- null,
- [$this->validator, 'validateNotEmpty']
- );
- $user->setName($name);
+ if (null !== $role) {
+ $this->io->text(
+ ' > '.$this->translator->trans('addUserCmd.role').': '.$role
+ );
+ } else {
+ $rolesList = [
+ 1 => $this->translator->trans('ROLE_NOTARY'),
+ 2 => $this->translator->trans('ROLE_AGENT'),
+ 3 => $this->translator->trans('ROLE_ADMIN'),
+ ];
+ $roleValue = $this->io->choice($this->translator->trans('addUserCmd.role'), $rolesList, 3);
+ $roleKey = array_search($roleValue, $rolesList);
+ $role = UserHelper::getRoleFromInt($roleKey);
- if ($role === UserHelper::ROLE_AGENT) {
- $service = $this->io->ask(
- $this->translator->trans('addUserCmd.service'),
+ $input->setOption('role', $role);
+ }
+
+ $name = $input->getOption('name');
+
+ if (null !== $name) {
+ $this->io->text(
+ ' > '.$this->translator->trans('addUserCmd.name').': '.$name
+ );
+ } else {
+ $name = $this->io->ask(
+ $this->translator->trans('addUserCmd.name'),
null,
[$this->validator, 'validateNotEmpty']
);
- $user->setService($service);
+
+ $input->setOption('name', $name);
+ }
+
+ if ($role === UserHelper::ROLE_AGENT) {
+ $service = $input->getOption('service');
+
+ if (null !== $service) {
+ $this->io->text(
+ ' > '.$this->translator->trans('addUserCmd.service').': '.$service
+ );
+ } else {
+ $service = $this->io->ask(
+ $this->translator->trans('addUserCmd.service'),
+ null,
+ [$this->validator, 'validateNotEmpty']
+ );
+
+ $input->setOption('service', $service);
+ }
}
if ($role === UserHelper::ROLE_NOTARY) {
- $address = $this->io->ask(
- $this->translator->trans('addUserCmd.address'),
- null,
- [$this->validator, 'validateNotEmpty']
- );
- $user->setAddress($address);
+ $address = $input->getOption('address');
- $additionalAddress = $this->io->ask(
- $this->translator->trans('addUserCmd.additionnalAddress'),
- null,
- [$this->validator, 'validateNotEmpty']
- );
- $user->setAdditionalAddress($additionalAddress);
+ if (null !== $address) {
+ $this->io->text(
+ ' > '.$this->translator->trans('addUserCmd.address').': '.$address
+ );
+ } else {
+ $address = $this->io->ask(
+ $this->translator->trans('addUserCmd.address'),
+ null,
+ [$this->validator, 'validateNotEmpty']
+ );
- $postalCode = $this->io->ask(
- $this->translator->trans('addUserCmd.postalCode'),
- null,
- [$this->validator, 'validateNotEmpty']
- );
- $user->setPostalCode($postalCode);
+ $input->setOption('address', $address);
+ }
- $town = $this->io->ask(
- $this->translator->trans('addUserCmd.town'),
- null,
- [$this->validator, 'validateNotEmpty']
- );
- $user->setTown($town);
+
+ $additionalAddress = $input->getOption('additional-address');
+
+ if (null !== $additionalAddress) {
+ $this->io->text(
+ ' > '.$this->translator->trans('addUserCmd.additionalAddress').': '.$additionalAddress
+ );
+ } else {
+ $additionalAddress = $this->io->ask(
+ $this->translator->trans('addUserCmd.additionalAddress'),
+ null,
+ [$this->validator, 'validateNotEmpty']
+ );
+
+ $input->setOption('additional-address', $additionalAddress);
+ }
+
+
+ $postalCode = $input->getOption('postal-code');
+
+ if (null !== $postalCode) {
+ $this->io->text(
+ ' > '.$this->translator->trans('addUserCmd.postalCode').': '.$postalCode
+ );
+ } else {
+ $postalCode = $this->io->ask(
+ $this->translator->trans('addUserCmd.postalCode'),
+ null,
+ [$this->validator, 'validateNotEmpty']
+ );
+
+ $input->setOption('postal-code', $postalCode);
+ }
+
+
+ $town = $input->getOption('town');
+
+ if (null !== $town) {
+ $this->io->text(
+ ' > '.$this->translator->trans('addUserCmd.town').': '.$town
+ );
+ } else {
+ $town = $this->io->ask(
+ $this->translator->trans('addUserCmd.town'),
+ null,
+ [$this->validator, 'validateNotEmpty']
+ );
+
+ $input->setOption('town', $town);
+ }
}
+ }
+
+ protected function execute(
+ InputInterface $input,
+ OutputInterface $output
+ ): int {
+
+ $stopwatch = new Stopwatch();
+ $stopwatch->start('add-user-command');
+
+ $username = $input->getOption('username');
+ $plainPassword = $input->getOption('password');
+ $email = $input->getOption('email');
+ $role = $input->getOption('role');
+ $name = $input->getOption('name');
+ $service = $input->getOption('service');
+ $address = $input->getOption('address');
+ $additionalAddress = $input->getOption('additional-address');
+ $postalCode = $input->getOption('postal-code');
+ $town = $input->getOption('town');
+
+ $this->validateUserData(
+ $username,
+ $plainPassword,
+ $email,
+ $name,
+ $role,
+ $service,
+ $address,
+ $additionalAddress,
+ $postalCode,
+ $town
+ );
+
+ $user = new User();
+ $user->setUsername($username);
+
+ $encodedPassword = $this->passwordEncoder->encodePassword($user, $plainPassword);
+ $user->setPassword($encodedPassword);
+
+ $user->setEmail($email);
+ $user->setRoles([$role]);
+ $user->setName($name);
+ $user->setService($service);
+ $user->setAddress($address);
+ $user->setAdditionalAddress($additionalAddress);
+ $user->setPostalCode($postalCode);
+ $user->setTown($town);
$this->entityManager->persist($user);
$this->entityManager->flush();
$this->io->success($this->translator->trans('addUser.success.userCreated', [$username, $role]));
- return 0;
+ $event = $stopwatch->stop('add-user-command');
+ if ($output->isVerbose()) {
+ $this->io->comment(
+ sprintf(
+ 'New user database id: %d / Elapsed time: %.2f ms / Consumed memory: %.2f MB',
+ $user->getId(),
+ $event->getDuration(),
+ $event->getMemory() / (1024 ** 2)
+ )
+ );
+ }
+
+ return Command::SUCCESS;
+ }
+
+ /**
+ * @param string $username
+ * @param string $plainPassword
+ * @param string $email
+ * @param string $name
+ * @param string $role
+ * @param string $service
+ * @param string $address
+ * @param string $additionalAddress
+ * @param string $postalCode
+ * @param string $town
+ */
+ private function validateUserData(
+ $username,
+ $plainPassword,
+ $email,
+ $name,
+ $role,
+ $service = '',
+ $address = '',
+ $additionalAddress = '',
+ $postalCode = '',
+ $town = ''
+ ): void {
+ // first check if a user with the same username already exists.
+ $existingUser = $this->userRepository->findOneBy(['username' => $username]);
+
+ if (null !== $existingUser) {
+ throw new \RuntimeException(
+ sprintf('There is already a user registered with the "%s" username.', $username)
+ );
+ }
+
+ // validate password and email if is not this input means interactive.
+ $this->validator->validatePassword($plainPassword);
+ $this->validator->validateEmail($email);
+ $this->validator->validateNotEmpty($name, 'name');
+
+ if ($role === UserHelper::ROLE_AGENT) {
+ $this->validator->validateNotEmpty($service, 'service');
+ }
+
+ if ($role === UserHelper::ROLE_NOTARY) {
+ $this->validator->validateNotEmpty($address, 'address');
+ $this->validator->validateNotEmpty($additionalAddress, 'additionalAddress');
+ $this->validator->validateNotEmpty($postalCode, 'postalCode');
+ $this->validator->validateNotEmpty($town, 'town');
+ }
}
}
diff --git a/appli_sf/src/Form/UserType.php b/appli_sf/src/Form/UserType.php
index f0401bbd3e16d1021a9c67c511d0751d3a2190dd..509e8eeee973221e89143c59535762927fd5b5ee 100644
--- a/appli_sf/src/Form/UserType.php
+++ b/appli_sf/src/Form/UserType.php
@@ -127,7 +127,7 @@ class UserType extends AbstractType
'additionalAddress',
TextType::class,
[
- 'label' => 'addUser.additionnalAddress',
+ 'label' => 'addUser.additionalAddress',
'required' => false,
]
)
diff --git a/appli_sf/src/Utility/Validator.php b/appli_sf/src/Utility/Validator.php
index ca14f907a5794be12612f628b8faf1a9fd93c586..ba9f2a9ca5265054e8983c8a00107b7facc29436 100644
--- a/appli_sf/src/Utility/Validator.php
+++ b/appli_sf/src/Utility/Validator.php
@@ -35,7 +35,12 @@ class Validator
public function validateUsername(?string $username): string
{
if (empty($username)) {
- throw new InvalidArgumentException($this->translator->trans('addUser.error.notEmpty'));
+ throw new InvalidArgumentException(
+ $this->translator->trans(
+ 'addUser.error.notEmpty',
+ ['%field%' => $this->translator->trans('addUser.login')]
+ )
+ );
}
$user = $this->userRepository->findOneBy(['username' => $username]);
@@ -59,7 +64,12 @@ class Validator
public function validateEmail(?string $email): string
{
if (empty($email)) {
- throw new InvalidArgumentException($this->translator->trans('addUser.error.notEmpty'));
+ throw new InvalidArgumentException(
+ $this->translator->trans(
+ 'addUser.error.notEmpty',
+ ['%field%' => $this->translator->trans('addUser.email')]
+ )
+ );
}
$userEmail = $this->userRepository->findOneBy(['email' => $email]);
@@ -83,7 +93,12 @@ class Validator
public function validatePassword(?string $plainPassword): string
{
if (empty($plainPassword)) {
- throw new InvalidArgumentException($this->translator->trans('addUser.error.notEmpty'));
+ throw new InvalidArgumentException(
+ $this->translator->trans(
+ 'addUser.error.notEmpty',
+ ['%field%' => $this->translator->trans('addUser.password')]
+ )
+ );
}
$passwordConstraint = new PasswordRequirements(
@@ -118,12 +133,23 @@ class Validator
*
* @param string|null $value
*
+ * @param string $name
+ *
* @return string
*/
- public function validateNotEmpty(?string $value): string
+ public function validateNotEmpty(?string $value, $name = null): string
{
if (empty($value)) {
- throw new InvalidArgumentException($this->translator->trans('addUser.error.notEmpty'));
+ throw new InvalidArgumentException(
+ $name ?
+ $this->translator->trans(
+ 'addUser.error.notEmptyFieldName',
+ ['%fieldName%' => $this->translator->trans('addUser.'.$name)]
+ ) :
+ $this->translator->trans(
+ 'addUser.error.notEmpty'
+ )
+ );
}
return $value;
diff --git a/appli_sf/translations/messages.fr.yaml b/appli_sf/translations/messages.fr.yaml
index c69cf91805a73bc28b97832aeed0fa0e5f27b992..7f5d93411e5a9a997a66c14ef84c8895d3f3cd40 100644
--- a/appli_sf/translations/messages.fr.yaml
+++ b/appli_sf/translations/messages.fr.yaml
@@ -16,7 +16,7 @@ addUser:
roleConsole: "Rôle \n1) Étude notariale \n2) Agent du département \n3) Administrateur\n> "
service: "Service"
address: "Adresse"
- additionnalAddress: "Complément d'adresse"
+ additionalAddress: "Complément d'adresse"
postalCode: "Code postal"
town: "Ville"
send: "Ajouter"
@@ -25,6 +25,7 @@ addUser:
userUsernameExists: "L'utilisateur '%username%' existe déjà !"
confirmPasswordNoMatch: "Les mots de passe ne correspondent pas"
notEmpty: "Ce champ ne peut être vide"
+ notEmptyFieldName: "%fieldName% : Ce champ ne peut être vide"
success:
userCreated: "L'utilisateur '0' a été créé avec le(s) role(s) [1] !"
confirmEmail:
@@ -38,7 +39,7 @@ addUserCmd:
role: "Profil"
service: "Service"
address: "Adresse"
- additionnalAddress: "Complément d'adresse"
+ additionalAddress: "Complément d'adresse"
postalCode: "Code postal"
town: "Ville"
userEdit:
diff --git a/bin/console b/bin/console
index b7693ffc76c96da1528aea6d111c85281f66373e..257b3f2f7b41acaecddef30eab976ab34b9e1b0e 100755
--- a/bin/console
+++ b/bin/console
@@ -2,4 +2,4 @@
./bin/test-php-docker-running
-docker-compose exec php //entrypoint bin/console $@
+docker-compose exec php //entrypoint bin/console "$@"