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

Refacto retrieving email addresses

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