src/Controller/FileController.php line 241

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\File;
  4. use App\Entity\FileGroup;
  5. use App\Entity\User;
  6. use App\Entity\Workspace;
  7. use App\Form\FileType;
  8. use App\Repository\FileRepository;
  9. use App\Service\BlockChainService;
  10. use App\Service\FileValidatorService;
  11. use App\Service\IpfsService;
  12. use App\Utils\Datatable;
  13. use Exception;
  14. use GuzzleHttp\Exception\GuzzleException;
  15. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\HttpFoundation\File\UploadedFile;
  18. use Symfony\Component\HttpFoundation\JsonResponse;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\Response;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  23. /**
  24.  * @Route("/filegroup/{fileGroup}/file")
  25.  */
  26. class FileController extends AbstractController
  27. {
  28.     /**
  29.      * @Route("/list", name="file_index", methods={"GET"})
  30.      * @IsGranted("FILE_GROUP_SHOW", subject="fileGroup")
  31.      * @param FileGroup $fileGroup
  32.      * @return Response
  33.      */
  34.     public function index(FileGroup $fileGroup): Response
  35.     {
  36.         return $this->render('file/index.html.twig', [
  37.             'fileGroup' => $fileGroup,
  38.             'files' => $fileGroup->getFiles(),
  39.         ]);
  40.     }
  41.     /**
  42.      * @Route("/fetch/list", name="fetch_file_list", methods={"GET"})#
  43.      * @IsGranted("FILE_GROUP_SHOW", subject="fileGroup")
  44.      * @param Request $request
  45.      * @param Datatable $datatable
  46.      * @param FileRepository $fileRepository
  47.      * @param FileGroup $fileGroup
  48.      * @return Response
  49.      */
  50.     public function fetchFileList(Request $requestDatatable $datatableFileRepository $fileRepositoryFileGroup $fileGroup): Response
  51.     {
  52.         if (!$request->isXmlHttpRequest()) {
  53.             throw $this->createAccessDeniedException("Not an ajax request!");
  54.         }
  55.         /** @var User $user */
  56.         $user $this->getUser();
  57.         /** @var Workspace $workspace */
  58.         $workspace $user->getWorkspace();
  59.         $datatables $datatable
  60.             ->withColumnType([ // list column in order
  61.                 'id' => ['alias' => 'f'],
  62.                 'clientFileName' => ['alias' => 'f''twig' => 'components/datatable.ellipse.twig'],
  63.                 'fileName' => ['alias' => 'f''columnName' => 'name'],
  64.                 'created' => ['alias' => 'f''twig' => 'components/datatable.datetime.twig'],
  65.                 'version' => ['alias' => 'f'],
  66.                 'size' => ['alias' => 'f''twig' => 'components/datatable.filesize.twig'],
  67.                 'name' => ['alias' => 'fg'],
  68.                 'rollCount' => ['alias' => '''twig' => 'file/datatable.badge.twig']
  69.             ])
  70.             ->withOptions([
  71.                 'fileGroup' => $fileGroup->getId()
  72.             ])
  73.             ->renderActionView('file/datatable.action.twig')  // provide custom twig to render action column
  74.             ->isFile(true)
  75.             ->withQueryBuilder($fileRepository->fetchFileList($fileGroup->getId(), $workspace))
  76.             ->withRequestParams($request->query->all());
  77.         return new JsonResponse($datatables->getResponse());
  78.     }
  79.     public function onKernelResponse(ResponseEvent $event)
  80.     {
  81.         $response $event->getResponse();
  82.         $response->headers->set('Content-Security-Policy'"default-src 'self'; script-src 'self'");
  83.     }
  84.     /**
  85.      * @Route("/create/{nonce}", name="file_create", methods={"GET", "POST"})
  86.      * @IsGranted("FILE_CREATE")
  87.      * @param Request $request
  88.      * @param $nonce
  89.      * @param FileGroup $fileGroup
  90.      * @param BlockChainService $blockChainService
  91.      * @return Response
  92.      * @throws Exception
  93.      */
  94.     public function create(Request $requestFileGroup $fileGroupBlockChainService $blockChainServiceFileValidatorService $fileValidatorService$nonce): Response
  95.     {
  96.         if ($request->isMethod('GET') && !$request->isXmlHttpRequest()) {
  97.             throw $this->createAccessDeniedException("Not an ajax request!");
  98.         }
  99.         /** @var User $user */
  100.         $user $this->getUser();
  101.         /** @var Workspace $workspace */
  102.         $workspace $user->getWorkspace();
  103.         $file = new File();
  104.         $file->addFileGroup($fileGroup);
  105.         $file->setWorkspace($workspace);
  106.         $form $this->createForm(FileType::class, $file, [
  107.             'action' => $this->generateUrl('file_create', ['fileGroup' => $fileGroup->getId(),'nonce' => $nonce]),
  108.             'method' => 'POST',
  109.         ]);
  110.         $form->handleRequest($request);
  111.         if ($form->isSubmitted() && $form->isValid()) {
  112.            if($form->get('url')->getData() === null){
  113.             $this->addFlash("success""File Invalid!");
  114.             return $this->redirectToRoute('file_index', ['fileGroup' => $fileGroup->getId()]);
  115.            } else {
  116.             $em $this->getDoctrine()->getManager();
  117.             foreach ($file->getFileGroups() as $fGroup) {
  118.                 $fGroup->addFile($file);
  119.                 $em->persist($fGroup);
  120.             }
  121.             $em->persist($file);
  122.             $em->flush();
  123.             $blockChainService->registerFirmware($file);
  124.             return $this->redirectToRoute('file_index', ['fileGroup' => $fileGroup->getId()]);
  125.             }
  126.         }
  127.         return $this->render(
  128.             'file/new.html.twig',
  129.             [
  130.                 'fileGroup' => $fileGroup,
  131.                 'nonce' => urldecode(str_replace('?2F?''%2F'$nonce)),
  132.                 'file' => $file,
  133.                 'form' => $form->createView()
  134.             ]
  135.         );
  136.     }
  137.     /**
  138.      * @Route("/store-file", name="file_store_file", methods={"POST"})
  139.      * @IsGranted("FILE_CREATE")
  140.      * @param Request $request
  141.      * @param IpfsService $ipfsService
  142.      * @return Response
  143.      * @throws GuzzleException
  144.      */
  145.     public function storeFile(Request $requestIpfsService $ipfsServiceFileValidatorService $fileValidatorService): Response
  146.     {
  147.         if (!$request->isXmlHttpRequest()) {
  148.             throw $this->createAccessDeniedException("Not an ajax request!");
  149.         }
  150.         /**
  151.          * @var UploadedFile $requestFile
  152.          */
  153.         $requestFile $request->files->get('file');
  154.         $response = new Response();
  155.         try {
  156.             $fileValidatorService->validate($requestFile);
  157.             $response->setContent(json_encode([
  158.                 'cid' => $ipfsService->upload($requestFile),
  159.                 'size' => $requestFile->getSize(),
  160.                 'client_name' => $requestFile->getClientOriginalName(),
  161.                 'error' => null
  162.             ]));
  163.         } catch (Exception $exception) {
  164.             $response->setContent(json_encode([
  165.                 'cid' => null,
  166.                 'size' => null,
  167.                 'client_name' => null,
  168.                 'error' => $exception->getMessage()
  169.             ]));
  170.         }
  171.         $response->headers->set('Content-Type''application/json');
  172.         return $response;
  173.     }
  174.     /**
  175.      * @Route("/edit/{id}", name="file_edit", methods={"GET"})
  176.      * @IsGranted("FILE_EDIT", subject="file")
  177.      * @param Request $request
  178.      * @param File $file
  179.      * @param FileGroup $fileGroup
  180.      * @return Response
  181.      */
  182.     public function edit(Request $requestFile $fileFileGroup $fileGroup): Response
  183.     {
  184.         if ($request->isMethod('GET') && !$request->isXmlHttpRequest()) {
  185.             throw $this->createAccessDeniedException("Not an ajax request!");
  186.         }
  187.         $form $this->createForm(FileType::class, $file, [
  188.             'action' => $this->generateUrl('file_update', ['fileGroup' => $fileGroup->getId(), 'id' => $file->getId()]),
  189.             'method' => 'POST',
  190.         ]);
  191.         $form->handleRequest($request);
  192.         return $this->render(
  193.             'file/edit.html.twig',
  194.             [
  195.                 'fileGroup' => $fileGroup,
  196.                 'file' => $file,
  197.                 'form' => $form->createView()
  198.             ]
  199.         );
  200.     }
  201.     /**
  202.      * @Route("/show/{id}", name="file_show", methods={"GET"})
  203.      * @IsGranted("FILE_SHOW", subject="file")
  204.      * @param Request $request
  205.      * @param File $file
  206.      * @param FileGroup $fileGroup
  207.      * @return Response
  208.      */
  209.     public function show(Request $requestFile $fileFileGroup $fileGroup): Response
  210.     {
  211.         if ($request->isMethod('GET') && !$request->isXmlHttpRequest()) {
  212.             throw $this->createAccessDeniedException("Not an ajax request!");
  213.         }
  214.         return $this->render(
  215.             'file/show.html.twig',
  216.             [
  217.                 'fileGroup' => $fileGroup,
  218.                 'file' => $file,
  219.             ]
  220.         );
  221.     }
  222.     /**
  223.      * @Route("/fix/{id}", name="file_bc_fix", methods={"GET"})
  224.      * @IsGranted("FILE_EDIT", subject="file")
  225.      * @param File $file
  226.      * @param FileGroup $fileGroup
  227.      * @param BlockChainService $blockChainService
  228.      * @return Response
  229.      * @throws Exception
  230.      */
  231.     public function bcFix(File $fileFileGroup $fileGroupBlockChainService $blockChainService): Response
  232.     {
  233.         $blockChainService->registerFirmware($file);
  234.         return $this->redirectToRoute('file_index', ['fileGroup' => $fileGroup->getId()]);
  235.     }
  236.     /**
  237.      * @Route("/update/{id}", name="file_update", methods={"POST"})
  238.      * @IsGranted("FILE_EDIT", subject="file")
  239.      * @param Request $request
  240.      * @param File $file
  241.      * @param FileRepository $fileRepository
  242.      * @param FileGroup $fileGroup
  243.      * @param BlockChainService $blockChainService
  244.      * @return Response
  245.      * @throws Exception
  246.      */
  247.     public function update(Request $requestFile $fileFileRepository $fileRepositoryFileGroup $fileGroupBlockChainService $blockChainService): Response
  248.     {
  249.         $em $this->getDoctrine()->getManager();
  250.         $form $this->createForm(FileType::class, $file, [
  251.             'action' => $this->generateUrl('file_update', ['fileGroup' => $fileGroup->getId(), 'id' => $file->getId()]),
  252.             'method' => 'POST',
  253.         ]);
  254.         $form->handleRequest($request);
  255.         if ($form->isSubmitted() && $form->isValid()) {
  256.             $fileRepository->removeFileFromAllGroups($file);
  257.             foreach ($file->getFileGroups() as $fGroup) {
  258.                 $fGroup->addFile($file);
  259.                 $em->persist($fGroup);
  260.             }
  261.             $em->flush();
  262.             $blockChainService->registerFirmware($file);
  263.         }
  264.         return $this->redirectToRoute('file_index', ['fileGroup' => $fileGroup->getId()]);
  265.     }
  266.     /**
  267.      * @Route("/delete/{id}", name="file_delete", methods={"DELETE"})
  268.      * @IsGranted("FILE_DELETE", subject="file")
  269.      * @param Request $request
  270.      * @param File $file
  271.      * @param FileGroup $fileGroup
  272.      * @param BlockChainService $blockChainService
  273.      * @return Response
  274.      * @throws Exception
  275.      */
  276.     public function delete(Request $requestFile $fileFileGroup $fileGroupBlockChainService $blockChainService): Response
  277.     {
  278.         if ($this->isCsrfTokenValid('delete' $file->getId(), $request->request->get('_token'))) {
  279.             $blockChainService->removeFirmware($file);
  280.         }
  281.         return $this->redirectToRoute('file_index', ['fileGroup' => $fileGroup->getId()]);
  282.     }
  283.     /**
  284.      * @Route("/delete-bulk", name="file_delete_bulk", methods={"POST"})
  285.      * @IsGranted("FILE_MULTI_DELETE")
  286.      * @param Request $request
  287.      * @param FileRepository $fileRepository
  288.      * @param FileGroup $fileGroup
  289.      * @param BlockChainService $blockChainService
  290.      * @return Response
  291.      * @throws Exception
  292.      */
  293.     public function deleteBulk(Request $requestFileRepository $fileRepositoryFileGroup $fileGroupBlockChainService $blockChainService): Response
  294.     {
  295.         /** @var User $user */
  296.         $user $this->getUser();
  297.         $data explode(
  298.             ',',
  299.             $request->request->get('data_ids')
  300.         );
  301.         foreach ($data as $id) {
  302.             $file $fileRepository->findOneBy(['id' => $id'workspace' => $user->getWorkspace()]);
  303.             if (is_object($file)) {
  304.                 if (count($file->getRollouts()) === 0) {
  305.                     $fileRepository->removeFileFromAllGroups($file);
  306.                     $blockChainService->removeFirmware($file);
  307.                 }
  308.             }
  309.         }
  310.         return $this->redirectToRoute('file_index', ['fileGroup' => $fileGroup->getId()]);
  311.     }
  312. }