<?php
namespace App\Controller;
use App\Entity\Contribution;
use App\Entity\Etablissement;
use App\Entity\Formation;
use App\Entity\Log;
use App\Entity\Message;
use App\Entity\Topic;
use App\Entity\Tutelle;
use App\Service\ContributionService;
use App\Service\EtablissementService;
use App\Service\FileUploader;
use App\Service\LogService;
use App\Service\MessageService;
use App\Service\OngletService;
use App\Service\TopicService;
use App\Service\TutelleService;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\Validator\Constraints\File;
use Symfony\Component\Validator\Constraints\Image;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Validation;
class EtablissementController extends AbstractController
{
/**
* @Route("/tutelle/{id}", name="tutelle_view",
* requirements={ "id"="^[0-9]*$" },
* defaults={ "id"="" }
* )
* @Security("is_granted('ROLE_CHEF') or is_granted('ROLE_TUTELLE')",
* message="Vous devez être connecté pour accéder à cette page")
*/
public function viewTutelle($id, Request $request, OngletService $ongletService,
FileUploader $fileUploader, TopicService $topic_service, LogService $logService, ContributionService $contributionService, MessageService $messageService)
{
$user = $this->getUser();
$etablissement = $user->getEtablissement() ?? null;
$tutelle = null;
if (!empty($id)) {
if ($this->isGranted('ROLE_ADMIN'))
$tutelle = $this->getDoctrine()->getRepository(Tutelle::class)->find($id) ?? null;
else {
// return $this->redirectToRoute('tutelle_view', ['id' => $id]);
}
}
else {
$tutelle =
($etablissement ? $etablissement->getTutelle() : null) ??
($user ? $user->getTutelle() : null) ??
null;
}
if ($tutelle === null) {
return $this->redirectToRoute('etablissement_view');
}
// Contribution Sidebar ////////////////////////////////////////////////////////////////////////////////////////////
$contribution_panel = $contributionService->getConsulteesEtConseillees($user, $tutelle, $etablissement, 2, 4, 4);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if ($request->isMethod('POST') && $user) {
$em = $this->getDoctrine()->getManager();
$form_data = $request->headers->get('Content-Type') === 'application/json' ?
json_decode($request->getContent(), true) : $request->request->all();
$validator = Validation::createValidator();
//dump($request->request->all());
//dump($request->files->all());
switch ($form_data['submit_action']) {
case 'message_add':
$message_text = $form_data['message'] ?? null;
if ($validator->validate($message_text, [new NotBlank()])->has(0)) {
$message_error = 'Ce champ ne peut être vide.';
break;
}
$message = new Message();
$message->setText($message_text);
$message->setPublishDate(new \DateTime('now'));
$message->setLikes([]);
$message->setApplys([]);
$message->setReports([]);
$message->setActive(true);
$message->setTutelle($tutelle);
$message->setUser($user);
$em->persist($message);
$em->flush();
$messageService->algoliaMaj($message);
if ($request->files->has('file')) {
if ($validator->validate($request->files->get('file'), [new File(['maxSize' => '16384k'])])->has(0)) {
$message_error = 'Le fichier est invalide ou supérieur à 16 Mo.';
break;
}
$file = $request->files->get('file');
$upload_result = $fileUploader->uploadFile($file, $message->getId(), 'message');
if (!$upload_result['error']) {
$message->setFile($upload_result['fileName']);
$em->persist($message);
$em->flush();
}
else {
$message_error = 'Une erreur inattendue est survenue.';
$em->remove($message);
$em->flush();
break;
}
}
return $this->redirectToRoute('tutelle_view', ['id' => $id]);
case 'file_upload':
if ($request->files->has('file') && !$validator->validate($request->files->get('file'), new File(['maxSize' => '16384k']))->has(0)) {
$file = $request->files->get('file');
$upload_result = $fileUploader->uploadFile($file, $tutelle->getId(), 'tutelle');
//dump($upload_result);
if (!$upload_result['error']) {
$tutelle_files = $tutelle->getFiles() ?? [];
$tutelle_files[] = $upload_result['fileName'];
$tutelle->setFiles(array_values($tutelle_files));
$em->persist($tutelle);
$em->flush();
}
}
return $this->redirectToRoute('tutelle_view', ['id' => $id]);
case 'file_remove':
$tutelle_files = $tutelle->getFiles() ?? [];
if ($fileUploader->deleteFile($form_data['file_name'], $tutelle->getId(), 'tutelle')) {
$tutelle->setFiles( array_values(array_filter(
$tutelle_files,
function($val) use(&$form_data) {return $form_data['file_name'] !== $val;}))
);
$em->persist($tutelle);
$em->flush();
}
return $this->redirectToRoute('tutelle_view', ['id' => $id]);
case 'message_like':
$res_array = ['success' => false, 'error' => null];
$message_id = $form_data['message_id'] ?? null;
if ($message_id != null && is_numeric($message_id)) {
$message = $this->getDoctrine()->getRepository(Message::class)->find(intval($message_id));
$likes = $message->getLikes();
if (( $key = array_search($user->getId(), $likes) ) === false) {
$likes[] = $user->getId();
$message->setLikes($likes);
$em->persist($message);
$em->flush();
$res_array['success'] = true;
$res_array['action'] = 'message_like';
$res_array['value'] = count($likes);
}
else {
unset($likes[$key]);
$message->setLikes(array_values($likes));
$em->persist($message);
$em->flush();
$res_array['success'] = true;
$res_array['action'] = 'message_unlike';
$res_array['value'] = count($likes);
}
}
else {
$res_array['error'] = 'Le message n\'existe pas';
}
return $this->json($res_array);
case 'message_report':
$res_array = ['success' => false, 'error' => null];
$message_id = $form_data['message_id'] ?? null;
if ($message_id != null && is_numeric($message_id)) {
$message = $this->getDoctrine()->getRepository(Message::class)->find(intval($message_id));
$reports = $message->getReports();
if (( $key = array_search($user->getId(), $reports) ) === false) {
$reports[] = $user->getId();
$message->setReports($reports);
$em->persist($message);
$em->flush();
$res_array['success'] = true;
$res_array['action'] = 'message_report';
}
else {
unset($reports[$key]);
$message->setReports(array_values($reports));
$em->persist($message);
$em->flush();
$res_array['success'] = true;
$res_array['action'] = 'message_unreport';
}
}
else {
$res_array['error'] = 'Le message n\'existe pas';
}
return $this->json($res_array);
}
}
return $this->render('tutelle/view.html.twig', [
'onglets' => $ongletService->getOnglets(), // Onglets
'etablissement' => $etablissement, // School of the user
'user' => $user, // Connected User
'tutelle' => $tutelle, // Tutelle of the user
'contribution_panel' => $contribution_panel, // Contributions to show on the sidebar
'forum_panel' => $topic_service->recupereLesQuelquesDerniersSujetsDeTousLesForums(3) ?? [],
'errors' => [ // List of form errors
'message' => $message_error ?? null,
],
]);
}
/**
* @Route("/etablissement", name="etablissement_view")
* @IsGranted("ROLE_USER", message="Vous devez être connecté pour accéder à cette page")
*/
public function viewEtablissement(Request $request, OngletService $ongletService, TopicService $topic_service,
LogService $logService, ContributionService $contributionService, MessageService $messageService)
{
$user = $this->getUser();
$etablissement = $user->getEtablissement();
if (empty($etablissement) && $request->isMethod('GET')) {
if ($user->getTutelle())
return $this->redirectToRoute('tutelle_view');
else
throw new AccessDeniedException(
'Vous n\'êtes associé à aucun Etablissement/Tutelle'
);
}
// Contribution Sidebar ////////////////////////////////////////////////////////////////////////////////////////////
$contribution_panel = $contributionService->getConsulteesEtConseillees($user, null, $etablissement, 2, 4, 4);
$contributions_of_etablissement = [];
if ($etablissement) {
$raw_data = array_map(
function ($user) {
return $user->getContributions()->toArray();
},
$etablissement->getUsers()->toArray()
);
array_walk_recursive(
$raw_data,
function ($c) use (&$contributions_of_etablissement) {
$contributions_of_etablissement[] = $c;
}
);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
$topics_of_etablissement = $this
->getDoctrine()
->getRepository(Topic::class)
->findTopicByEtablissement($etablissement->getId()) ?? 0;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if ($request->isMethod('POST') && $user) {
$em = $this->getDoctrine()->getManager();
$form_data = $request->headers->get('Content-Type') === 'application/json' ?
json_decode($request->getContent(), true) : $request->request->all();
switch ($form_data['submit_action']) {
case 'message':
if (empty($etablissement)) break;
$message_text = $form_data['message'] ?? null;
if ($message_text != null) {
$message = new Message();
$message->setText($message_text);
$message->setPublishDate(new \DateTime('now'));
$message->setLikes([]);
$message->setApplys([]);
$message->setReports([]);
$message->setActive(true);
$message->setEtablissement($etablissement);
$message->setUser($user);
$em->persist($message);
$em->flush();
$messageService->algoliaMaj($message);
return $this->redirectToRoute('etablissement_view');
}
else $messageError = 'Ce champ ne peut être vide.';
break;
case 'message_like':
$res_array = ['success' => false, 'error' => null];
$message_id = $form_data['message_id'] ?? null;
if ($message_id != null && is_numeric($message_id)) {
$message = $this->getDoctrine()->getRepository(Message::class)->find(intval($message_id));
$likes = $message->getLikes();
if (( $key = array_search($user->getId(), $likes) ) === false) {
$likes[] = $user->getId();
$message->setLikes($likes);
$em->persist($message);
$em->flush();
$res_array['success'] = true;
$res_array['action'] = 'message_like';
$res_array['value'] = count($likes);
}
else {
unset($likes[$key]);
$message->setLikes(array_values($likes));
$em->persist($message);
$em->flush();
$res_array['success'] = true;
$res_array['action'] = 'message_unlike';
$res_array['value'] = count($likes);
}
}
else {
$res_array['error'] = 'Le message n\'existe pas';
}
return $this->json($res_array);
case 'message_report':
$res_array = ['success' => false, 'error' => null];
$message_id = $form_data['message_id'] ?? null;
if ($message_id != null && is_numeric($message_id)) {
$message = $this->getDoctrine()->getRepository(Message::class)->find(intval($message_id));
$reports = $message->getReports();
if (( $key = array_search($user->getId(), $reports) ) === false) {
$reports[] = $user->getId();
$message->setReports($reports);
$em->persist($message);
$em->flush();
$res_array['success'] = true;
$res_array['action'] = 'message_report';
}
else {
unset($reports[$key]);
$message->setReports(array_values($reports));
$em->persist($message);
$em->flush();
$res_array['success'] = true;
$res_array['action'] = 'message_unreport';
}
}
else {
$res_array['error'] = 'Le message n\'existe pas';
}
return $this->json($res_array);
}
}
$formations = $this->getDoctrine()->getRepository(Formation::class)->findAll();
return $this->render('etablissement/view.html.twig', [
'onglets' => $ongletService->getOnglets(), // Onglets
'etablissement' => $etablissement, // School of the user
'user' => $user, // Connected User
'stats' => [
'contributions' => count($contributions_of_etablissement),
'participations' => count($topics_of_etablissement),
],
'contribution_panel' => $contribution_panel, // Contributions to show on the sidebar
'forum_panel' => $topic_service->recupereLesQuelquesDerniersSujetsDeTousLesForums(3) ?? [],
'errors' => [ // List of form errors
'message' => $messageError ?? null,
],
'formations' => $formations
]);
}
/**
* @Route("/etablissement/{id}", name="etablissement_view_id", requirements={"id"="\d+"})
* @IsGranted("ROLE_ADMIN", message="Cet espace n'est accessible qu'à un administrateur")
*/
public function viewEtablissementById($id, Request $request, OngletService $ongletService, TopicService $topic_service, MessageService $messageService)
{
$user = $this->getUser();
$etablissement = $this->getDoctrine()->getRepository(Etablissement::class)->findOneBy(['id' => $id]);
if (empty($etablissement)) throw new NotFoundHttpException();
// Contribution Sidebar ////////////////////////////////////////////////////////////////////////////////////////////
$last_created_contributions = $this->getDoctrine()->getRepository(Contribution::class)
->findBy(['status'=>'Accepté'], ['creation_date'=>'DESC']) ?? [];
$last_viewed_by_user = $this->getDoctrine()->getRepository(Log::class)
->findBy(['user'=>$user, 'action'=>'view'], ['date'=>'DESC']) ?? [];
$last_viewed_by_user = array_map(
function($log) {return $log->getContribution();},
$last_viewed_by_user
);
$contributions_of_etablissement = [];
$raw_data = array_map(
function($user) { return $user->getContributions()->toArray(); },
$etablissement->getUsers()->toArray()
);
array_walk_recursive(
$raw_data,
function($c) use (&$contributions_of_etablissement) { $contributions_of_etablissement[] = $c; }
);
$contribution_panel = [
'last_viewed' => array_slice($last_viewed_by_user, 0, 2),
'adviced' => array_slice($contributions_of_etablissement, 0, 2),
'last_added' => array_slice($last_created_contributions, 0, 4)
];
if (count($contribution_panel['last_viewed']) === 1)
$contribution_panel['last_viewed'][] = array_shift($contribution_panel['last_added']);
if (count($contribution_panel['adviced']) === 1)
$contribution_panel['adviced'][] = array_shift($contribution_panel['last_added']);
//dump($last_created_contributions);
//dump($last_viewed_by_user);
//dump($contributions_of_etablissement);
//dump($contribution_panel);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if ($request->isMethod('POST') && !empty($request->request->all()) && $etablissement && $user) {
$em = $this->getDoctrine()->getManager();
$form_data = $request->request;
//dump($request->request->all());
switch ($form_data->get('submit_action')) {
case 'message':
$message_text = $form_data->get('message') ?? null;
if ($message_text != null) {
$message = new Message();
$message->setText($message_text);
$message->setPublishDate(new \DateTime('now'));
$message->setLikes([]);
$message->setApplys([]);
$message->setReports([]);
$message->setActive(true);
$message->setEtablissement($etablissement);
$message->setUser($user);
$em->persist($message);
$em->flush();
$messageService->algoliaMaj($message);
return $this->redirectToRoute('etablissement_view_id', ['id' => $id]);
}
else $messageError = 'Ce champ ne peut être vide.';
break;
case 'message_like':
$message_id = $form_data->get('message_id') ?? null;
if ($message_id != null && is_numeric($message_id)) {
$message = $this->getDoctrine()->getRepository(Message::class)->find(intval($message_id));
$likes = $message->getLikes();
if (array_search($user->getId(), $likes) === false) {
$likes[] = $user->getId();
$message->setLikes($likes);
$em->persist($message);
$em->flush();
}
}
break;
case 'message_report':
$message_id = $form_data->get('message_id') ?? null;
if ($message_id != null && is_numeric($message_id)) {
$message = $this->getDoctrine()->getRepository(Message::class)->find(intval($message_id));
$reports = $message->getReports();
if (array_search($user->getId(), $reports) === false) {
$reports[] = $user->getId();
$message->setReports($reports);
$em->persist($message);
$em->flush();
}
}
break;
}
}
return $this->render('etablissement/view.html.twig', [
'onglets' => $ongletService->getOnglets(), // Onglets
'etablissement' => $etablissement, // School of the user
'user' => $user, // Connected User
'contribution_panel' => $contribution_panel, // Contributions to show on the sidebar
'forum_panel' => $topic_service->recupereLesQuelquesDerniersSujetsDeTousLesForums(3) ?? [],
'errors' => [ // List of form errors
'message' => $messageError ?? null,
],
]);
}
/**
* @Route("/etablissements/{departement}", name="etablissements", defaults={"departement"=""}, requirements={"departement"="^[0-9a-zA-Z]*$"})
*/
public function etablissements($departement, Request $request, OngletService $ongletService, EtablissementService $etablissementService)
{
$etablissements = [];
$methode = strtolower($request->getMethod());
if ($methode === 'post') {
$donnees = $request->request->all();
$departement = $donnees['departement'] ?? '';
return $this->redirectToRoute('etablissements', ['departement' => $departement]);
}
if ($departement) {
$etablissements = $etablissementService->findByDepartement($departement);
}
else {
$etablissements = $etablissementService->getRepository()->findBy([], ['name' => 'asc']);
}
return $this->render('etablissement/recherche.html.twig', [
'onglets' => $ongletService->getOnglets(),
'etablissements' => $etablissements,
'departement' => $departement,
]);
}
/**
* @Route("/tutelles", name="tutelles", defaults={}, requirements={})
*/
public function tutelles(Request $request, OngletService $ongletService, TutelleService $tutelleService)
{
$tutelles = $tutelleService->getRepository()->findBy([], ['name' => 'asc']);
return $this->render('about_us/tutelles.html.twig', [
'onglets' => $ongletService->getOnglets(),
'tutelles' => $tutelles
]);
}
}