Passed
Push — master ( b61354...af9f4d )
by Julito
19:31
created

ResourceController::downloadAction()   B

Complexity

Conditions 5
Paths 4

Size

Total Lines 76
Code Lines 42

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 42
nc 4
nop 1
dl 0
loc 76
rs 8.9368
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
declare(strict_types=1);
4
5
/* For licensing terms, see /license.txt */
6
7
namespace Chamilo\CoreBundle\Controller;
8
9
use Chamilo\CoreBundle\Entity\AbstractResource;
10
use Chamilo\CoreBundle\Entity\Course;
11
use Chamilo\CoreBundle\Entity\ResourceInterface;
12
use Chamilo\CoreBundle\Entity\ResourceLink;
13
use Chamilo\CoreBundle\Entity\ResourceNode;
14
use Chamilo\CoreBundle\Form\Type\ResourceCommentType;
15
use Chamilo\CoreBundle\Repository\Node\IllustrationRepository;
16
use Chamilo\CoreBundle\Repository\ResourceWithLinkInterface;
17
use Chamilo\CoreBundle\Security\Authorization\Voter\ResourceNodeVoter;
18
use Chamilo\CoreBundle\Traits\ControllerTrait;
19
use Chamilo\CoreBundle\Traits\CourseControllerTrait;
20
use Chamilo\CoreBundle\Traits\ResourceControllerTrait;
21
use Chamilo\CourseBundle\Controller\CourseControllerInterface;
22
use Doctrine\Common\Collections\ArrayCollection;
23
use Doctrine\Common\Collections\Criteria;
24
use Symfony\Component\Filesystem\Exception\FileNotFoundException;
25
use Symfony\Component\HttpFoundation\File\UploadedFile;
26
use Symfony\Component\HttpFoundation\JsonResponse;
27
use Symfony\Component\HttpFoundation\RedirectResponse;
28
use Symfony\Component\HttpFoundation\Request;
29
use Symfony\Component\HttpFoundation\Response;
30
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
31
use Symfony\Component\HttpFoundation\StreamedResponse;
32
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
33
use Symfony\Component\Routing\Annotation\Route;
34
use Symfony\Component\Routing\RouterInterface;
35
use ZipStream\Option\Archive;
36
use ZipStream\ZipStream;
37
38
/**
39
 * Class ResourceController.
40
 *
41
 * @Route("/r")
42
 *
43
 * @author Julio Montoya <[email protected]>.
44
 */
45
class ResourceController extends AbstractResourceController implements CourseControllerInterface
46
{
47
    use CourseControllerTrait;
48
    use ResourceControllerTrait;
49
    use ControllerTrait;
50
51
    private string $fileContentName = 'file_content';
52
53
    /**
54
     * @deprecated Use Vue
55
     *
56
     * @Route("/{tool}/{type}", name="chamilo_core_resource_index")
57
     *
58
     * Example: /document/files (See the 'tool' and the 'resource_type' DB tables.)
59
     * For the tool value check the Tool entity.
60
     * For the type value check the ResourceType entity.
61
     */
62
    /*public function indexAction(Request $request): Response
63
    {
64
       $tool = $request->get('tool');
65
        $type = $request->get('type');
66
67
        $parentResourceNode = $this->getParentResourceNode($request);
68
        $repository = $this->getRepositoryFromRequest($request);
69
        $settings = $repository->getResourceSettings();
70
71
        // The base resource node is the course.
72
        $id = $parentResourceNode->getId();
73
74
        //return $grid->getGridResponse(
75
        return $this->render(
76
            $repository->getTemplates()->getFromAction(__FUNCTION__),
77
            [
78
                'tool' => $tool,
79
                'type' => $type,
80
                'id' => $id,
81
                'parent_resource_node' => $parentResourceNode,
82
                'resource_settings' => $settings,
83
            ]
84
        );
85
    }*/
86
87
    /**
88
     * @deprecated Use Vue
89
     *
90
     * @Route("/{tool}/{type}/{id}/list", name="chamilo_core_resource_list")
91
     *
92
     * If node has children show it
93
     */
94
    /*public function listAction(Request $request): void
95
    {
96
        $tool = $request->get('tool');
97
        $type = $request->get('type');
98
        $resourceNodeId = $request->get('id');
99
100
        $repository = $this->getRepositoryFromRequest($request);
101
        $settings = $repository->getResourceSettings();*/
102
103
    /*$grid = $this->getGrid($request, $repository, $grid, $resourceNodeId, 'chamilo_core_resource_list');
104
    $parentResourceNode = $this->getParentResourceNode($request);
105
    $this->setBreadCrumb($request, $parentResourceNode);*/
106
107
    //return $grid->getGridResponse(
108
    /*return $this->render(
109
        $repository->getTemplates()->getFromAction(__FUNCTION__),
110
        [
111
            'parent_id' => $resourceNodeId,
112
            'tool' => $tool,
113
            'type' => $type,
114
            'id' => $resourceNodeId,
115
            'parent_resource_node' => $parentResourceNode,
116
            'resource_settings' => $settings,
117
        ]
118
    );
119
    }*/
120
121
    /**
122
     * @deprecated Use Vue
123
     *
124
     * @Route("/{tool}/{type}/{id}/new_folder", methods={"GET", "POST"}, name="chamilo_core_resource_new_folder")
125
     */
126
    /*public function newFolderAction(Request $request): Response
127
    {
128
        return $this->createResource($request, 'folder');
129
    }*/
130
131
    /**
132
     * @deprecated Use Vue
133
     *
134
     * @Route("/{tool}/{type}/{id}/new", methods={"GET", "POST"}, name="chamilo_core_resource_new")
135
     */
136
    /*public function newAction(Request $request): Response
137
    {
138
        return $this->createResource($request, 'file');
139
    }*/
140
141
    /**
142
     * @Route("/{tool}/{type}/{id}/disk_space", methods={"GET", "POST"}, name="chamilo_core_resource_disk_space")
143
     */
144
    public function diskSpaceAction(Request $request): Response
145
    {
146
        $nodeId = $request->get('id');
147
        $repository = $this->getRepositoryFromRequest($request);
148
149
        /** @var ResourceNode $resourceNode */
150
        $resourceNode = $repository->getResourceNodeRepository()->find($nodeId);
151
152
        $this->denyAccessUnlessGranted(
153
            ResourceNodeVoter::VIEW,
154
            $resourceNode,
155
            $this->trans('Unauthorised access to resource')
156
        );
157
158
        $this->setBreadCrumb($request, $resourceNode);
159
160
        $course = $this->getCourse();
161
        $totalSize = 0;
162
        if (null !== $course) {
163
            $totalSize = $course->getDiskQuota();
164
        }
165
166
        $size = $repository->getResourceNodeRepository()->getSize(
167
            $resourceNode,
168
            $repository->getResourceType(),
169
            $course
170
        );
171
172
        $labels[] = $course->getTitle();
0 ignored issues
show
Comprehensibility Best Practice introduced by
$labels was never initialized. Although not strictly required by PHP, it is generally a good practice to add $labels = array(); before regardless.
Loading history...
173
        $data[] = $size;
0 ignored issues
show
Comprehensibility Best Practice introduced by
$data was never initialized. Although not strictly required by PHP, it is generally a good practice to add $data = array(); before regardless.
Loading history...
174
        $sessions = $course->getSessions();
175
176
        foreach ($sessions as $sessionRelCourse) {
177
            $session = $sessionRelCourse->getSession();
178
179
            $labels[] = $course->getTitle().' - '.$session->getName();
180
            $size = $repository->getResourceNodeRepository()->getSize(
181
                $resourceNode,
182
                $repository->getResourceType(),
183
                $course,
184
                $session
185
            );
186
            $data[] = $size;
187
        }
188
189
        /*$groups = $course->getGroups();
190
        foreach ($groups as $group) {
191
            $labels[] = $course->getTitle().' - '.$group->getName();
192
            $size = $repository->getResourceNodeRepository()->getSize(
193
                $resourceNode,
194
                $repository->getResourceType(),
195
                $course,
196
                null,
197
                $group
198
            );
199
            $data[] = $size;
200
        }*/
201
202
        $used = array_sum($data);
203
        $labels[] = $this->trans('Free');
204
        $data[] = $totalSize - $used;
205
206
        return $this->render(
207
            $repository->getTemplates()->getFromAction(__FUNCTION__),
208
            [
209
                'resourceNode' => $resourceNode,
210
                'labels' => $labels,
211
                'data' => $data,
212
            ]
213
        );
214
    }
215
216
    /**
217
     * @deprecated Use Vue
218
     *
219
     * @Route("/{tool}/{type}/{id}/edit", methods={"GET", "POST"})
220
     */
221
    public function editAction(Request $request, IllustrationRepository $illustrationRepo): Response
222
    {
223
        $resourceNodeId = $request->get('id');
224
225
        $repository = $this->getRepositoryFromRequest($request);
226
        $resource = $repository->getResourceFromResourceNode($resourceNodeId);
227
        $this->denyAccessUnlessValidResource($resource);
228
        $settings = $repository->getResourceSettings();
229
        $resourceNode = $resource->getResourceNode();
230
231
        $this->denyAccessUnlessGranted(
232
            ResourceNodeVoter::EDIT,
233
            $resourceNode,
234
            $this->trans('Unauthorised access to resource')
235
        );
236
237
        $this->setBreadCrumb($request, $resourceNode);
238
        $resourceNodeParentId = $resourceNode->getId();
239
240
        $routeParams = $this->getResourceParams($request);
241
        $routeParams['id'] = $resourceNodeParentId;
242
243
        $form = $repository->getForm($this->container->get('form.factory'), $resource);
244
245
        if ($resourceNode->hasEditableTextContent() && $settings->isAllowToSaveEditorToResourceFile()) {
246
            /*$form->add(
247
                $this->fileContentName,
248
                CKEditorType::class,
249
                [
250
                    'mapped' => false,
251
                    'config' => [
252
                        'filebrowserImageBrowseRoute' => 'resources_filemanager',
253
                        'filebrowserImageBrowseRouteParameters' => $routeParams,
254
                    ],
255
                ]
256
            );
257
            $content = $repository->getResourceNodeFileContent($resourceNode);
258
            $form->get($this->fileContentName)->setData($content);*/
259
        }
260
261
        $form->handleRequest($request);
262
263
        if ($form->isSubmitted() && $form->isValid()) {
264
            /** @var AbstractResource|ResourceInterface $newResource */
265
            $newResource = $form->getData();
266
267
            if ($form->has($this->fileContentName)) {
268
                $data = $form->get($this->fileContentName)->getData();
269
                $repository->updateResourceFileContent($newResource, $data);
270
            }
271
272
            $repository->updateNodeForResource($newResource);
273
274
            if ($form->has('illustration')) {
275
                $illustration = $form->get('illustration')->getData();
276
                if ($illustration) {
277
                    $illustrationRepo->addIllustration($newResource, $this->getUser(), $illustration);
278
                }
279
            }
280
281
            $this->addFlash('success', $this->trans('Updated'));
282
            $resourceNodeParentId = $newResource->getResourceNode()->getParent()->getId();
283
            $routeParams['id'] = $resourceNodeParentId;
284
285
            return $this->redirectToRoute('chamilo_core_resource_list', $routeParams);
286
        }
287
288
        return $this->render(
289
            $repository->getTemplates()->getFromAction(__FUNCTION__),
290
            [
291
                'form' => $form->createView(),
292
                'parent' => $resourceNodeParentId,
293
            ]
294
        );
295
    }
296
297
    /**
298
     * @deprecated use Vue
299
     *
300
     * Shows a resource information
301
     *
302
     * @Route("/{tool}/{type}/{id}/info", methods={"GET", "POST"}, name="chamilo_core_resource_info")
303
     */
304
    /*public function infoAction(Request $request): Response
305
    {
306
        $nodeId = $request->get('id');
307
        $repository = $this->getRepositoryFromRequest($request);
308
309
        $resource = $repository->getResourceFromResourceNode($nodeId);
310
        $this->denyAccessUnlessValidResource($resource);
311
        $resourceNode = $resource->getResourceNode();
312
313
        $this->denyAccessUnlessGranted(
314
            ResourceNodeVoter::VIEW,
315
            $resourceNode,
316
            $this->trans(sprintf('Unauthorised access to resource #%s', $nodeId))
317
        );
318
319
        $this->setBreadCrumb($request, $resourceNode);
320
321
        $tool = $request->get('tool');
322
        $type = $request->get('type');
323
324
        $form = $this->createForm(ResourceCommentType::class, null);
325
326
        $params = [
327
            'resource' => $resource,
328
            'course' => $this->getCourse(),
329
            //   'illustration' => $illustration,
330
            'tool' => $tool,
331
            'type' => $type,
332
            'comment_form' => $form->createView(),
333
        ];
334
335
        return $this->render(
336
            $repository->getTemplates()->getFromAction(__FUNCTION__, $request->isXmlHttpRequest()),
337
            $params
338
        );
339
    }*/
340
341
    /**
342
     * Preview a file. Mostly used when using a modal.
343
     *
344
     * @Route("/{tool}/{type}/{id}/preview", methods={"GET"}, name="chamilo_core_resource_preview")
345
     */
346
    /*public function previewAction(Request $request): Response
347
    {
348
        $nodeId = $request->get('id');
349
        $repository = $this->getRepositoryFromRequest($request);
350
351
        $resource = $repository->getResourceFromResourceNode($nodeId);
352
        $this->denyAccessUnlessValidResource($resource);
353
354
        $resourceNode = $resource->getResourceNode();
355
        $this->denyAccessUnlessGranted(
356
            ResourceNodeVoter::VIEW,
357
            $resourceNode,
358
            $this->trans('Unauthorised access to resource')
359
        );
360
361
        $this->setBreadCrumb($request, $resourceNode);
362
363
        $tool = $request->get('tool');
364
        $type = $request->get('type');
365
366
        $params = [
367
            'resource' => $resource,
368
            'tool' => $tool,
369
            'type' => $type,
370
        ];
371
372
        return $this->render($repository->getTemplates()->getFromAction(__FUNCTION__), $params);
373
    }*/
374
375
    /**
376
     * @deprecated use vue
377
     *
378
     * @Route("/{tool}/{type}/{id}/change_visibility", name="chamilo_core_resource_change_visibility")
379
     */
380
    public function changeVisibilityAction(Request $request): Response
381
    {
382
        $id = (int) $request->get('id');
383
384
        $repository = $this->getRepositoryFromRequest($request);
385
386
        $resource = $repository->getResourceFromResourceNode($id);
387
        $this->denyAccessUnlessValidResource($resource);
388
        /** @var AbstractResource $resource */
389
        $resourceNode = $resource->getResourceNode();
390
391
        $this->denyAccessUnlessGranted(
392
            ResourceNodeVoter::EDIT,
393
            $resourceNode,
394
            $this->trans('Unauthorised access to resource')
395
        );
396
397
        if ($this->hasCourse()) {
398
            $link = $resource->getFirstResourceLinkFromCourseSession($this->getCourse(), $this->getSession());
399
        } else {
400
            $link = $resource->getFirstResourceLink();
401
        }
402
403
        // Use repository to change settings easily.
404
        if ($link && ResourceLink::VISIBILITY_PUBLISHED === $link->getVisibility()) {
405
            $repository->setVisibilityDraft($resource);
406
        } else {
407
            $repository->setVisibilityPublished($resource);
408
        }
409
410
        $result = [
411
            'visibility' => $link->getVisibility(),
412
            'ok' => true,
413
        ];
414
415
        return new JsonResponse($result);
416
    }
417
418
    /**
419
     * @deprecated Use Vue + api platform
420
     *
421
     * @Route("/{tool}/{type}/{id}/delete", name="chamilo_core_resource_delete")
422
     */
423
    public function deleteAction(Request $request): Response
424
    {
425
        $em = $this->getDoctrine()->getManager();
426
427
        $id = $request->get('id');
428
        $resourceNode = $this->getDoctrine()->getRepository(ResourceNode::class)->find($id);
429
        $parentId = $resourceNode->getParent()->getId();
430
431
        $this->denyAccessUnlessGranted(
432
            ResourceNodeVoter::DELETE,
433
            $resourceNode,
434
            $this->trans('Unauthorised access to resource')
435
        );
436
437
        $children = $resourceNode->getChildren();
438
439
        if (!empty($children)) {
440
            /** @var ResourceNode $child */
441
            foreach ($children as $child) {
442
                $em->remove($child);
443
            }
444
        }
445
446
        $em->remove($resourceNode);
447
        $this->addFlash('success', $this->trans('Deleted').': '.$resourceNode->getSlug());
448
        $em->flush();
449
450
        $routeParams = $this->getResourceParams($request);
451
        $routeParams['id'] = $parentId;
452
453
        return $this->redirectToRoute('chamilo_core_resource_list', $routeParams);
454
    }
455
456
    /**
457
     * @deprecated Use Vue + api platform
458
     *
459
     * @Route("/{tool}/{type}/{id}/delete_mass", methods={"DELETE"}, name="chamilo_core_resource_delete_mass")
460
     */
461
    public function deleteMassAction($primaryKeys, $allPrimaryKeys, Request $request): Response
462
    {
463
        $em = $this->getDoctrine()->getManager();
464
        $repo = $this->getRepositoryFromRequest($request);
465
466
        $parentId = 0;
467
        foreach ($primaryKeys as $id) {
468
            $resource = $repo->find($id);
469
            $resourceNode = $resource->getResourceNode();
470
471
            if (null === $resourceNode) {
472
                continue;
473
            }
474
475
            $this->denyAccessUnlessGranted(
476
                ResourceNodeVoter::DELETE,
477
                $resourceNode,
478
                $this->trans('Unauthorised access to resource')
479
            );
480
481
            $parentId = $resourceNode->getParent()->getId();
482
            $em->remove($resource);
483
        }
484
485
        $this->addFlash('success', $this->trans('Deleted'));
486
        $em->flush();
487
488
        $routeParams = $this->getResourceParams($request);
489
        $routeParams['id'] = $parentId;
490
491
        return $this->redirectToRoute('chamilo_core_resource_list', $routeParams);
492
    }
493
494
    /**
495
     * Shows the associated resource file.
496
     *
497
     * @deprecated use vue
498
     *
499
     * @Route("/{tool}/{type}/{id}/view_resource", methods={"GET"}, name="chamilo_core_resource_view_resource")
500
     */
501
    /*public function viewResourceAction(Request $request, RouterInterface $router): Response
502
    {
503
        $id = $request->get('id');
504
505
        $resourceNode = $this->getResourceNodeRepository()->find($id);
506
507
        if (null === $resourceNode) {
508
            throw new FileNotFoundException('Resource not found');
509
        }
510
511
        $this->denyAccessUnlessGranted(
512
            ResourceNodeVoter::VIEW,
513
            $resourceNode,
514
            $this->trans('Unauthorised access to resource')
515
        );
516
517
        $repository = $this->getRepositoryFromRequest($request);
518
519
        $resource = $repository->getResourceFromResourceNode($id);
520
521
        $tool = $request->get('tool');
522
        $type = $request->get('type');
523
        $this->setBreadCrumb($request, $resourceNode);
524
525
        $params = [
526
            'resource' => $resource,
527
            'tool' => $tool,
528
            'type' => $type,
529
        ];
530
531
        return $this->render($repository->getTemplates()->getFromAction(__FUNCTION__), $params);
532
    }*/
533
534
    /**
535
     * View file of a resource node.
536
     *
537
     * @Route("/{tool}/{type}/{id}/view", methods={"GET"}, name="chamilo_core_resource_view")
538
     */
539
    public function viewAction(Request $request): Response
540
    {
541
        $id = $request->get('id');
542
        $filter = $request->get('filter'); // See filters definitions in /config/services.yml.
543
        $resourceNode = $this->getResourceNodeRepository()->find($id);
544
545
        if (null === $resourceNode) {
546
            throw new FileNotFoundException('Resource not found');
547
        }
548
549
        return $this->processFile($request, $resourceNode, 'show', $filter);
550
    }
551
552
    /**
553
     * Redirect resource to link.
554
     *
555
     * @Route("/{tool}/{type}/{id}/link", methods={"GET"}, name="chamilo_core_resource_link")
556
     */
557
    public function linkAction(Request $request, RouterInterface $router)
558
    {
559
        $id = $request->get('id');
560
        $resourceNode = $this->getResourceNodeRepository()->find($id);
561
562
        if (null === $resourceNode) {
563
            throw new FileNotFoundException('Resource not found');
564
        }
565
566
        $repo = $this->getRepositoryFromRequest($request);
567
        if ($repo instanceof ResourceWithLinkInterface) {
568
            $resource = $repo->getResourceFromResourceNode($resourceNode->getId());
569
            $url = $repo->getLink($resource, $router, $this->getCourseUrlQueryToArray());
570
571
            return $this->redirect($url);
572
        }
573
574
        $this->abort('No redirect');
575
    }
576
577
    /**
578
     * Download file of a resource node.
579
     *
580
     * @Route("/{tool}/{type}/{id}/download", methods={"GET"}, name="chamilo_core_resource_download")
581
     */
582
    public function downloadAction(Request $request)
583
    {
584
        $id = (int) $request->get('id');
585
        $resourceNode = $this->getResourceNodeRepository()->find($id);
586
587
        if (null === $resourceNode) {
588
            throw new FileNotFoundException('Resource not found');
589
        }
590
591
        $repo = $this->getRepositoryFromRequest($request);
592
593
        $this->denyAccessUnlessGranted(
594
            ResourceNodeVoter::VIEW,
595
            $resourceNode,
596
            $this->trans('Unauthorised access to resource')
597
        );
598
599
        // If resource node has a file just download it. Don't download the children.
600
        if ($resourceNode->hasResourceFile()) {
601
            // Redirect to download single file.
602
            return $this->processFile($request, $resourceNode, 'download');
603
        }
604
605
        $zipName = $resourceNode->getSlug().'.zip';
606
        //$rootNodePath = $resourceNode->getPathForDisplay();
607
        $resourceNodeRepo = $repo->getResourceNodeRepository();
608
        $type = $repo->getResourceType();
609
610
        $criteria = Criteria::create()
611
            ->where(Criteria::expr()->neq('resourceFile', null)) // must have a file
612
            ->andWhere(Criteria::expr()->eq('resourceType', $type)) // only download same type
613
        ;
614
615
        $qb = $resourceNodeRepo->getChildrenQueryBuilder($resourceNode);
616
        $qb->addCriteria($criteria);
617
        /** @var ArrayCollection|ResourceNode[] $children */
618
        $children = $qb->getQuery()->getResult();
619
        $count = \count($children);
620
        if (0 === $count) {
621
            $params = $this->getResourceParams($request);
622
            $params['id'] = $id;
623
624
            $this->addFlash('warning', $this->trans('No files'));
625
626
            return $this->redirectToRoute('chamilo_core_resource_list', $params);
627
        }
628
629
        $response = new StreamedResponse(
630
            function () use ($zipName, $children, $repo): void {
631
                // Define suitable options for ZipStream Archive.
632
                $options = new Archive();
633
                $options->setContentType('application/octet-stream');
634
                //initialise zipstream with output zip filename and options.
635
                $zip = new ZipStream($zipName, $options);
636
637
                /** @var ResourceNode $node */
638
                foreach ($children as $node) {
639
                    $stream = $repo->getResourceNodeFileStream($node);
640
                    $fileName = $node->getResourceFile()->getOriginalName();
641
                    //$fileToDisplay = basename($node->getPathForDisplay());
642
                    //$fileToDisplay = str_replace($rootNodePath, '', $node->getPathForDisplay());
643
                    //error_log($fileToDisplay);
644
                    $zip->addFileFromStream($fileName, $stream);
645
                }
646
                $zip->finish();
647
            }
648
        );
649
650
        $disposition = $response->headers->makeDisposition(
651
            ResponseHeaderBag::DISPOSITION_ATTACHMENT,
652
            $zipName //Transliterator::transliterate($zipName)
653
        );
654
        $response->headers->set('Content-Disposition', $disposition);
655
        $response->headers->set('Content-Type', 'application/octet-stream');
656
657
        return $response;
658
    }
659
660
    /**
661
     * Upload form.
662
     *
663
     * @deprecated use vue + api platform
664
     *
665
     * @Route("/{tool}/{type}/{id}/upload", name="chamilo_core_resource_upload", methods={"GET", "POST"},
666
     *     options={"expose"=true})
667
     */
668
    /*public function uploadAction(Request $request, $tool, $type, $id): Response
669
    {
670
        $repository = $this->getRepositoryFromRequest($request);
671
        $resourceNode = $repository->getResourceNodeRepository()->find($id);
672
673
        $this->denyAccessUnlessGranted(
674
            ResourceNodeVoter::EDIT,
675
            $resourceNode,
676
            $this->trans('Unauthorised access to resource')
677
        );
678
679
        $this->setBreadCrumb($request, $resourceNode);
680
681
        $routeParams = $this->getResourceParams($request);
682
        $routeParams['tool'] = $tool;
683
        $routeParams['type'] = $type;
684
        $routeParams['id'] = $id;
685
686
        return $this->render($repository->getTemplates()->getFromAction(__FUNCTION__), $routeParams);
687
    }*/
688
689
    /**
690
     * @return mixed|StreamedResponse
691
     */
692
    private function processFile(Request $request, ResourceNode $resourceNode, $mode = 'show', $filter = '')
693
    {
694
        $this->denyAccessUnlessGranted(
695
            ResourceNodeVoter::VIEW,
696
            $resourceNode,
697
            $this->trans('Unauthorised view access to resource')
698
        );
699
700
        $resourceFile = $resourceNode->getResourceFile();
701
702
        if (null === $resourceFile) {
703
            throw new NotFoundHttpException($this->trans('File not found for resource'));
704
        }
705
706
        $fileName = $resourceNode->getResourceFile()->getOriginalName();
707
        $mimeType = $resourceFile->getMimeType();
708
        $resourceNodeRepo = $this->getResourceNodeRepository();
709
710
        switch ($mode) {
711
            case 'download':
712
                $forceDownload = true;
713
714
                break;
715
            case 'show':
716
            default:
717
                $forceDownload = false;
718
                // If it's an image then send it to Glide.
719
                if (str_contains($mimeType, 'image')) {
720
                    $glide = $this->getGlide();
721
                    $server = $glide->getServer();
722
                    $params = $request->query->all();
723
724
                    // The filter overwrites the params from GET.
725
                    if (!empty($filter)) {
726
                        $params = $glide->getFilters()[$filter] ?? [];
727
                    }
728
729
                    // The image was cropped manually by the user, so we force to render this version,
730
                    // no matter other crop parameters.
731
                    $crop = $resourceFile->getCrop();
732
                    if (!empty($crop)) {
733
                        $params['crop'] = $crop;
734
                    }
735
736
                    $fileName = $resourceNodeRepo->getFilename($resourceFile);
737
738
                    return $server->getImageResponse($fileName, $params);
739
                }
740
741
                break;
742
        }
743
744
        $stream = $resourceNodeRepo->getResourceNodeFileStream($resourceNode);
745
746
        $response = new StreamedResponse(
747
            function () use ($stream): void {
748
                stream_copy_to_stream($stream, fopen('php://output', 'wb'));
749
            }
750
        );
751
        $disposition = $response->headers->makeDisposition(
752
            $forceDownload ? ResponseHeaderBag::DISPOSITION_ATTACHMENT : ResponseHeaderBag::DISPOSITION_INLINE,
753
            $fileName
754
        //Transliterator::transliterate($fileName)
755
        );
756
        $response->headers->set('Content-Disposition', $disposition);
757
        $response->headers->set('Content-Type', $mimeType ?: 'application/octet-stream');
758
759
        return $response;
760
    }
761
762
    /**
763
     * @return RedirectResponse|Response
764
     */
765
    private function createResource(Request $request, string $fileType = 'file')
0 ignored issues
show
Unused Code introduced by
The method createResource() is not used, and could be removed.

This check looks for private methods that have been defined, but are not used inside the class.

Loading history...
766
    {
767
        $resourceNodeParentId = $request->get('id');
768
        $repository = $this->getRepositoryFromRequest($request);
769
770
        // Default parent node is course.
771
        $parentNode = $this->getParentResourceNode($request);
772
773
        $this->setBreadCrumb($request, $parentNode);
774
775
        $this->denyAccessUnlessGranted(
776
            ResourceNodeVoter::CREATE,
777
            $parentNode,
778
            $this->trans('Unauthorised access to resource')
779
        );
780
781
        $form = $repository->getForm($this->container->get('form.factory'), null);
782
        $settings = $repository->getResourceSettings();
783
784
        if ('file' === $fileType && $settings->isAllowToSaveEditorToResourceFile()) {
785
            /*$resourceParams = $this->getResourceParams($request);
786
            $form->add(
787
                $this->fileContentName,
788
                CKEditorType::class,
789
                [
790
                    'mapped' => false,
791
                    'config' => [
792
                        'filebrowserImageBrowseRoute' => 'resources_filemanager',
793
                        'filebrowserImageBrowseRouteParameters' => $resourceParams,
794
                        'fullPage' => true,
795
                    ],
796
                ]
797
            );*/
798
        }
799
800
        $form->handleRequest($request);
801
        if ($form->isSubmitted() && $form->isValid()) {
802
            $em = $this->getDoctrine()->getManager();
803
            $course = $this->getCourse()->getId();
804
            $course = $this->getDoctrine()->getRepository(Course::class)->find($course);
805
            $session = $this->getSession();
806
807
            // @var AbstractResource $newResource
808
            /*$newResource = $repository->setResourceProperties($form, $course, $session, $fileType);
809
810
            $file = null;
811
            if ('file' === $fileType && $settings->isAllowToSaveEditorToResourceFile()) {
812
                $content = $form->get($this->fileContentName)->getViewData();
813
                $newResource->setTitle($newResource->getTitle().'.html');
814
                $fileName = $newResource->getTitle();
815
816
                $handle = tmpfile();
817
                fwrite($handle, $content);
818
                $meta = stream_get_meta_data($handle);
819
                $file = new UploadedFile($meta['uri'], $fileName, 'text/html', null, true);
820
            }
821
            $newResource->addCourseLink(
822
                $course,
823
                $session
824
            );
825
            $em->persist($newResource);
826
            $em->flush();
827
828
            $repository->addFile($newResource, $file);
829
            $em->flush();*/
830
831
            // Loops all sharing options
832
            /*foreach ($shareList as $share) {
833
                $idList = [];
834
                if (isset($share['search'])) {
835
                    $idList = explode(',', $share['search']);
836
                }
837
838
                $resourceRight = null;
839
                if (isset($share['mask'])) {
840
                    $resourceRight = new ResourceRight();
841
                    $resourceRight
842
                        ->setMask($share['mask'])
843
                        ->setRole($share['role'])
844
                    ;
845
                }
846
847
                // Build links
848
                switch ($share['sharing']) {
849
                    case 'everyone':
850
                        $repository->addResourceToEveryone(
851
                            $resourceNode,
852
                            $resourceRight
853
                        );
854
                        break;
855
                    case 'course':
856
                        $repository->addResourceToCourse(
857
                            $resourceNode,
858
                            $course,
859
                            $resourceRight
860
                        );
861
                        break;
862
                    case 'session':
863
                        $repository->addResourceToSession(
864
                            $resourceNode,
865
                            $course,
866
                            $session,
867
                            $resourceRight
868
                        );
869
                        break;
870
                    case 'user':
871
                        // Only for me
872
                        if (isset($share['only_me'])) {
873
                            $repository->addResourceOnlyToMe($resourceNode);
874
                        } else {
875
                            // To other users
876
                            $repository->addResourceToUserList($resourceNode, $idList);
877
                        }
878
                        break;
879
                    case 'group':
880
                        // @todo
881
                        break;
882
                }*/
883
            //}
884
            $em->flush();
885
            $this->addFlash('success', $this->trans('Saved'));
886
887
            $params = $this->getResourceParams($request);
888
            $params['id'] = $resourceNodeParentId;
889
890
            return $this->redirectToRoute(
891
                'chamilo_core_resource_list',
892
                $params
893
            );
894
        }
895
896
        $template = null;
897
        switch ($fileType) {
898
            case 'folder':
899
                $template = $repository->getTemplates()->getFromAction('newFolderAction');
900
901
                break;
902
            case 'file':
903
                $template = $repository->getTemplates()->getFromAction('newAction');
904
905
                break;
906
        }
907
908
        if ($template) {
909
            $routeParams = $this->getResourceParams($request);
910
            $routeParams['form'] = $form->createView();
911
            $routeParams['parent'] = $resourceNodeParentId;
912
            $routeParams['file_type'] = $fileType;
913
914
            return $this->render($template, $routeParams);
915
        }
916
917
        throw $this->createAccessDeniedException();
918
    }
919
}
920