<?php
namespace App\Controller;
use App\Entity\User;
use App\Form\UserType;
use App\Form\UserFilesType;
use App\Repository\UserRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\String\Slugger\SluggerInterface;
use Symfony\Component\Mailer\MailerInterface;
use App\Factory\Email;
use MailerSend\MailerSend;
use MailerSend\Helpers\Builder\Recipient;
use MailerSend\Helpers\Builder\EmailParams;
#[Route('/user')]
class UserController extends AbstractController
{
private MailerInterface $mailer;
private Email $email;
private UserPasswordHasherInterface $userPasswordHasher;
public function __construct(MailerInterface $mailer, Email $email, UserPasswordHasherInterface $userPasswordHasher)
{
$this->mailer = $mailer;
$this->email = $email;
$this->userPasswordHasher = $userPasswordHasher;
}
#[Route('/', name: 'app_user_index', methods: ['GET'])]
public function index(UserRepository $userRepository): Response
{
return $this->render('user/index.html.twig', [
'users' => $userRepository->findAdminUser(),
]);
}
#[Route('/new', name: 'app_user_new', methods: ['GET', 'POST'])]
public function new(
Request $request,
UserRepository $userRepository,
UserAuthenticatorInterface $userAuthenticator,
SluggerInterface $slugger
): Response {
$user = new User();
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$role = [$form->get('roles')->getData()];
$username = $form->get('email')->getData();
$user->setRoles($role[0]);
$password = $this->updatePassword($user);
$userRepository->save($user, true);
$this->createCompte($username, $password);
return $this->redirectToRoute(
'app_user_index',
[],
Response::HTTP_SEE_OTHER
);
}
$new = 1;
return $this->renderForm('user/new.html.twig', [
'user' => $user,
'form' => $form,
'new' => $new,
]);
}
public function updatePassword($user)
{
$comb =
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$shfl = str_shuffle($comb);
$password = substr($shfl, 0, 8);
$user->setPassword(
$this->userPasswordHasher->hashPassword($user, $password)
);
return $password;
}
public function createAccount($username, $password){
$TEMPLATE_CONTACT = 'user/compte.html.twig';
$parameters = [
'username' => $username,
'password' => $password,
];
$email = $this->email->create(
'no-reply@iaa-tunisie.tn',
[$username],
'Création de compte',
$TEMPLATE_CONTACT,
$parameters
);
$this->mailer->send($email);
}
#[Route('/initialise/{id}', name: 'app_user_initilise_account', methods: ['GET', 'POST'])]
public function initialise(Request $request, User$user, UserRepository $userRepository): Response
{
$user->setEtatActivation(1);
$password = $this->updatePassword($user);
$userRepository->save($user, true);
$this->createAccount($user->getUsername(), $password);
return $this->redirectToRoute(
'app_candidat_index',
[],
Response::HTTP_SEE_OTHER
);
}
#[Route('/{id}', name: 'app_user_show', methods: ['GET'])]
public function show(User $user): Response
{
return $this->render('user/show.html.twig', [
'user' => $user,
]);
}
#[Route('/{id}/edit', name: 'app_user_edit', methods: ['GET', 'POST'])]
public function edit(
Request $request,
User $user,
UserRepository $userRepository,
SluggerInterface $slugger,
UserPasswordHasherInterface $userPasswordHasher
): Response {
$form = $this->createForm(UserType::class, $user);
$form->remove('plainPassword');
$form->remove('username');
$form->remove('email');
$form->remove('photoDeProfilFile');
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$role = [$form->get('roles')->getData()];
$user->setRoles($role[0]);
$userRepository->save($user, true);
return $this->redirectToRoute(
'app_user_index',
[],
Response::HTTP_SEE_OTHER
);
}
$new = 0;
return $this->renderForm('user/edit.html.twig', [
'user' => $user,
'form' => $form,
'new' => $new,
]);
}
#[Route('/editprofil', name: 'app_user_editprofil', methods: ['GET', 'POST'])]
public function editprofil(
Request $request,
UserRepository $userRepository,
): JsonResponse {
$user = $this->getUser();
$user->setCivilite($request->request->get('civilite'));
$user->setNom($request->request->get('nom'));
$user->setPrenom($request->request->get('prenom'));
$user->setAdresse($request->request->get('adresse'));
$user->setCodePostal($request->request->get('codePostal'));
$user->setville($request->request->get('ville'));
$user->setTel($request->request->get('tel'));
$user->setEmail($request->request->get('email'));
$user->setDateNaissance($request->request->get('dateNaissance'));
$userRepository->save($user, true);
return new JsonResponse(['response' => "ok"]);
}
#[Route('/{id}/modifier-photo-de-profil', name: 'app_modifier_photo_de_profil', methods: ['GET', 'POST'])]
public function modifierPhotoDeProfil(
Request $request,
User $user,
UserRepository $userRepository,
SluggerInterface $slugger,
UserPasswordHasherInterface $userPasswordHasher
): JsonResponse {
$form = $this->createForm(UserFilesType::class, new user());
$form->handleRequest($request);
$newFilename = "";
if (1) {
$photoDeProfilFile = $request->files->get('photoDeProfilFile');
if ($photoDeProfilFile) {
$originalFilename = pathinfo($photoDeProfilFile->getClientOriginalName(), PATHINFO_FILENAME);
// this is needed to safely include the file name as part of the URL
$safeFilename = $slugger->slug($originalFilename);
$newFilename = $safeFilename . '-' . uniqid() . '.' . $photoDeProfilFile->guessExtension();
// Move the file to the directory where brochures are stored
try {
$destinationUrl = $this->getParameter('kernel.project_dir') . '/public/uploads/user/photo';
$photoDeProfilFile->move(
$destinationUrl,
$newFilename
);
} catch (FileException $e) {
// ... handle exception if something happens during file upload
}
// updates the 'photoDeProfilFilename' property to store the PDF file name
// instead of its contents
$user->setPhotoDeProfil($newFilename);
}
$userRepository->save($user, true);
}
return new JsonResponse(['response' => $newFilename]);
}
#[Route('/{id}/reset-password', name: 'app_user_reset-password', methods: ['GET', 'POST'])]
public function resetPassword(
Request $request,
User $user,
UserRepository $userRepository,
SluggerInterface $slugger,
UserPasswordHasherInterface $userPasswordHasher
): Response {
$TEMPLATE_CONTACT = 'user/reset-password.html.twig';
$comb =
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$shfl = str_shuffle($comb);
$password = substr($shfl, 0, 8);
$parameters = [
'username' => $user->getEmail(),
'password' => $password,
];
$email = $this->email->create(
'contact@iaa-tunisie.tn',
[$user->getEmail(),'helmi.mattoussi@gmail.com'],
'Initialisation de mot de passe',
$TEMPLATE_CONTACT,
$parameters
);
$this->mailer->send($email);
$user->setPassword($userPasswordHasher->hashPassword($user, $password));
$userRepository->save($user, true);
return $this->redirectToRoute(
'app_user_index',
[],
Response::HTTP_SEE_OTHER
);
}
#[Route('/{id}/aa', name: 'app_user_inscription', methods: ['GET', 'POST'])]
public function attestation(
Request $request,
User $user,
UserRepository $userRepository,
SluggerInterface $slugger,
): Response {
$TEMPLATE_CONTACT = 'user/attestation-inscription.html.twig';
$parameters = [];
$email = $this->email->create(
'contact@iaa-tunisie.tn',
[$user->getEmail()],
'Changement du mot de passe',
$TEMPLATE_CONTACT,
$parameters
);
$this->mailer->send($email);
$userRepository->save($user, true);
return $this->redirectToRoute(
'app_user_index',
[],
Response::HTTP_SEE_OTHER
);
}
#[Route('/{id}', name: 'app_user_delete', methods: ['POST'])]
public function delete(
Request $request,
User $user,
UserRepository $userRepository
): Response {
if (
$this->isCsrfTokenValid(
'delete' . $user->getId(),
$request->request->get('_token')
)
) {
$userRepository->remove($user, true);
}
return $this->redirectToRoute(
'app_user_index',
[],
Response::HTTP_SEE_OTHER
);
}
#[Route('/{id}/modifier-mot-de-passe', name: 'app_modifier_mot_de_passe', methods: ['GET', 'POST'])]
public function modidierMotDePasse(
User $user,
UserRepository $userRepository,
UserPasswordHasherInterface $userPasswordHasher
): JsonResponse {
$TEMPLATE_CONTACT = 'user/reset-password.html.twig';
$comb =
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$shfl = str_shuffle($comb);
$password = substr($shfl, 0, 8);
$parameters = [
'username' => $user->getEmail(),
'password' => $password,
];
$email = $this->email->create(
'contact@iaa-tunisie.tn',
[$user->getEmail(),'helmi.mattoussi@gmail.com'],
htmlentities('Changement du mot de passe'),
$TEMPLATE_CONTACT,
$parameters
);
$this->mailer->send($email);
$user->setPassword($userPasswordHasher->hashPassword($user, $password));
$userRepository->save($user, true);
return new JsonResponse(['response' => "ok"]);
}
}