Skip to content
Snippets Groups Projects
Commit d283a20d authored by Camille Simiand's avatar Camille Simiand
Browse files

Refacto retrieving email addresses

parent ba76e79e
Branches
Tags
1 merge request!69tuleap-142-when-editing-email-address-user-should-confirm-it-with-email-validation
...@@ -7,7 +7,6 @@ use App\Entity\User; ...@@ -7,7 +7,6 @@ use App\Entity\User;
use App\Form\EditPasswordFormType; use App\Form\EditPasswordFormType;
use App\Form\EditUserProfileFormType; use App\Form\EditUserProfileFormType;
use App\Repository\PendingEmailAddressRepository; use App\Repository\PendingEmailAddressRepository;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail; use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
...@@ -24,8 +23,7 @@ class UserController extends AbstractController ...@@ -24,8 +23,7 @@ class UserController extends AbstractController
public function __construct( public function __construct(
private EntityManagerInterface $entity_manager, private EntityManagerInterface $entity_manager,
private TranslatorInterface $translator, private TranslatorInterface $translator,
private PendingEmailAddressRepository $pending_email_address_repository, private PendingEmailAddressRepository $pending_email_address_repository
private UserRepository $user_repository
) { ) {
} }
...@@ -61,17 +59,10 @@ class UserController extends AbstractController ...@@ -61,17 +59,10 @@ class UserController extends AbstractController
$this->entity_manager->remove($last_pending_email_address); $this->entity_manager->remove($last_pending_email_address);
} }
$users_emails = $this->user_repository->getAllEmails();
$pending_email_addresses = $this->pending_email_address_repository->getAllEmails();
$form = $this->createForm( $form = $this->createForm(
EditUserProfileFormType::class, EditUserProfileFormType::class,
$current_user, $current_user,
[ ['current_email_address' => $current_user->getEmail()]
'current_email_address' => $current_user->getEmail(),
'users_emails' => $users_emails,
'pending_emails' => $pending_email_addresses
]
); );
$form->handleRequest($request); $form->handleRequest($request);
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
namespace App\Form; namespace App\Form;
use App\Entity\User; use App\Entity\User;
use App\Repository\PendingEmailAddressRepository;
use App\Repository\UserRepository;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EmailType; use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType; use Symfony\Component\Form\Extension\Core\Type\PasswordType;
...@@ -17,8 +19,22 @@ use Symfony\Component\Validator\Context\ExecutionContextInterface; ...@@ -17,8 +19,22 @@ use Symfony\Component\Validator\Context\ExecutionContextInterface;
class EditUserProfileFormType extends AbstractType class EditUserProfileFormType extends AbstractType
{ {
private UserRepository $user_repository;
private PendingEmailAddressRepository $pending_email_address_repository;
public function __construct(
UserRepository $user_repository,
PendingEmailAddressRepository $pending_email_address_repository
) {
$this->user_repository = $user_repository;
$this->pending_email_address_repository = $pending_email_address_repository;
}
public function buildForm(FormBuilderInterface $builder, array $options): void public function buildForm(FormBuilderInterface $builder, array $options): void
{ {
$user_repository = $this->user_repository;
$pending_email_address_repository = $this->pending_email_address_repository;
$builder $builder
->add( ->add(
'firstName', 'firstName',
...@@ -48,13 +64,17 @@ class EditUserProfileFormType extends AbstractType ...@@ -48,13 +64,17 @@ class EditUserProfileFormType extends AbstractType
new Assert\Email(), new Assert\Email(),
new Assert\Callback( new Assert\Callback(
['callback' => static function ( ['callback' => static function (
?string $value, string $value,
ExecutionContextInterface $context ExecutionContextInterface $context
) use ($options) { ) use (
$options,
$user_repository,
$pending_email_address_repository
) {
if ( if (
$value !== $options['current_email_address'] && $value !== $options['current_email_address'] &&
(in_array($value, $options['users_emails']) || ($user_repository->emailExists($value) ||
in_array($value, $options['pending_emails'])) $pending_email_address_repository->emailIsReserved($value))
) { ) {
$context $context
->buildViolation(message: 'user.email.unique') ->buildViolation(message: 'user.email.unique')
......
...@@ -7,8 +7,6 @@ use App\Entity\User; ...@@ -7,8 +7,6 @@ use App\Entity\User;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\ManagerRegistry;
use function PHPUnit\Framework\assertInstanceOf;
/** /**
* @method PendingEmailAddress|null find($id, $lockMode = null, $lockVersion = null) * @method PendingEmailAddress|null find($id, $lockMode = null, $lockVersion = null)
* @method PendingEmailAddress|null findOneBy(array $criteria, array $orderBy = null) * @method PendingEmailAddress|null findOneBy(array $criteria, array $orderBy = null)
...@@ -33,19 +31,12 @@ class PendingEmailAddressRepository extends ServiceEntityRepository ...@@ -33,19 +31,12 @@ class PendingEmailAddressRepository extends ServiceEntityRepository
; ;
} }
/** public function emailIsReserved(string $email): bool
* @return string[]
*/
public function getAllEmails(): array
{ {
$all_pending_email_addresses = $this->findAll(); return $this->createQueryBuilder('p')
$all_emails = []; ->andWhere('p.email = :email')
->setParameter('email', $email)
foreach ($all_pending_email_addresses as $pending_email_address) { ->getQuery()
assertInstanceOf(PendingEmailAddress::class, $pending_email_address); ->getOneOrNullResult() !== null;
$all_emails[] = $pending_email_address->getEmail();
}
return $all_emails;
} }
} }
...@@ -4,8 +4,6 @@ namespace App\Repository; ...@@ -4,8 +4,6 @@ namespace App\Repository;
use App\Entity\User; use App\Entity\User;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\DBAL\Exception;
use Doctrine\DBAL\Exception\DatabaseObjectNotFoundException;
use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException; use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface; use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
...@@ -73,18 +71,12 @@ class UserRepository extends ServiceEntityRepository implements PasswordUpgrader ...@@ -73,18 +71,12 @@ class UserRepository extends ServiceEntityRepository implements PasswordUpgrader
->getResult(); ->getResult();
} }
/** public function emailExists(string $email): bool
* @return string[]
*/
public function getAllEmails(): array
{ {
$all_users = $this->findAll(); return $this->createQueryBuilder('r')
$all_emails = []; ->andWhere('r.email = :email')
->setParameter('email', $email)
foreach ($all_users as $user) { ->getQuery()
$all_emails[] = $user->getEmail(); ->getOneOrNullResult() !== null;
}
return $all_emails;
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment