<?php
namespace App\Controller\Backend\Media;
use App\Entity\Media\Document;
use App\Entity\Media\Import;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use App\Form\Media\DocumentType;
use App\Form\Media\DocumentsType;
use App\Entity\Site\Site;
use App\Entity\Media\Conversion;
use App\Entity\Federation\Race;
use Symfony\Contracts\Translation\TranslatorInterface;
use App\Service\Aws\AwsManager;
use App\Service\Media\DocumentCloneInformation;
use App\Service\Media\DocumentIptcInformation;
use App\Service\Media\GenerateCustomizedFile;
use App\Service\Export\ExportManager;
/**
* Document controller.
*
*/
class DocumentController extends AbstractController
{
public function deleteAction(Request $request, Document $document, $redirect = null, TranslatorInterface $translator)
{
$em = $this->getDoctrine()->getManager();
$form = $this->createDeleteForm($document, $redirect);
$form->handleRequest($request);
if($request->isXmlHttpRequest()) {
if($request->isMethod('DELETE'))
{
if ($form->isValid())
{
$em->remove($document);
$em->flush();
}
}
$form_view = $this->renderView('Backend/Views/Media/Document/delete.html.twig', array(
'form' => $form->createView(),
'redirect' => urldecode($redirect)
));
$response['view'] = $this->renderView('Backend/Global/Partials/modal.html.twig', array(
'modal_title' => $translator->trans('document.content.document_remove'),
'modal_content' => $form_view,
));
return new JsonResponse($response, 200);
}
}
public function depositDeleteAction(Request $request, Race $race, string $documentType, $key = null, AwsManager $aws)
{
$key = base64_decode($key);
$bucket = $race->getDirectoryName();
$aws->deleteObject($bucket, $key);
$directoryName = explode('/', $key);
array_pop($directoryName);
$directoryName = implode('/', $directoryName).'/';
return $this->redirectToRoute('race_deposit', array('id' => $race->getId(), 'directoryName' => base64_encode($directoryName)));
}
/**
* Creates a form to delete a Document entity.
*
* @param Document $document The Document entity
*
* @return \Symfony\Component\Form\Form The form
*/
private function createDeleteForm(Document $document)
{
return $this->createFormBuilder()
->setAction($this->generateUrl('ajax_document_delete', array('id' => $document->getId())))
->setMethod('DELETE')
->getForm()
;
}
private function createMultipleDeleteForm($documents)
{
return $this->createFormBuilder()
->setAction($this->generateUrl('ajax_multiple_document_delete', ['documents' => $documents]))
->setMethod('DELETE')
->getForm()
;
}
public function multipleDeleteAction(Request $request, $documents = null, $redirect = null, TranslatorInterface $translator)
{
$em = $this->getDoctrine()->getManager();
$form = $this->createMultipleDeleteForm($documents);
$form->handleRequest($request);
if($request->isXmlHttpRequest()) {
if($request->isMethod('DELETE'))
{
if ($form->isValid())
{
$documents = explode('-', $documents);
if(is_array($documents))
{
$datas = $em->getRepository(Document::class)->findByMultipleIds($documents);
if(!empty($datas))
foreach($datas as $value)
$em->remove($value);
}
$em->flush();
}
}
$form_view = $this->renderView('Backend/Views/Media/Document/delete.html.twig', array(
'form' => $form->createView(),
'redirect' => urldecode($redirect)
));
$response['view'] = $this->renderView('Backend/Global/Partials/modal.html.twig', array(
'modal_title' => $translator->trans('document.content.document_remove'),
'modal_content' => $form_view,
));
return new JsonResponse($response, 200);
}
}
public function multipleUpdateAction(Request $request, $documents = null, $redirect = null, TranslatorInterface $translator, DocumentCloneInformation $documentCloneInformation)
{
$code = 200;
$document = new Document();
$em = $this->getDoctrine()->getManager();
$datas = $em->getRepository(Document::class)->findByMultipleIds(explode('-', $documents));
if(!empty($datas))
{
$form = $this->createForm(DocumentsType::class, $document, array(
'action' => $this->generateUrl('ajax_multiple_document_update', ['documents' => $documents, 'redirect' => $redirect]),
'race' => $datas[0]->getRace(),
'documentType' => $datas[0]->getDocumentType(),
'validation_groups' => ['DocumentTypeMultiple']
));
$form->handleRequest($request);
if($request->isXmlHttpRequest()) {
if($request->isMethod('POST'))
{
if ($form->isValid())
{
foreach($datas as $value)
{
$documentCloneInformation->clone($document, $value);
}
$em->flush();
} else {
$code = 500;
}
}
$form_view = $this->renderView('Backend/Views/Media/Document/updateMultiple.html.twig', array(
'form' => $form->createView(),
'redirect' => urldecode($redirect)
));
$response['view'] = $this->renderView('Backend/Global/Partials/modal.html.twig', array(
'modal_title' => $translator->trans('document.content.document_update'),
'modal_content' => $form_view,
));
if($code == 500)
$response['view'] = $form_view;
return new JsonResponse($response, $code);
}
}
}
public function regenerateLowQualityPicturesAction(Request $request, Race $race, \App\Entity\Media\DocumentType $documentType, GenerateCustomizedFile $fileManager)
{
$cpt = $fileManager->regenerateLowQualityPictures();
$request->getSession()->getFlashBag()->add('success', $cpt.' Documents créé(s)');
return $this->redirectToRoute('race_documentType', array('id' => $race->getId(), 'documentType' => $documentType->getId()));
}
public function exportAction(Request $request, string $format, \App\Entity\Media\DocumentType $documentType, Race $race, ExportManager $exportManager)
{
$em = $this->getDoctrine()->getManager();
$orderby = 'id';
$sort = 'DESC';
if(!empty($this->get('session')->get('documentFilterRequest')))
{
$datas = $this->get('session')->get('documentFilterRequest')->get('document_filter');
//Get Query Result
$documents = $this->getDoctrine()
->getManager()
->getRepository(Document::class)
->getAllDocuments(null, null, false, $orderby, $sort, $documentType, $datas['title'], $datas['categories'], $race, $datas['classes'], $datas['boats'], $datas['teams'], $datas['skippers'], $datas['status'], $datas['import']);
} else {
//Get All Result
$documents = $this->getDoctrine()
->getManager()
->getRepository(Document::class)
->getAllDocuments(null, null, false, $orderby, $sort, $documentType, null, null, $race);
}
if(!empty($documents))
{
$exports = array();
foreach($documents as $document)
{
$tmp = $boats = $classes = $skippers = $teams = $categories = $tags = array();
foreach($document->getCategories() as $category)
array_push($categories, $category->getName());
foreach($document->getBoats() as $boat)
array_push($boats, $boat->getName());
foreach($document->getSkippers() as $skipper)
array_push($skippers, $skipper->getName());
foreach($document->getClasses() as $class)
array_push($classes, $class->getName());
foreach($document->getTeams() as $team)
array_push($teams, $team->getName());
foreach($document->getTags() as $tag)
array_push($tags, $tag->getName());
$tmp = array(
'race' => $document->getRace()->getName(),
'documentType' => $document->getDocumentType()->getName(),
'title' => $document->getTitle(),
'legend' => $document->getLegend(),
'copyright' => $document->getCopyright(),
'author' => $document->getAuthor(),
'localization' => $document->getLocalization(),
'description' => $document->getDescription(),
'notification' => $document->isNotify(),
'date' => $document->getDate()->format('d/m/Y H:i:s'),
'directory' => $document->getDirectoryName(),
'categories' => implode(' / ', $categories),
'classes' => implode(' / ', $classes),
'boats' => implode(' / ', $boats),
'skippers' => implode(' / ', $skippers),
'teams' => implode(' / ', $teams),
'tags' => implode(' / ', $tags),
'status' => $document->getStatus(),
'createdDate' => $document->getCreatedDate()->format('d/m/Y H:i:s')
);
array_push($exports, $tmp);
}
$datas = $exportManager->createCSVexport($exports);
$response = new Response($datas);
$response->headers->set('Content-Type', 'text/csv');
$response->headers->set('Content-Disposition', 'attachment; filename="export_documents_'.date('YmdHis').'.csv"');
return $response;
}
return new Response();
}
public function progressImportAction(Request $request, Import $import): JsonResponse
{
return new JsonResponse($import->data(), Response::HTTP_OK);
}
}