nineskeletor/src/nineskeletor-1.0/src/Controller/DocumentController.php

494 lines
18 KiB
PHP
Executable File

<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\Form\FormError;
use App\Entity\Document as Entity;
use App\Form\DocumentType as Form;
class DocumentController extends AbstractController
{
private $data = "document";
private $route = "app_document";
private $render = "Document/";
private $entity = "App:Document";
public function upload($entity,$id)
{
// Controles d'accès en fonction de l'entité d'arrivé
if(!$this->ctrlAccessentity($entity,$id,"update")) return $this->redirectToRoute("app_activity");
// Rendu
return $this->render($this->render.'upload.html.twig',[
'useheader' => false,
'usesidebar' => false,
'entity' => $entity,
'id' => $id,
]);
}
public function record($entity,$id)
{
// Controles d'accès en fonction de l'entité d'arrivé
if(!$this->ctrlAccessentity($entity,$id,"update")) return $this->redirectToRoute("app_activity");
// Rendu
return $this->render($this->render.'record.html.twig',[
'useheader' => false,
'usesidebar' => false,
'entity' => $entity,
'id' => $id,
]);
}
public function recordupload($entity,$id,Request $request)
{
// Controles d'accès en fonction de l'entité d'arrivé
if(!$this->ctrlAccessentity($entity,$id,"update")) return $this->redirectToRoute("app_activity");
// Récupérper l'enregistrement
$content = $request->getContent();
$name = $request->get('name');
// Destination
$directory = $this->getParameter('kernel.project_dir')."/uploads/document/".$entity."/".$id;
$filename = uniqid().".ogg";
// Ecrire sur le filesystem
$fs = new Filesystem();
$fs->mkdir($directory);
$fp = fopen($directory."/".$filename, 'wb');
fwrite($fp, $content);
fclose($fp);
// Création du document
$em = $this->getDoctrine()->getManager();
$document=new Entity();
$document->setName($name);
$document->setFilename($filename);
$document->setRoworder(99999);
$document->setExtention("ogg");
$document->setMinetype("video/webm");
$document->setHavethumb(false);
$document->setEntity($entity);
// Rattacher le document à l'entity
switch($entity) {
case "activity":
$activity=$em->getRepository("App:Activity")->find($id);
$document->setActivity($activity);
break;
case "corrected":
$corrected=$em->getRepository("App:Activity")->find($id);
$document->setCorrected($corrected);
break;
case "answer":
$answer=$em->getRepository("App:Answer")->find($id);
$document->setAnswer($answer);
break;
case "answercorrected":
$answer=$em->getRepository("App:Answer")->find($id);
$document->setAnswercorrected($answer);
break;
}
// Sauvegarde
$em->persist($document);
$em->flush();
// Retour
return new Response(json_encode([]));
}
public function list($entity,$id,$master) {
// Controles d'accès en fonction de l'entité d'arrivé
if(!$this->ctrlAccessentity($entity,$id,"view")) return $this->redirectToRoute("app_activity");
// Récupérer les documents
$em = $this->getDoctrine()->getManager();
$documents=null;
switch($entity) {
case "activity":
$activity=$em->getRepository("App:Activity")->find($id);
if($activity) {
$documents=$em->getRepository("App:Document")->findBy(["activity"=>$activity]);
if($activity->getStatus()!=0) $master=false;
}
break;
case "corrected":
$corrected=$em->getRepository("App:Activity")->find($id);
if($corrected) {
$documents=$em->getRepository("App:Document")->findBy(["corrected"=>$corrected]);
if($corrected->getStatus()==10) $master=false;
}
break;
case "answer":
$answer=$em->getRepository("App:Answer")->find($id);
if($answer) {
$documents=$em->getRepository("App:Document")->findBy(["answer"=>$answer]);
if($answer->getStatus()>=10)
$master=false;
if($answer->getActivity()->getStatus()==10)
$master=false;
}
break;
case "answercorrected":
$answercorrected=$em->getRepository("App:Answer")->find($id);
if($answercorrected) {
$documents=$em->getRepository("App:Document")->findBy(["answercorrected"=>$answercorrected]);
if($answercorrected->getStatus()>=15)
$master=false;
if($answercorrected->getActivity()->getStatus()==10)
$master=false;
}
break;
}
// Construire le tableau d'id
$output=[];
foreach($documents as $document) {
$tmp=[
"id"=>$document->getId(),
"html"=>$this->thumb($document->getId(),$master),
];
array_push($output,$tmp);
}
// Retour
return new Response(json_encode($output));
}
public function thumb($id,$master)
{
$em = $this->getDoctrine()->getManager();
$data=$em->getRepository($this->entity)->find($id);
$title=$data->getName();
$filename=$data->getFilename();
$description=$data->getDescription();
$extention=$data->getExtention();
$minetype=$data->getMinetype();
$minefamily=explode("/",$minetype)[0];
switch($data->getEntity()) {
case "activity" : $identity=$data->getActivity()->getId(); break;
case "corrected" : $identity=$data->getCorrected()->getId(); break;
case "answer" : $identity=$data->getAnswer()->getId(); break;
case "answercorrected" : $identity=$data->getAnswercorrected()->getId(); break;
}
if($data->getHavethumb()) {
$directory = $this->getParameter('kernel.project_dir') . '/uploads/document/'.$data->getEntity()."/".$identity;
$dataimg = file_get_contents($directory."/thumb/".$filename);
$url="data:image/" . $extention . ";base64," . base64_encode($dataimg);
}
else {
$url="/".$this->getParameter("appAlias")."/images/files/".$extention.".png";
}
return $this->renderView($this->render.'render.html.twig',[
'entity' => $data->getEntity(),
'id' => $id,
'title' => $title,
'description' => $description,
'url' => $url,
'extention' => $extention,
'minefamily' => $minefamily,
'master' => $master,
]);
}
public function view($entity,$id) {
// Controles d'accès sur le document
if(!$this->ctrlAccessdocument($entity,$id,"view")) return $this->redirectToRoute("app_activity");
$em = $this->getDoctrine()->getManager();
$data=$em->getRepository($this->entity)->find($id);
switch($data->getEntity()) {
case "activity" : $identity=$data->getActivity()->getId(); break;
case "corrected" : $identity=$data->getCorrected()->getId(); break;
case "answer" : $identity=$data->getAnswer()->getId(); break;
case "answercorrected" : $identity=$data->getAnswercorrected()->getId(); break;
}
$directory= $this->getParameter('kernel.project_dir') . '/uploads/document/'.$entity."/".$identity;
$url=$directory."/".$data->getFilename();
$file = new file($url);
$minetype=$file->getMimeType();
$minefamily=explode("/",$minetype)[0];
if($minefamily=="text" || $minefamily=="image") {
$image="";
if($minefamily=="image") {
$image = "data:image/" . $file->getExtension() . ";base64," . base64_encode(file_get_contents($url));
}
return $this->render($this->render.'view.html.twig',[
'useheader' => false,
'usesidebar' => false,
'entity' => $entity,
'id' => $id,
'minefamily' => $minefamily,
'image' => $image
]);
}
else {
$response = new BinaryFileResponse($file);
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_INLINE);
return $response;
}
}
public function show($entity,$id) {
// Controles d'accès sur le document
if(!$this->ctrlAccessdocument($entity,$id,"view")) return $this->redirectToRoute("app_activity");
$em = $this->getDoctrine()->getManager();
$data=$em->getRepository($this->entity)->find($id);
switch($data->getEntity()) {
case "activity" : $identity=$data->getActivity()->getId(); break;
case "corrected" : $identity=$data->getCorrected()->getId(); break;
case "answer" : $identity=$data->getAnswer()->getId(); break;
case "answercorrected" : $identity=$data->getAnswercorrected()->getId(); break;
}
$directory= $this->getParameter('kernel.project_dir') . '/uploads/document/'.$entity."/".$identity;
$url=$directory."/".$data->getFilename();
$file = new file($url);
$response = new BinaryFileResponse($file);
//$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_INLINE);
$name= ($data->getName()==$data->getFilename()?$data->getFilename():$data->getName().'.'.$data->getExtention());
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
$name
);
return $response;
}
public function update($entity,$id,Request $request)
{
// Controles d'accès sur le document
if(!$this->ctrlAccessdocument($entity,$id,"update")) return $this->redirectToRoute("app_activity");
// Initialisation de l'enregistrement
$em = $this->getDoctrine()->getManager();
$data=$em->getRepository($this->entity)->find($id);
// Création du formulaire
$form = $this->createForm(Form::class,$data,array("mode"=>"update"));
// Récupération des data du formulaire
$form->handleRequest($request);
// Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) {
$data = $form->getData();
$em->persist($data);
$em->flush();
return $this->render($this->render.'close.html.twig');
}
// Affichage du formulaire
return $this->render($this->render.'edit.html.twig', [
'useheader' => false,
'usesidebar' => false,
$this->data => $data,
'mode' => 'update',
'form' => $form->createView(),
]);
}
public function delete($entity,$id,Request $request)
{
// Controles d'accès sur le document
if(!$this->ctrlAccessdocument($entity,$id,"update")) return $this->redirectToRoute("app_activity");
// Initialisation de l'enregistrement
$em = $this->getDoctrine()->getManager();
$data=$em->getRepository($this->entity)->find($id);
// Création du formulaire
$form = $this->createForm(Form::class,$data,array("mode"=>"update"));
// Récupération des data du formulaire
$form->handleRequest($request);
if($data) {
$em->remove($data);
$em->flush();
return $this->render($this->render.'close.html.twig');
}
// Affichage du formulaire
return $this->render($this->render.'edit.html.twig', [
'useheader' => false,
'usesidebar' => false,
$this->data => $data,
'mode' => 'update',
'form' => $form->createView(),
]);
}
private function ctrlAccessentity($entity,$id,$mode) {
// Initialisation de l'enregistrement
$em = $this->getDoctrine()->getManager();
switch($entity) {
case "activity" :
$data=$em->getRepository("App:Activity")->find($id);
if(!$data) return false;
$group=$data->getGroup();
$user=$this->getUser();
$isadmin=($user->Hasrole("ROLE_ADMIN"));
$ismaster=($user==$data->getUser());
$ismember=($group->getUsers()->contains($this->getUser()));
// Test visualisation = tout les membres du groupes peuvent voir l'énoncé
if(!$isadmin && !$ismaster && !$ismember)
return false;
// Membre = Test visualisation activité que si activité non brouillon
if(!$isadmin && !$ismaster && $ismember) {
if($data->getStatus()==0)
return false;
}
// Test modification = Impossible de modifier un document si activité non brouillon
if ($mode=="update" && ((!$isadmin && !$ismaster) || $data->getStatus()>0))
return false;
break;
case "corrected":
$data=$em->getRepository("App:Activity")->find($id);
if(!$data) return false;
$group=$data->getGroup();
$user=$this->getUser();
$isadmin=($user->Hasrole("ROLE_ADMIN"));
$ismaster=($user==$data->getUser());
$ismember=($group->getUsers()->contains($this->getUser()));
// Test visualisation
if(!$isadmin && !$ismaster && !$ismember)
return false;
// Membre = Visualisation uniquement si sa réponse est corrigée
if(!$isadmin && !$ismaster && $ismember) {
$answer=$em->getRepository("App:Answer")->findOneBy(["activity"=>$data,"user"=>$user]);
if(!$answer || $answer->getStatus()<15)
return false;
}
// Test modification = Impossible de modifier un document si activité close
if ($mode=="update" && ((!$isadmin && !$ismaster) || $data->getStatus()==10))
return false;
break;
case "answer":
$data=$em->getRepository("App:Answer")->find($id);
if(!$data) return false;
$user=$this->getUser();
$isadmin=($user->Hasrole("ROLE_ADMIN"));
$ismaster=($user==$data->getActivity()->getUser());
$isuser=($user==$data->getUser());
// Test visualisation
if(!$isadmin && !$ismaster && !$isuser)
return false;
// Test modification = Impossible de modifier un document si réponse rendues ou activité non distribut
if ($mode=="update" && ((!$isadmin && !$isuser) || $data->getStatus()>=10 || $data->getActivity()->getStatus()!=1))
return false;
break;
case "answercorrected":
$data=$em->getRepository("App:Answer")->find($id);
if(!$data) return false;
$user=$this->getUser();
$isadmin=($user->Hasrole("ROLE_ADMIN"));
$ismaster=($user==$data->getActivity()->getUser());
$isuser=($user==$data->getUser());
// Test visualisation
if(!$isadmin && !$ismaster && !$isuser)
return false;
// Membre = Visualisation uniquement si sa réponse est rendu
if(!$isadmin && !$ismaster && $isuser) {
if($data->getStatus()<10)
return false;
}
// Test modification = Impossible de modifier un document si réponse corrigées
if ($mode=="update" && ((!$isadmin && !$ismaster) || $data->getStatus()>=15 || $data->getActivity()->getStatus()!=1) )
return false;
break;
}
return true;
}
private function ctrlAccessdocument($entity,$id,$mode) {
// Initialisation de l'enregistrement
$em = $this->getDoctrine()->getManager();
$document=$em->getRepository($this->entity)->find($id);
if(!$document) return false;
switch($entity) {
case "activity" :
$data=$document->getActivity();
return $this->ctrlAccessentity($entity,$data->getId(),$mode);
break;
case "corrected":
$data=$document->getCorrected();
return $this->ctrlAccessentity($entity,$data->getId(),$mode);
break;
case "answer" :
$data=$document->getAnswer();
return $this->ctrlAccessentity($entity,$data->getId(),$mode);
break;
case "answercorrected" :
$data=$document->getAnswercorrected();
return $this->ctrlAccessentity($entity,$data->getId(),$mode);
break;
}
return true;
}
}