<?php
namespace App\Controller;
use Algolia\SearchBundle\IndexManagerInterface;
use App\Entity\Contenu;
use AlgoliaSearch\AlgoliaException;
use App\Entity\Contribution;
use App\Entity\MatierePedagoOpt;
use App\Entity\Onglet;
use App\Entity\User;
use App\Repository\OngletRepository;
use App\Service\ActualiteService;
use App\Service\AlgoliaService;
use App\Service\ContenuService;
use App\Service\ContributionService;
use App\Service\EtablissementService;
use App\Service\FileUploader;
use App\Service\ForumService;
use App\Service\MailService;
use App\Service\MessageService;
use App\Service\NewsletterService;
use App\Service\OngletService;
use App\Service\TopicService;
use App\Service\TutelleService;
use App\Service\UserService;
use App\Service\UtilService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Zend\Code\Scanner\Util;
class AccueilController extends AbstractController
{
/**
* @Route("/", name="accueil")
*/
public function index(OngletService $ongletService,
ContributionService $contributionService,
UserService $userService,
ActualiteService $actualiteService,
ContenuService $contenuService){
$contributions = $contributionService->getRepository()->findBy(['status' => 'Accepté'], ['creation_date' => 'desc'], 4);
$premierContributeur = $userService->getRepository()->findPremierContributeur();
$meilleurLecteur = $userService->getRepository()->findMeilleurLecteur();
$meilleurCommentateur = $userService->getRepository()->findMeilleurCommentateur();
$user = $this->getUser();
$actualites = $actualiteService->getAutresActualites($user ? null : true);
$dossier = $actualiteService->getDossierDuMois();
$evenements = $actualiteService->getEvenementsEncart();
$sliders = $contenuService->getSliders('accueil');
if ($this->isGranted('ROLE_USER')) {
return $this->render('accueil/private.html.twig', [
'onglets' => $ongletService->getOnglets(),
'contributions' => $contributions,
'premierContributeur' => $premierContributeur,
'meilleurLecteur' => $meilleurLecteur,
'meilleurCommentateur' => $meilleurCommentateur,
'actualites' => $actualites,
'dossier' => $dossier,
'evenements' => $evenements,
'sliders' => $sliders,
]);
}
else {
return $this->render('accueil/public.html.twig', [
'onglets' => $ongletService->getOnglets(),
'actualites' => $actualites,
'dossier' => $dossier,
'about_us_page' => $this->getDoctrine()->getRepository(Contenu::class)->find(1),
'sliders' => $sliders,
]);
}
}
/**
* @Route("/ajax/jaime", name="jaime")
*/
public function jaime(Request $request, MessageService $messageService) {
if (!$this->isGranted('ROLE_USER')) return new JsonResponse([]);
$user = $this->getUser();
if (!$user) return new JsonResponse([]);
$res = [];
$methode = strtolower($request->getMethod());
if ($methode === 'post') {
$donnees = $request->request->all();
$messageId = $donnees['idMessage'] ?? 0;
$retour = $messageService->jaime($messageId, $user);
if (\is_string($retour)) $res['error'] = $retour;
else {
$res['likes'] = $retour->getLikes();
$res['jaime'] = \in_array($user->getId(), $res['likes']);
}
}
return new JsonResponse($res);
}
/**
* @Route("/ajax/japplique", name="japplique")
*/
public function japplique(Request $request, MessageService $messageService) {
if (!$this->isGranted('ROLE_USER')) return new JsonResponse([]);
$user = $this->getUser();
if (!$user) return new JsonResponse([]);
$res = [];
$methode = strtolower($request->getMethod());
if ($methode === 'post') {
$donnees = $request->request->all();
$messageId = $donnees['idMessage'] ?? 0;
$retour = $messageService->japplique($messageId, $user);
if (\is_string($retour)) $res['error'] = $retour;
else {
$res['applys'] = $retour->getApplys();
$res['japplique'] = \in_array($user->getId(), $res['applys']);
}
}
return new JsonResponse($res);
}
/**
* @Route("/ajax/signaler", name="signaler")
*/
public function signaler(Request $request, MessageService $messageService) {
if (!$this->isGranted('ROLE_USER')) return new JsonResponse([]);
$user = $this->getUser();
if (!$user) return new JsonResponse([]);
$res = [];
$methode = strtolower($request->getMethod());
if ($methode === 'post') {
$donnees = $request->request->all();
$messageId = $donnees['idMessage'] ?? 0;
$retour = $messageService->signaler($messageId, $user);
if (\is_string($retour)) $res['error'] = $retour;
else {
$res['reports'] = $retour->getReports();
$res['signaler'] = \in_array($user->getId(), $res['reports']);
}
}
return new JsonResponse($res);
}
/**
* @Route("/ajax/favoriser", name="favoriser")
*/
public function favoris(Request $request, ContributionService $contributionService) {
if (!$this->isGranted('ROLE_USER')) return new JsonResponse([]);
$user = $this->getUser();
if (!$user) return new JsonResponse([]);
$res = [];
$methode = strtolower($request->getMethod());
if ($methode === 'post') {
$donnees = $request->request->all();
$id = $donnees['id'] ?? 0;
$retour = $contributionService->favoriser($id, $user);
if (\is_string($retour)) $res['error'] = $retour;
else {
$res['favoris'] = $retour->getFavoris();
$res['favorise'] = \in_array($id, $res['favoris']);
}
}
return new JsonResponse($res);
}
/**
* @Route("/inscription", name="inscription")
*/
public function inscription(Request $request, MailService $mailService, UserService $userService, OngletService $ongletService, TutelleService $tutelleService, EtablissementService $etablissementService, NewsletterService $newsletterService) {
$optRepository = $this->getDoctrine()->getRepository(MatierePedagoOpt::class);
$matiereOpts = $optRepository->findBy(['category' => 'matiere']);
$pedagogieOpts = $optRepository->findBy(['category' => 'pedagogie']);
$methode = strtolower($request->getMethod());
$erreurs = [];
$donnees = [];
$tutelles = $tutelleService->getNames();
$etablissements = $etablissementService->getNames();
$etablissementsListe = $etablissementService->getRepository()->findAll();
if ($methode === 'post') {
$donnees = $request->request->all();
$user = $userService->getRepository()->findBy(['email' => trim($donnees['f_email'] ?? '')]);
if ($user) {
$erreurs['f_email'] = 'Un utilisateur existe déjà pour cette adresse mail.';
}
// Si on vient de la page login
if (isset($donnees['login'])) {
return $this->render('accueil/inscription.html.twig', [
'onglets' => $ongletService->getOnglets(),
'erreurs' => $erreurs,
'donnees' => $donnees,
'tutelles' => $tutelles,
'etablissements' => $etablissements,
'etablissementsListe' => $etablissementsListe,
'matiereOpts' => $matiereOpts,
'pedagogieOpts' => $pedagogieOpts,
]);
}
$erreurs = $userService->valideUser($donnees);
// Inscription
$res = null;
if (empty($erreurs)) {
$etablissement = $etablissementService->getRepository()->find($donnees['f_etablissement']);
$tutelle = $tutelleService->getRepository()->find($donnees['f_tutelle']);
$res = $userService->save([
'email' => $donnees['f_email'],
'roles' => $donnees['roles'],
'password' => $donnees['f_pass'],
'prenom' => $donnees['f_fname'],
'nom' => $donnees['f_name'],
'activite' => $donnees['f_activite'],
'centreInteret' => $donnees['f_centre'],
'disciplines' => $donnees['f_discipline'] ?? null,
'niveau' => $donnees['f_niveau'] ?? null,
'avatar' => '',
'status' => 'enattente',
'phoneNumber' => null,
'etablissement' => $etablissement,
'tutelle' => $tutelle,
], true);
if (\is_string($res)) {
$erreurs['f_global'] = $res;
}
else {
if (!empty($donnees['f_newsletter'])) $newsletterService->inscrire($donnees['f_email'], $donnees['f_fname'], $donnees['f_name']);
}
}
if (empty($erreurs)) {
$urlAccepter = $this->generateUrl('admin_utilisateur_gestion', ['gestion' => 'accepter', 'id' => $res->getId()], UrlGeneratorInterface::ABSOLUTE_URL);
$urlRefuser = $this->generateUrl('admin_utilisateur_gestion', ['gestion' => 'refuser', 'id' => $res->getId()], UrlGeneratorInterface::ABSOLUTE_URL);
$mailService->mailAdmin('Nouvel utilisateur inscrit',
'mail/nouvelle_inscription.html.twig',
[
'user' => $res,
'urlAccepter' => $urlAccepter,
'urlRefuser' => $urlRefuser,
'matiereOpts' => $matiereOpts,
'pedagogieOpts' => $pedagogieOpts,
],
true
);
return $this->redirectToRoute('inscrit');
}
}
return $this->render('accueil/inscription.html.twig', [
'onglets' => $ongletService->getOnglets(),
'erreurs' => $erreurs,
'donnees' => $donnees,
'tutelles' => $tutelles,
'etablissements' => $etablissements,
'etablissementsListe' => $etablissementsListe,
'matiereOpts' => $matiereOpts,
'pedagogieOpts' => $pedagogieOpts,
]);
}
/**
* @Route("/inscrit", name="inscrit")
*/
public function inscrit(OngletService $ongletService) {
return $this->render('accueil/inscrit.html.twig', [
'onglets' => $ongletService->getOnglets(),
]);
}
/**
* @Route("/nouveau_mdp", name="nouveau_mdp")
*/
public function nouveau_mdp(OngletService $ongletService) {
return $this->render('accueil/nouveau_mdp.html.twig', [
'onglets' => $ongletService->getOnglets(),
]);
}
/**
* @Route("/ajax/popup-pass", name="popup_pass")
*/
public function popup_pass() {
return $this->render('popup/popup-pass.html.twig', [
]);
}
/**
* @Route("/ajax/popup-supprimer", name="popup_supprimer")
*/
public function popup_supprimer() {
return $this->render('popup/popup-supprimer.html.twig', [
]);
}
/**
* @Route("/ajax/popup-supprimer-confirmer", name="popup_supprimer_confirmer")
*/
public function popup_supprimer_confirmer() {
return $this->render('popup/popup-supprimer-confirmer.html.twig', [
]);
}
/**
* @Route("/reinit_mdp/{token}", name="reinit_mdp")
*/
public function reinit_mdp(Request $request, $token, OngletService $ongletService, UserService $userService) {
$user = $userService->getRepository()->findOneBy(['token' => $token]);
if (!$user) throw new NotFoundHttpException('Token invalide.');
$methode = strtolower($request->getMethod());
$erreurs = [];
$donnees = [];
if ($methode === 'post') {
$donnees = $request->request->all();
$f_pass_err = UtilService::validerMDP($donnees['f_pass'] ?? '');
if ($f_pass_err !== true) $erreurs['f_pass'] = $f_pass_err;
$f_pass_err = UtilService::validerMDP($donnees['f_pass1'] ?? '');
if ($f_pass_err !== true) $erreurs['f_pass'] = $f_pass_err;
if (empty($erreurs)) {
if ($donnees['f_pass'] !== $donnees['f_pass1']) {
$erreurs['f_pass'] = 'Les mots de passe entrés ne sont pas identiques.';
}
}
if (empty($erreurs)) {
$res = $userService->save([
'id' => $user->getId(),
'password' => $donnees['f_pass'],
]);
if (\is_string($res)) {
$erreurs['f_global'] = $res;
}
else {
return $this->redirectToRoute('nouveau_mdp');
}
}
}
return $this->render('accueil/reinit_mdp.html.twig', [
'onglets' => $ongletService->getOnglets(),
'erreurs' => $erreurs,
'donnees' => $donnees,
]);
}
/**
* @Route("/ajax/mdpoublie", name="mdpoublie")
*/
public function mdpoublie(Request $request, UserService $userService, MailService $mailService) {
$methode = strtolower($request->getMethod());
if ($methode === 'post') {
$donnees = $request->request->all();
$email = trim($donnees['f_mail-pass'] ?? '');
if (!$email || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
return new JsonResponse([
'erreur' => 'Email invalide.'
]);
}
$user = $userService->findOneByInscrit(['email' => $email]);
if (!$user) {
return new JsonResponse([
'erreur' => 'Le compte est introuvable ou désactivé.'
]);
}
$token = UtilService::token();
$user->setToken($token);
$userService->update($user);
$url = $this->generateUrl('reinit_mdp', ['token' => $token], UrlGeneratorInterface::ABSOLUTE_URL);
$mailService->mail(
$user->getEmail(),
'Réinitialisation de mot de passe',
'mail/reinit_mdp.html.twig',
[
'user' => $user,
'url' => $url,
],
true
);
return new JsonResponse([
'succes' => 'Un email vous a été envoyé.'
]);
}
return new JsonResponse([
'erreur' => 'Email invalide.'
]);
}
/**
* @Route("/ajax/demande-suppression", name="demande_suppression")
*/
public function demande_suppression(Request $request, UserService $userService) {
$user = $this->getUser();
if (!$user) return new JsonResponse(['erreur' => 'Utilisateur invalide.']);
$methode = strtolower($request->getMethod());
if ($methode === 'post') {
$userService->save([
'id' => $user->getId(),
'status' => 'inscrit_demande_supprimer'
]);
return new JsonResponse([
'succes' => true
]);
}
return new JsonResponse([
'erreur' => 'Méthode invalide.'
]);
}
/**
* @Route("/moncompte", name="moncompte")
*/
public function moncompte(Request $request,
OngletService $ongletService,
TutelleService $tutelleService,
EtablissementService $etablissementService,
UserService $userService,
FileUploader $fileUploader,
TopicService $topicService,
ForumService $forumService
) {
$optRepository = $this->getDoctrine()->getRepository(MatierePedagoOpt::class);
$matiereOpts = $optRepository->findBy(['category' => 'matiere']);
$pedagogieOpts = $optRepository->findBy(['category' => 'pedagogie']);
$user = $this->getUser();
if (!$user) throw new AccessDeniedException();
$tutelles = $tutelleService->getNames();
$etablissements = $etablissementService->getNames();
$etablissementsListe = $etablissementService->getRepository()->findAll();
$erreurs = [];
$succes = '';
$methode = strtolower($request->getMethod());
if ($methode === 'post') {
$donnees = $request->request->all();
$files = $request->files->all();
$fileInfo = null;
$donnees['roles'] = $user->getRoles();
if (!empty($donnees['f_avatar_preset'])) {
$donnees['f_avatar'] = $donnees['f_avatar_preset'];
$files['f_avatar'] = null;
}
if (!empty($files['f_avatar'])) {
$erreur = $fileUploader->validateFile($files['f_avatar'] ?? null, 'avatar');
if ($erreur) $erreurs['f_avatar'] = $erreur;
}
if (empty($erreurs) && !empty($files['f_avatar'])) {
$uid = uniqid();
$fileInfo = $fileUploader->uploadFile($files['f_avatar'], $uid, 'avatar');
if ($fileInfo !== null && !$fileInfo['error']) {
$fileInfo = 'avatar/' . $uid . '/' . $fileInfo['fileName'];
$donnees['f_avatar'] = $fileInfo;
}
else {
$erreurs['f_message'] = $fileInfo['error'];
}
}
if (empty($erreurs)) $erreurs = $userService->valideUser($donnees, ['f_pass', 'f_conditions']);
if (empty($erreurs)) {
// $etablissement = $etablissementService->getRepository()->find($donnees['f_etablissement']);
// $tutelle = $tutelleService->getRepository()->find($donnees['f_tutelle']);
$save = [
'id' => $user->getId(),
'avatar' => $donnees['f_avatar'] ?? '',
'email' => $donnees['f_email'],
'roles' => $donnees['roles'],
'password' => $donnees['f_pass'],
'prenom' => $donnees['f_fname'],
'nom' => $donnees['f_name'],
// 'activite' => $donnees['f_activite'],
'centreInteret' => $donnees['f_centre'],
'disciplines' => $donnees['f_discipline'] ?? null,
'niveau' => $donnees['f_niveau'] ?? null,
// 'etablissement' => $etablissement,
// 'tutelle' => $tutelle,
];
if (empty($donnees['f_pass'])) unset($save['password']);
if (empty($files['f_avatar']) && empty($donnees['f_avatar_preset'])) unset($save['avatar']);
$res = $userService->save($save);
if (\is_string($res)) {
$erreurs['f_global'] = $res;
} else {
$user = $res;
$succes = 'Votre compte a bien été modifié.';
}
}
}
return $this->render('accueil/moncompte.html.twig', [
'onglets' => $ongletService->getOnglets(),
'user' => $user,
'tutelles' => $tutelles,
'etablissements' => $etablissements,
'etablissementsListe' => $etablissementsListe,
'erreurs' => $erreurs,
'succes' => $succes,
'matiereOpts' => $matiereOpts,
'pedagogieOpts' => $pedagogieOpts,
]);
}
/**
* @Route("/mescontributions", name="mescontributions")
*/
public function mescontributions(Request $request,
OngletService $ongletService,
UserService $userService,
ContributionService $contributionService
) {
$user = $this->getUser();
if (!$user) throw new AccessDeniedException();
$contributions = $contributionService->getRepository()->findBy(['user' => $user], ['creation_date' => 'desc']);
return $this->render('accueil/mescontributions.html.twig', [
'onglets' => $ongletService->getOnglets(),
'contributions' => $contributions,
'user' => $user,
]);
}
/**
* @Route("/mesfavoris", name="mesfavoris")
*/
public function mesfavoris(Request $request,
OngletService $ongletService,
UserService $userService,
ContributionService $contributionService
) {
$user = $this->getUser();
if (!$user) throw new AccessDeniedException();
$contributions = $contributionService->getContributionsInStatusInIds(['Accepté'], $user->getFavoris() ?? []);
return $this->render('accueil/mesfavoris.html.twig', [
'onglets' => $ongletService->getOnglets(),
'contributions' => $contributions,
'user' => $user,
]);
}
/**
* @Route("/ajax/inscrire_newsletter", name="inscrire_newsletter")
*/
public function inscrire_newsletter(Request $request, NewsletterService $newsletterService, UserService $userService) {
$methode = strtolower($request->getMethod());
if ($methode === 'post') {
$email = $request->request->get('email') ?? null;
if (!$email) return new JsonResponse([
'erreur' => 'Email vide.'
]);
if (!filter_var($email, FILTER_VALIDATE_EMAIL))return new JsonResponse([
'erreur' => 'Email invalide.'
]);
$user = $userService->findOneByInscrit(['email' => $email]);
$res = $newsletterService->inscrire($email, $user ? $user->getPrenom() : '', $user ? $user->getNom() : '');
if ($res) return new JsonResponse([
'erreur' => $res
]);
return new JsonResponse([
'succes' => true
]);
}
return new JsonResponse([
'erreur' => 'Méthode invalide.'
]);
}
/**
* @Route("/cgu", name="cgu")
*/
public function cgu(OngletService $ongletService) {
return $this->render('accueil/cgu.html.twig', [
'onglets' => $ongletService->getOnglets(),
]);
}
/**
* @Route("/mentionslegales", name="mentionslegales")
*/
public function mentionslegales(OngletService $ongletService) {
return $this->render('accueil/mentionslegales.html.twig', [
'onglets' => $ongletService->getOnglets(),
]);
}
/**
* @Route("/charte", name="charte")
*/
public function charte(OngletService $ongletService) {
return $this->redirectToRoute('cgu');
return $this->render('accueil/charte.html.twig', [
'onglets' => $ongletService->getOnglets(),
]);
}
/**
* @Route("/ajax/chercher", name="chercher")
*/
public function chercher(Request $request, AlgoliaService $algoliaService) {
$methode = strtolower($request->getMethod());
if ($methode === 'post') {
$valeur = $request->request->get('valeur') ?? null;
$res = $algoliaService->algoliaChercher($valeur);
return new JsonResponse([
'resultat' => $res['resultat'],
'temps' => $res['temps'],
'succes' => true,
]);
}
return new JsonResponse([
'erreur' => 'Méthode invalide.'
]);
}
/**
* @Route("/recherche/{valeur}/{page}", name="recherche",
* defaults={"valeur"="", "page"=""})
*/
public function recherche($valeur, $page, Request $request, AlgoliaService $algoliaService, OngletService $ongletService) {
$methode = strtolower($request->getMethod());
if ($methode === 'post') {
$valeur = $request->request->get('valeur') ?? null;
return $this->redirectToRoute('recherche', ['valeur' => $valeur, 'page' => '']);
}
$resultat = ['nbHits' => 0, 'nbPages' => 0, 'page' => 1];
$page = (int)$page;
if ($page <= 0) $page = 1;
if ($valeur) {
try {
$res = $algoliaService->algoliaChercher($valeur, $page, 40);
$resultat = $res['resultat'];
} catch (AlgoliaException $e) {
dump($e);
}
}
return $this->render('accueil/recherche.html.twig', [
'onglets' => $ongletService->getOnglets(),
'resultat' => $resultat,
'valeur' => $valeur
]);
}
/**
* @Route("/desinscrire_newsletter/{email}", name="desinscrire_newsletter")
*/
public function desinscrire_newsletter($email, Request $request, OngletService $ongletService, NewsletterService $newsletterService)
{
if (!$email)
return new JsonResponse(['erreur' => 'Email vide.']);
$res = $newsletterService->deinscrire($email);
return $this->render('accueil/desinscription.html.twig', [
'onglets' => $ongletService->getOnglets(),
'succes' => !\is_string($res),
'erreur' => $res,
'email' => $email,
]);
}
}