<?php
namespace App\Controller;
use DateTime;
use Exception;
use Dompdf\Dompdf;
use Dompdf\Options;
use App\Entity\User;
use App\Entity\Users;
use App\Entity\Wallet;
use App\Entity\UserOTP;
use App\Form\SignupType;
use App\Entity\ContactUs;
use App\Form\ContactUsType;
use App\Service\OtpService;
use App\Service\AuthService;
use App\Service\MailService;
use App\Service\DocumentService;
use App\Service\ContactUsService;
use App\Exception\CustomException;
use App\Repository\UserRepository;
use App\Repository\UsersRepository;
use App\Repository\ContactUsRepository;
use App\Service\ConfigService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
#[Route('/auth')]
class AuthController extends AbstractController
{
private $entityManager;
private $userRepository;
private $authService;
private $validator;
private $mailService;
public function __construct(EntityManagerInterface $entityManager,
UsersRepository $userRepository,
AuthService $authService,
ValidatorInterface $validator,
MailService $mailService,
private OtpService $otpService,
private DocumentService $documentService,
private TranslatorInterface $translator
)
{
$this->entityManager = $entityManager;
$this->userRepository = $userRepository;
$this->authService = $authService;
$this->validator = $validator;
$this->mailService = $mailService;
}
#[Route('/deconnexion', name: 'app_auth_logout')]
public function logout(): void
{
$this->otpService->removeChangePasswordData();
$this->otpService->removeEmailOtp();
$this->otpService->removeKycData();
$this->otpService->removeSignupData(false);
$this->otpService->removeSignupData(true);
$this->otpService->removeUpdateAccountData();
}
#[Route('/connexion', name: 'app_auth_login')]
public function login(AuthenticationUtils $authenticationUtils): Response
{
if ($this->getUser()) {
if(in_array("ROLE_ADMIN", $this->getUser()->getRoles())){
return $this->redirectToRoute('app_admin_index');
} else if(in_array("ROLE_CLIENT", $this->getUser()->getRoles())){
return $this->redirectToRoute('app_home_index');
}
}
$error = $authenticationUtils->getLastAuthenticationError();
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('auth/login.html.twig', [
'last_username' => $lastUsername,
'error' => $error ? "Votre nom d'utilisateur ou votre mot de passe est invalide." : null,
]);
}
#[Route('/mot_de_passe_oubliee', name: 'app_auth_mot_de_passe_oubliee')]
public function forgotPasseword(AuthenticationUtils $authenticationUtils): Response
{
return $this->render('auth/forgotPassword.html.twig', [
]);
}
#[Route('/formulaire_contact', name: 'app_auth_formulaire_contact')]
public function formulaireContact(Request $request,ContactUsService $contactUsService): Response
{
$contactus= new ContactUs();
$form = $this->createForm(ContactUsType::class, $contactus);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
try {
$contactUsService->addContactUs($contactus);
$this->addFlash('success', $this->translator->trans("Votre message a été transmis avec succès à un administrateur. Veuillez patienter pour recevoir une réponse."));
}
catch (CustomException $ex) {
$this->addFlash(
'danger',
$this->translator->trans($ex->getMessage())
);
} catch (Exception $ex) {
// Gérer toutes les autres exceptions
$this->addFlash(
'danger',
$this->translator->trans($_ENV['ERROR_MESSAGE'])
);
}
}
return $this->render('auth/formulaireContact.html.twig',[
"form" => $form->createView()
]);
}
#[Route('/verification_email', name: 'app_auth_verification_email')]
public function verificationEmail(AuthenticationUtils $authenticationUtils): Response
{
return $this->render('auth/verification_email.html.twig', [
]);
}
#[Route('/nouveau_mot_de_passe', name: 'app_nouveau_mot_de_passe')]
public function nouveauMotDePasse(AuthenticationUtils $authenticationUtils): Response
{
return $this->render('auth/nouveauMotDePasse.html.twig', [
]);
}
#[Route('/inscription/back-office', name: 'app_index_inscription')]
public function signup(Request $request, UserPasswordHasherInterface $passwordHasher): Response
{
$error = null;
$user = new Users();
$form = $this->createForm(SignupType::class, $user, ['signup' => true]);
$uplineUser = $this->userRepository->findOneBy(['id' => $request->request->get('upline')]);
$user->setUpline($uplineUser ?? $this->getUser());
$side_of_team = $request->get('side');
if($side_of_team == Users::GAUCHE || $side_of_team == Users::DROITE){
$user->setSide($side_of_team);
$form->remove('side');
}
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
try {
if(count($this->userRepository->findByNameAndBirthdate($user)) > 0){
throw new CustomException("L'utilisateur existe déjà");
}
$unhashedPassword=$user->getPlainPassword();
$password = $passwordHasher->hashPassword($user, $unhashedPassword);
$user->setPassword($password);
$user->setRoles(["ROLE_CLIENT"]);
$user->setParent($this->getUser());
$errors = $this->validator->validate($user);
if (count($errors) > 0) {
throw new Exception($errors->get(0)->getMessage());
}
$putToTheExtremePosition = ($uplineUser) ? false : true;
$userWithSameNumero = $this->authService->getUserSameNumero($user);
if($userWithSameNumero){
throw new CustomException('Un compte avec les mêmes informations existe déjà');
}
$this->otpService->setSignupData($user, $putToTheExtremePosition, true);
$this->otpService->sendOtp($userWithSameNumero, $user->getEmail(), UserOTP::TYPE_SIGNUP_BACKOFFICE, $user->getName(), $user->getSurname());
return $this->redirectToRoute('app_otp_home', ['operationType' => UserOTP::TYPE_SIGNUP_BACKOFFICE]);
//recuperation du path du logo
// $imagePath = $this->getParameter('kernel.project_dir') . '/public/img/logo.png';
// $this->authService->saveUser($user,$unhashedPassword,$putToTheExtremePosition,$imagePath);
// if(!is_null($uplineUser)){
// return $this->redirectToRoute('app_equipe_binaire', ['username' => $uplineUser->getUsername()]);
// }
// $this->addFlash('success', 'Utilisateur ajouté avec succès');
// return $this->redirectToRoute('app_index_inscription');
}
catch (CustomException $ex) {
$this->addFlash(
'danger',
$this->translator->trans($ex->getMessage())
);
} catch (Exception $ex) {
// Gérer toutes les autres exceptions
$this->addFlash(
'danger',
$this->translator->trans($_ENV['ERROR_MESSAGE'])
);
}
}
return $this->render('inscription/inscription_back_office.html.twig', [
'form' => $form->createView(),
'error' => $error,
'uplineUser' => $uplineUser,
'side' => $side_of_team
]);
}
#[Route('/inscription', name: 'app_mon_lien_inscription')]
public function signupViaMyLink(Request $request, UserPasswordHasherInterface $passwordHasher, ConfigService $configService): Response
{
$parrain_username = $request->get('parrain');
if($parrain_username) {
$parrain_username = $configService->decrypt($parrain_username);
}
$side_of_team = $request->get('side');
$parrain = $this->userRepository->findOneBy(['username' => $parrain_username]);
$error = null;
$user = new Users();
if($parrain && $parrain->getState() == Users::SUSPENDED){
return $this->render('blocked/suspended_account_alert.html.twig');
}
if($parrain){
$user->setParent($parrain);
$user->setUpline($parrain);
}
if($side_of_team == Users::GAUCHE || $side_of_team == Users::DROITE){
$user->setSide($side_of_team);
}
$form = $this->createForm(SignupType::class, $user, ['signup' => true]);
$form->remove('side');
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
try {
if(count($this->userRepository->findByNameAndBirthdate($user)) > 0){
throw new CustomException("L'utilisateur existe déjà");
}
$unhashedPassword=$user->getPlainPassword();
$password = $passwordHasher->hashPassword($user, $unhashedPassword);
$user->setPassword($password);
$user->setRoles(["ROLE_CLIENT"]);
$errors = $this->validator->validate($user);
if (count($errors) > 0) {
throw new Exception($errors->get(0)->getMessage());
}
$userWithSameNumero = $this->authService->getUserSameNumero($user);
$this->otpService->setSignupData($user, true, false);
$this->otpService->sendOtp($userWithSameNumero, $user->getEmail(), UserOTP::TYPE_SIGNUP, $user->getName(), $user->getSurname());
return $this->redirectToRoute('app_otp_home', ['operationType' => UserOTP::TYPE_SIGNUP]);
//recuparation du repertoire du logo
// $imagePath = $this->getParameter('kernel.project_dir') . '/public/img/logo.png';
// $this->authService->saveUser($user,$unhashedPassword,true,$imagePath);
// return $this->redirectToRoute('app_auth_login');
}
catch (CustomException $ex) {
$this->addFlash(
'danger',
$this->translator->trans($ex->getMessage())
);
} catch (Exception $ex) {
// Gérer toutes les autres exceptions
$this->addFlash(
'danger',
$this->translator->trans($_ENV['ERROR_MESSAGE'])
);
}
}
return $this->render('inscription/inscription.html.twig', [
'form' => $form->createView(),
'error' => $error,
'parrain' => $parrain
]);
}
#[Route('/print_condition_utilisation', name: 'app_print_condition_utilisation')]
public function impressionConditionUtilisation(AuthenticationUtils $authenticationUtils): Response
{
$imagePath = $this->getParameter('kernel.project_dir') . '/public/img/logo.png';
// Créer une instance de la classe File
$file = new File($imagePath);
// Vérifier si le fichier existe
if ($file->isFile()) {
// Convertir le contenu du fichier en base64
$fileContent = base64_encode(file_get_contents($file->getPathname()));
}
$date = (new \DateTime())->format('Ymd_His');
$fileName = "Condition_utilisation-".$date.".pdf";
$html = $this->renderView('pdf/condition_utilisation.html.twig', [
'title' => $fileName,
'img'=>$fileContent
]);
$options = new Options();
$options->set('isHtml5ParserEnabled', true);
$options->set('isPhpEnabled', true);
$dompdf = new Dompdf();
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
$response = new Response($dompdf->output());
$response->headers->set('Content-Type', 'application/pdf');
$response->headers->set('Content-Disposition', 'attachment; filename="'.$fileName.'"');
return $response;
}
#[Route('/check-existing-user', name: 'app_auth_check_existing_user', methods:"POST")]
public function checkExistingUser(Request $request): JsonResponse
{
try{
$params = json_decode( $request->getContent(), true);
$user = $this->userRepository->checkExistingUsers($params);
return new JsonResponse(['user' => $user]);
} catch (CustomException $ex) {
return new JsonResponse(['message' => $ex->getMessage()], 500);
} catch (Exception $ex) {
return new JsonResponse(['message' => $_ENV['ERROR_MESSAGE']], 500);
}
}
#[Route('/back-office/condition-utilisation/{type}', name: 'app_show_document')]
public function showDocumentBackOffice(int $type): Response
{
$user = $this->getUser();
return $this->render('term_condition/show_document_backoffice.html.twig',[
'user' => $user,
'type' => $type
]);
}
#[Route('/condition-utilisation/{type}', name: 'app_show_document_signupbylink')]
public function showDocument(int $type): Response
{
$user = $this->getUser();
return $this->render('term_condition/show_document.html.twig',[
'user' => $user,
'type' => $type
]);
}
#[Route('/condition-utilisation/pdf/{type}', name: 'app_document_preview')]
public function getDocument(int $type,Request $request) : Response
{
$COMPRESSED_STATE = 0;
$locale = $request->getLocale();
$locale = $locale ?? 'fr';
$file = $this->documentService->getFileDocument( $this->getParameter('files_directory'),$type,$COMPRESSED_STATE,$locale);
// Create a BinaryFileResponse object
$response = new BinaryFileResponse($file['filePath']);
// Set response headers
$response->headers->set('Content-Type', 'application/pdf');
return $response;
}
#[Route('/condition-utilisation/download/pdf/{type}', name: 'app_download_document')]
public function downloadDocument(int $type,Request $request)
{
$locale = $request->getLocale();
$locale = $locale ?? 'fr';
$NOT_COMPRESSED_STATE = 1;
$file = $this->documentService->getFileDocument( $this->getParameter('files_directory'),$type,$NOT_COMPRESSED_STATE,$locale);
// Create a BinaryFileResponse object
$response = new BinaryFileResponse($file['filePath']);
// Set response headers
$response->setContentDisposition(
'attachment',
$file['filename']
);
return $response;
}
#[Route('/condition-utilisation/sendmail/pdf/{type}', name: 'app_send_document')]
public function sendDocument(Request $request,int $type,Security $security)
{
$locale = $request->getLocale();
$locale = $locale ?? 'fr';
try {
$email = $request->get('email');
$NOT_COMPRESSED_STATE = 1;
$this->documentService->sendDocument( $email,$this->getParameter('files_directory'),$type,$NOT_COMPRESSED_STATE,$locale);
$this->addFlash('success_message', 'Document envoyé avec succès');
}catch (CustomException $ex) {
$this->addFlash(
'error_message',
$this->translator->trans($ex->getMessage())
);
} catch (Exception $ex) {
// Gérer toutes les autres exceptions
$this->addFlash(
'error_message',
$this->translator->trans($_ENV['ERROR_MESSAGE'])
);
}
if ($security->getUser()){
return $this->redirectToRoute('app_show_document',["type" => $type]);
}
else{
return $this->redirectToRoute('app_show_document_signupbylink',["type" => $type]);
}
}
}