src/Controller/District/ProjectController.php line 101

Open in your IDE?
  1. <?php
  2. namespace App\Controller\District;
  3. use App\Application\ApplicationHelper;
  4. use App\Entity\Attachment;
  5. use App\Entity\Project;
  6. use App\Form\AttachmentFormType;
  7. use App\Project\AttachmentHelper;
  8. use App\Project\ProjectForm;
  9. use App\Project\ProjectHelper;
  10. use App\Project\ProjectOutput;
  11. use App\Repository\AttachmentRepository;
  12. use App\Service\ProjectPdfCreator;
  13. use App\Service\StatusHelper;
  14. use App\Service\UploaderHelper;
  15. use Doctrine\ORM\EntityManagerInterface;
  16. use Psr\Log\LoggerInterface;
  17. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  22. class ProjectController extends AbstractController
  23. {
  24.     private ProjectForm $projectForm;
  25.     private ProjectHelper $projectHelper;
  26.     private ApplicationHelper $applicationHelper;
  27.     private AttachmentHelper $attachmentHelper;
  28.     private StatusHelper $statusHelper;
  29.     public function __construct(
  30.         ProjectForm $projectForm,
  31.         ProjectHelper $projectHelper,
  32.         AttachmentHelper $attachmentHelper,
  33.         ApplicationHelper $applicationHelper,
  34.         StatusHelper $statusHelper
  35.     ) {
  36.         $this->projectForm $projectForm;
  37.         $this->projectHelper $projectHelper;
  38.         $this->applicationHelper $applicationHelper;
  39.         $this->attachmentHelper $attachmentHelper;
  40.         $this->statusHelper $statusHelper;
  41.     }
  42.     /**
  43.      * @Route("/district/project/new", name="app_district_project_new")
  44.      */
  45.     public function new(): Response
  46.     {
  47.         $project $this->applicationHelper->addNewProject($this->getUser());
  48.         return $this->redirectToRoute('app_district_project', ['projectId' => $project->getId(), 'page' => -1]);
  49.     }
  50.     /**
  51.      * @Route("/district/project/edit/{projectId}/{page}", name="app_district_project", defaults={"projectId" = 0, "page" = 0})
  52.      */
  53.     public function edit($projectId$pageRequest $request): Response
  54.     {
  55.         $project $this->projectHelper->findUserProject($projectId);
  56.         $this->denyAccessUnlessGranted('IS_EDITABLE'$project);
  57.         $firstLoad false;
  58.         if ($page == -1) {
  59.             $firstLoad true;
  60.             $page 0;
  61.         }
  62.         if ($this->isFormSent()) {
  63.             $action $this->getAction();
  64.             if (in_array($action, ['action_add_attachments''action_save''action_save_list''action_next''action_prev''action_page'])) {
  65.                 $this->projectForm->setProject($project);
  66.                 $this->projectForm->savePage($page);
  67.             }
  68.             $redirect $this->handleAction($action$page$project$request);
  69.             if ($redirect) {
  70.                 return $redirect;
  71.             }
  72.         }
  73.         $this->projectForm->setProject($project, !$firstLoad);
  74.         $pageNav $this->projectForm->generatePagenav($page);
  75.         $formOutput $this->projectForm->generatePage($page$pageNav);
  76.         return $this->render('district/project/index.html.twig', [
  77.             'formOutput' => $formOutput,
  78.         ]);
  79.     }
  80.     /**
  81.      * @Route("/district/project/delete/{projectId}", name="app_district_project_delete")
  82.      */
  83.     public function delete($projectIdLoggerInterface $logger): Response
  84.     {
  85.         $project $this->projectHelper->findUserProject($projectId);
  86.         $this->denyAccessUnlessGranted('IS_OWNER'$project);
  87.         try {
  88.             $this->projectHelper->deleteProject($project);
  89.             $this->addFlash('success''Das Projekt wurde gelöscht.');
  90.         } catch(\Exception $e) {
  91.             $this->addFlash('error''Das Projekt konnte nicht gelöscht werden.');
  92.             $logger->error('project could not be deleted - ' $e->getMessage());
  93.         }
  94.         return $this->redirectToRoute('app_district_application');
  95.     }
  96.     /**
  97.      * @Route("/district/project/copy/{projectId}", name="app_district_project_copy")
  98.      */
  99.     public function copy($projectId): Response
  100.     {
  101.         $project $this->projectHelper->findUserProject($projectId);
  102.         $this->denyAccessUnlessGranted('IS_EDITABLE'$project);
  103.         $this->statusHelper->checkProjectLimit();
  104.         $this->addFlash('success''Das Projekt wurde kopiert.');
  105.         $this->projectHelper->copyProject($project);
  106.         return $this->redirectToRoute('app_district_application');
  107.     }
  108.     /**
  109.      * @Route("/district/project/migrate/{projectId}", name="app_district_project_migrate")
  110.      */
  111.     public function migrate($projectId): Response
  112.     {
  113.         $project $this->projectHelper->findUserProject($projectId);
  114.         $this->denyAccessUnlessGranted('IS_OWNER'$project);
  115.         $this->statusHelper->checkProjectLimit();
  116.         if ($this->getUser()->getDistrict()->hasActiveApplication()) {
  117.             $this->projectHelper->migrateProject($project);
  118.             $this->addFlash('success''Das Projekt wurde dem aktuellen Wettbewerb hinzugefügt.');
  119.         }
  120.         return $this->redirectToRoute('app_district_application', ['applicationId' => $project->getApplication()->getId()]);
  121.     }
  122.     /**
  123.      * @Route("/district/project/show/{projectId}", name="app_district_project_show")
  124.      */
  125.     public function show($projectIdProjectOutput $projectOutputProjectForm $projectForm): Response
  126.     {
  127.         $project $this->projectHelper->findUserProject($projectId);
  128.         $this->denyAccessUnlessGranted('IS_OWNER'$project);
  129.         $projectOutput->setProject($project);
  130.         $output $projectOutput->output('district');
  131.         return $this->render('district/project/show.html.twig', [
  132.             'output' => $output,
  133.             'project' => $project,
  134.         ]);
  135.     }
  136.     /**
  137.      * @Route("/district/project/download/{projectId}", name="app_district_project_download")
  138.      */
  139.     public function downloadProject($projectIdProjectPdfCreator $pdfCreator): Response
  140.     {
  141.         $project $this->projectHelper->findUserProject($projectId);
  142.         $this->denyAccessUnlessGranted('IS_OWNER'$project);
  143.         $pdfCreator->setProject($project);
  144.         $pdfCreator->addLogo();
  145.         $pdfCreator->addIsDistrict();
  146.         return $pdfCreator->download('project.pdf');
  147.     }
  148.     /**
  149.      * @Route("/district/project/attachments/{projectId}", name="app_district_project_attachment")
  150.      */
  151.     public function attachments($projectIdRequest $requestUploaderHelper $uploaderHelperEntityManagerInterface $emLoggerInterface $logger): Response
  152.     {
  153.         $project $this->projectHelper->findUserProject($projectId);
  154.         $this->denyAccessUnlessGranted('IS_OWNER'$project);
  155.         $templateName 'district/project/attachment' . (!$this->projectHelper->isActive($project) ? '_prev' '');
  156.         $maxNumAttachments $this->getParameter('app.hdfh.max_num_attachments');
  157.         $attachments $project->getAttachments();
  158.         $uploadLimitReached $attachments && sizeof($attachments) >= $maxNumAttachments;
  159.         $formView '';
  160.         if (!$uploadLimitReached) {
  161.             $attachment = new Attachment();
  162.             $attachment->setProject($project);
  163.             $form $this->createForm(AttachmentFormType::class, $attachment, [
  164.                 'max_upload_size' => $this->getParameter('app.hdfh.max_attachment_size'),
  165.                 'allowed_mimetypes' => $uploaderHelper->getAllowedMimetypes(),
  166.             ]);
  167.             $form->handleRequest($request);
  168.             if ($form->isSubmitted() && $form->isValid()) {
  169.                 $uploadFile $form['file']->getData();
  170.                 try {
  171.                     $attachment $uploaderHelper->uploadAttachment($uploadFile$attachment);
  172.                     $em->persist($attachment);
  173.                     $em->flush();
  174. //                    dd($attachment);
  175. //                    $em->persist($attachment);
  176.                     $this->addFlash('success''Upload erfolgreich');
  177.                 } catch (\Exception $e) {
  178. //                    dd($e->getMessage());  // TODO
  179.                     $logger->error('upload failed - ' $e->getMessage());
  180.                     $this->addFlash('error''Upload fehlgeschlagen');
  181.                 }
  182.                 return $this->redirectToRoute('app_district_project_attachment', ['projectId' => $project->getId()]);
  183.             }
  184.             $formView $form->createView();
  185.         }
  186.         return $this->render($templateName '.html.twig', [
  187.             'form' => $formView,
  188.             'uploadLimitReached' => $uploadLimitReached,
  189.             'attachments' => $attachments,
  190.             'project' => $project,
  191.             'maxNumAttachments' => $maxNumAttachments,
  192.             'allowedFileTypes' => implode(', '$uploaderHelper->getAllowedMimetypes(true)),
  193.             'maxFileSize' => $this->getParameter('app.hdfh.max_attachment_size'),
  194.         ]);
  195.     }
  196.     /**
  197.      * @Route("/district/project/delattach/{attachmentId}", name="app_district_project_delete_attachment")
  198.      */
  199.     public function deleteAttachment($attachmentIdRequest $requestAttachmentHelper $attachmentHelperEntityManagerInterface $emAttachmentRepository $attachmentRepository): Response
  200.     {
  201.         $attachment $this->attachmentHelper->findUserAttachment($attachmentId);
  202.         $this->denyAccessUnlessGranted('IS_OWNER'$attachment);
  203.         $attachmentHelper->deleteAttachment($attachment);
  204. //        $em->remove($attachment);
  205. //        $em->flush();
  206.         $this->addFlash('success''Anhang gelöscht');
  207.         return $this->redirectToRoute('app_district_project_attachment', ['projectId' => $attachment->getProject()->getId()]);
  208.     }
  209.     /**
  210.      * @Route("/attachment/{attachmentId}", name="app_download_attachment")
  211.      */
  212.     public function downloadAttachment($attachmentIdUploaderHelper $uploaderHelper): Response
  213.     {
  214.         $attachment $this->attachmentHelper->findUserAttachment($attachmentId);
  215. //        $this->denyAccessUnlessGranted('IS_OWNER', $attachment);
  216.         if (!$this->isGranted('IS_OWNER'$attachment) && !$this->isGranted('ROLE_MANAGER') && !$this->isGranted('ROLE_JURY')) {
  217.             throw new AccessDeniedException();
  218.         }
  219.         return $uploaderHelper->streamAttachment($attachment);
  220.         // force download with original filename
  221. //        return $uploaderHelper->streamAttachment($attachment, true, true);
  222.     }
  223.     protected function handleAction($action$pageProject $projectRequest $request): ?Response
  224.     {
  225.         if ($action == 'action_save_list') {
  226.             return $this->redirectToRoute('app_district_application');
  227.         }
  228.         if ($action == 'action_add_attachments') {
  229.             return $this->redirectToRoute('app_district_project_attachment', [
  230.                 'projectId' => $project->getId(),
  231.             ]);
  232.         }
  233.         if ($action == 'action_save') {
  234.             $firstInvalidPage $this->projectForm->getFirstInvalidPage();
  235.             if ($firstInvalidPage === false) {
  236.                 return $this->redirectToRoute('app_district_application');
  237.             }
  238.             $targetPage $firstInvalidPage;
  239.             return $this->redirectToRoute('app_district_project', [
  240.                 'projectId' => $project->getId(),
  241.                 'page' => $targetPage,
  242.             ]);
  243.         }
  244.         if ($action == 'action_next') {
  245.             $targetPage $page 1;
  246.             return $this->redirectToRoute('app_district_project', [
  247.                 'projectId' => $project->getId(),
  248.                 'page' => $targetPage,
  249.             ]);
  250.         }
  251.         if ($action == 'action_prev') {
  252.             $targetPage $page 1;
  253.             return $this->redirectToRoute('app_district_project', [
  254.                 'projectId' => $project->getId(),
  255.                 'page' => $targetPage,
  256.             ]);
  257.         }
  258.         if ($action == 'action_page') {
  259.             $targetPage $request->get('action_page');
  260.             return $this->redirectToRoute('app_district_project', [
  261.                 'projectId' => $project->getId(),
  262.                 'page' => $targetPage,
  263.             ]);
  264.         }
  265.         return null;
  266.     }
  267.     protected function getAction()
  268.     {
  269.         $availableActions $this->projectForm->getAllActions();
  270.         $parameters array_keys($_POST);
  271.         $actions array_values(array_intersect($availableActions$parameters));
  272.         if (sizeof($actions)) {
  273.             return $actions[0];
  274.         }
  275.         return false;
  276.     }
  277.     protected function isFormSent(): bool
  278.     {
  279.         return !empty($_POST);
  280.     }
  281. }