Passed
Push — master ( 32285e...9f8e73 )
by Julito
07:38
created

ResourceRepository::addResourceToCourseGroup()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 19
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 3
eloc 11
c 1
b 0
f 1
nc 2
nop 2
dl 0
loc 19
rs 9.9
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
namespace Chamilo\CoreBundle\Repository;
6
7
use APY\DataGridBundle\Grid\Action\RowAction;
8
use APY\DataGridBundle\Grid\Row;
9
use Chamilo\CoreBundle\Component\Utils\ResourceSettings;
10
use Chamilo\CoreBundle\Entity\Course;
11
use Chamilo\CoreBundle\Entity\Resource\AbstractResource;
12
use Chamilo\CoreBundle\Entity\Resource\ResourceFile;
13
use Chamilo\CoreBundle\Entity\Resource\ResourceInterface;
14
use Chamilo\CoreBundle\Entity\Resource\ResourceLink;
15
use Chamilo\CoreBundle\Entity\Resource\ResourceNode;
16
use Chamilo\CoreBundle\Entity\Resource\ResourceRight;
17
use Chamilo\CoreBundle\Entity\Resource\ResourceType;
18
use Chamilo\CoreBundle\Entity\Session;
19
use Chamilo\CoreBundle\Entity\Usergroup;
20
use Chamilo\CoreBundle\Security\Authorization\Voter\ResourceNodeVoter;
21
use Chamilo\CoreBundle\ToolChain;
22
use Chamilo\CourseBundle\Entity\CDocument;
23
use Chamilo\CourseBundle\Entity\CGroupInfo;
24
use Chamilo\UserBundle\Entity\User;
25
use Cocur\Slugify\SlugifyInterface;
26
use Doctrine\ORM\EntityManager;
27
use Doctrine\ORM\EntityRepository;
28
use Doctrine\ORM\EntityRepository as BaseEntityRepository;
29
use Doctrine\ORM\Query\Expr\Join;
30
use Doctrine\ORM\QueryBuilder;
31
use League\Flysystem\FilesystemInterface;
32
use League\Flysystem\MountManager;
33
use Symfony\Component\Filesystem\Exception\FileNotFoundException;
34
use Symfony\Component\Form\FormFactory;
35
use Symfony\Component\Form\FormInterface;
36
use Symfony\Component\HttpFoundation\File\UploadedFile;
37
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
38
use Symfony\Component\Routing\RouterInterface;
39
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
40
41
/**
42
 * Class ResourceRepository.
43
 * Extends EntityRepository is needed to process settings.
44
 */
45
class ResourceRepository extends BaseEntityRepository
46
{
47
    /**
48
     * @var EntityRepository
49
     */
50
    protected $repository;
51
52
    /**
53
     * @var FilesystemInterface
54
     */
55
    protected $fs;
56
57
    /**
58
     * @var EntityManager
59
     */
60
    protected $entityManager;
61
62
    /**
63
     * The entity class FQN.
64
     *
65
     * @var string
66
     */
67
    protected $className;
68
69
    /** @var RouterInterface */
70
    protected $router;
71
72
    protected $resourceNodeRepository;
73
74
    /**
75
     * @var AuthorizationCheckerInterface
76
     */
77
    protected $authorizationChecker;
78
79
    /** @var MountManager */
80
    protected $mountManager;
81
82
    /** @var SlugifyInterface */
83
    protected $slugify;
84
    /** @var ToolChain */
85
    protected $toolChain;
86
87
    /**
88
     * ResourceRepository constructor.
89
     */
90
    public function __construct(
91
        AuthorizationCheckerInterface $authorizationChecker,
92
        EntityManager $entityManager,
93
        MountManager $mountManager,
94
        RouterInterface $router,
95
        SlugifyInterface $slugify,
96
        ToolChain $toolChain,
97
        string $className
98
    ) {
99
        $this->authorizationChecker = $authorizationChecker;
100
        $this->repository = $entityManager->getRepository($className);
101
102
        // Flysystem mount name is saved in config/packages/oneup_flysystem.yaml @todo add it as a service.
103
        $this->fs = $mountManager->getFilesystem('resources_fs');
104
        $this->mountManager = $mountManager;
105
        $this->router = $router;
106
        $this->resourceNodeRepository = $entityManager->getRepository('ChamiloCoreBundle:Resource\ResourceNode');
107
        $this->slugify = $slugify;
108
        $this->toolChain = $toolChain;
109
    }
110
111
    public function getAuthorizationChecker(): AuthorizationCheckerInterface
112
    {
113
        return $this->authorizationChecker;
114
    }
115
116
    public function create()
117
    {
118
        return new $this->className();
119
    }
120
121
    public function getRouter(): RouterInterface
122
    {
123
        return $this->router;
124
    }
125
126
    /**
127
     * @return ResourceNodeRepository
128
     */
129
    public function getResourceNodeRepository()
130
    {
131
        return $this->resourceNodeRepository;
132
    }
133
134
    /**
135
     * @return FilesystemInterface
136
     */
137
    public function getFileSystem()
138
    {
139
        return $this->fs;
140
    }
141
142
    public function getEntityManager(): EntityManager
143
    {
144
        return $this->getRepository()->getEntityManager();
145
    }
146
147
    /**
148
     * @return EntityRepository
149
     */
150
    public function getRepository()
151
    {
152
        return $this->repository;
153
    }
154
155
    /**
156
     * @return FormInterface
157
     */
158
    public function getForm(FormFactory $formFactory, AbstractResource $resource = null, $options = [])
159
    {
160
        $className = $this->repository->getClassName();
161
        $shortName = (new \ReflectionClass($className))->getShortName();
162
163
        // @todo remove hardcode class loading
164
        $formType = 'Chamilo\CoreBundle\Form\Resource\\'.$shortName.'Type';
165
        if (null === $resource) {
166
            $resource = new $className();
167
        }
168
169
        return $formFactory->create($formType, $resource, $options);
170
    }
171
172
    /**
173
     * @param null $lockMode
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $lockMode is correct as it would always require null to be passed?
Loading history...
174
     * @param null $lockVersion
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $lockVersion is correct as it would always require null to be passed?
Loading history...
175
     *
176
     * @return ResourceInterface
177
     */
178
    public function find($id, $lockMode = null, $lockVersion = null)
179
    {
180
        return $this->getRepository()->find($id);
181
    }
182
183
    public function findOneBy(array $criteria, array $orderBy = null): ?ResourceInterface
184
    {
185
        return $this->getRepository()->findOneBy($criteria, $orderBy);
186
    }
187
188
    public function createNodeForResource(ResourceInterface $resource, User $creator, ResourceNode $parent = null, UploadedFile $file = null): ResourceNode
189
    {
190
        $em = $this->getEntityManager();
191
192
        $resourceType = $this->getResourceType();
193
        $resourceNode = new ResourceNode();
194
        $resourceName = $resource->getResourceName();
195
        $extension = $this->slugify->slugify(pathinfo($resourceName, PATHINFO_EXTENSION));
196
197
        if (empty($extension)) {
198
            $slug = $this->slugify->slugify($resourceName);
199
        } else {
200
            $originalExtension = pathinfo($resourceName, PATHINFO_EXTENSION);
201
            $originalBasename = \basename($resourceName, $originalExtension);
202
            $slug = sprintf('%s.%s', $this->slugify->slugify($originalBasename), $originalExtension);
203
        }
204
205
        $resourceNode
206
            ->setSlug($slug)
207
            ->setCreator($creator)
208
            ->setResourceType($resourceType)
209
        ;
210
211
        if (null !== $parent) {
212
            $resourceNode->setParent($parent);
213
        }
214
215
        $resource->setResourceNode($resourceNode);
0 ignored issues
show
Bug introduced by
The method setResourceNode() does not exist on Chamilo\CoreBundle\Entit...ource\ResourceInterface. Since it exists in all sub-types, consider adding an abstract or default implementation to Chamilo\CoreBundle\Entit...ource\ResourceInterface. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

215
        $resource->/** @scrutinizer ignore-call */ 
216
                   setResourceNode($resourceNode);
Loading history...
216
        $em->persist($resourceNode);
217
        $em->persist($resource);
218
219
        if (null !== $file) {
220
            $this->addFile($resource, $file);
221
        }
222
223
        return $resourceNode;
224
    }
225
226
    public function updateNodeForResource(ResourceInterface $resource): ResourceNode
227
    {
228
        $em = $this->getEntityManager();
229
230
        $resourceNode = $resource->getResourceNode();
231
        $resourceName = $resource->getResourceName();
232
233
        if ($resourceNode->hasResourceFile()) {
234
            $resourceFile = $resourceNode->getResourceFile();
235
            if ($resourceFile) {
0 ignored issues
show
introduced by
$resourceFile is of type Chamilo\CoreBundle\Entity\Resource\ResourceFile, thus it always evaluated to true.
Loading history...
236
                $originalName = $resourceFile->getOriginalName();
237
                $originalExtension = pathinfo($originalName, PATHINFO_EXTENSION);
238
239
                $originalBasename = \basename($resourceName, $originalExtension);
240
                $slug = sprintf(
241
                    '%s.%s',
242
                    $this->slugify->slugify($originalBasename),
243
                    $this->slugify->slugify($originalExtension)
244
                );
245
246
                $newOriginalName = sprintf('%s.%s', $resourceName, $originalExtension);
247
                $resourceFile->setOriginalName($newOriginalName);
248
249
                $em->persist($resourceFile);
250
            }
251
        } else {
252
            $slug = $this->slugify->slugify($resourceName);
253
        }
254
255
        $resourceNode->setSlug($slug);
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $slug does not seem to be defined for all execution paths leading up to this point.
Loading history...
256
257
        $em->persist($resourceNode);
258
        $em->persist($resource);
259
260
        $em->flush();
261
262
        return $resourceNode;
263
    }
264
265
    public function addFile(ResourceInterface $resource, UploadedFile $file): ?ResourceFile
266
    {
267
        $resourceNode = $resource->getResourceNode();
268
269
        if (null === $resourceNode) {
270
            throw new \LogicException('Resource node is null');
271
        }
272
273
        $resourceFile = $resourceNode->getResourceFile();
274
        if (null === $resourceFile) {
275
            $resourceFile = new ResourceFile();
276
        }
277
278
        $em = $this->getEntityManager();
279
        //$resourceFile->setMimeType($file->getMimeType());
280
        $resourceFile->setFile($file);
281
        $resourceFile->setName($resource->getResourceName());
282
        $em->persist($resourceFile);
283
284
        $resourceNode->setResourceFile($resourceFile);
285
        $em->persist($resourceNode);
286
287
        return $resourceFile;
288
    }
289
290
    public function addResourceNode(AbstractResource $resource, User $creator, AbstractResource $parent = null): ResourceNode
291
    {
292
        if (null !== $parent) {
293
            $parent = $parent->getResourceNode();
294
        }
295
296
        return $this->createNodeForResource($resource, $creator, $parent);
297
    }
298
299
    public function addResourceToCourse(AbstractResource $resource, int $visibility, User $creator, Course $course, Session $session = null, CGroupInfo $group = null)
300
    {
301
        $node = $this->createNodeForResource($resource, $creator, $course->getResourceNode());
302
303
        $this->addResourceNodeToCourse($node, $visibility, $course, $session, $group);
304
    }
305
306
    public function addResourceToCourseWithParent(AbstractResource $resource, ResourceNode $parentNode, int $visibility, User $creator, Course $course, Session $session = null, CGroupInfo $group = null)
307
    {
308
        $node = $this->createNodeForResource($resource, $creator, $parentNode);
309
310
        $this->addResourceNodeToCourse($node, $visibility, $course, $session, $group);
311
    }
312
313
    /**
314
     * @param $visibility
315
     * @param $course
316
     * @param $session
317
     * @param $group
318
     */
319
    public function addResourceNodeToCourse(ResourceNode $resourceNode, $visibility, $course, $session, $group): void
320
    {
321
        $visibility = (int) $visibility;
322
        if (empty($visibility)) {
323
            $visibility = ResourceLink::VISIBILITY_PUBLISHED;
324
        }
325
326
        $link = new ResourceLink();
327
        $link
328
            ->setCourse($course)
329
            ->setSession($session)
330
            ->setGroup($group)
331
            //->setUser($toUser)
332
            ->setResourceNode($resourceNode)
333
            ->setVisibility($visibility)
334
        ;
335
336
        $rights = [];
337
        switch ($visibility) {
338
            case ResourceLink::VISIBILITY_PENDING:
339
            case ResourceLink::VISIBILITY_DRAFT:
340
                $editorMask = ResourceNodeVoter::getEditorMask();
341
                $resourceRight = new ResourceRight();
342
                $resourceRight
343
                    ->setMask($editorMask)
344
                    ->setRole(ResourceNodeVoter::ROLE_CURRENT_COURSE_TEACHER)
345
                ;
346
                $rights[] = $resourceRight;
347
348
                break;
349
        }
350
351
        if (!empty($rights)) {
352
            foreach ($rights as $right) {
353
                $link->addResourceRight($right);
354
            }
355
        }
356
357
        $em = $this->getEntityManager();
358
        $em->persist($link);
359
    }
360
361
    public function addResourceToMe(ResourceNode $resourceNode): ResourceLink
362
    {
363
        $resourceLink = new ResourceLink();
364
        $resourceLink
365
            ->setResourceNode($resourceNode)
366
        ;
367
368
        $this->getEntityManager()->persist($resourceLink);
369
        $this->getEntityManager()->flush();
370
371
        return $resourceLink;
372
    }
373
374
    public function addResourceToEveryone(ResourceNode $resourceNode, ResourceRight $right): ResourceLink
375
    {
376
        $resourceLink = new ResourceLink();
377
        $resourceLink
378
            ->setResourceNode($resourceNode)
379
            ->addResourceRight($right)
380
        ;
381
382
        $this->getEntityManager()->persist($resourceLink);
383
        $this->getEntityManager()->flush();
384
385
        return $resourceLink;
386
    }
387
388
    public function addResourceToUser(ResourceNode $resourceNode, User $toUser): ResourceLink
389
    {
390
        $resourceLink = $this->addResourceNodeToUser($resourceNode, $toUser);
391
        $this->getEntityManager()->persist($resourceLink);
392
393
        return $resourceLink;
394
    }
395
396
    public function addResourceNodeToUser(ResourceNode $resourceNode, User $toUser): ResourceLink
397
    {
398
        $resourceLink = new ResourceLink();
399
        $resourceLink
400
            ->setResourceNode($resourceNode)
401
            ->setUser($toUser);
402
403
        return $resourceLink;
404
    }
405
406
    public function addResourceToCourseGroup(
407
        ResourceNode $resourceNode,
408
        CGroupInfo $group
409
    ) {
410
        $exists = $resourceNode->getResourceLinks()->exists(function ($key, $element) use ($group) {
411
            if ($element->getGroup()) {
412
                return $group->getIid() == $element->getGroup()->getIid();
413
            }
414
        });
415
416
        if ($exists === false) {
417
            $resourceLink = new ResourceLink();
418
            $resourceLink
419
                ->setResourceNode($resourceNode)
420
                ->setGroup($group)
421
                ->setVisibility(ResourceLink::VISIBILITY_PUBLISHED);
422
            $this->getEntityManager()->persist($resourceLink);
423
424
            return $resourceLink;
425
        }
426
    }
427
428
    /*public function addResourceToSession(
429
        ResourceNode $resourceNode,
430
        Course $course,
431
        Session $session,
432
        ResourceRight $right
433
    ) {
434
        $resourceLink = $this->addResourceToCourse(
435
            $resourceNode,
436
            $course,
437
            $right
438
        );
439
        $resourceLink->setSession($session);
440
        $this->getEntityManager()->persist($resourceLink);
441
442
        return $resourceLink;
443
    }*/
444
445
446
    /**
447
     * @return ResourceLink
448
     */
449
    public function addResourceToGroup(
450
        ResourceNode $resourceNode,
451
        Usergroup $group,
452
        ResourceRight $right
453
    ) {
454
        $resourceLink = new ResourceLink();
455
        $resourceLink
456
            ->setResourceNode($resourceNode)
457
            ->setUserGroup($group)
458
            ->addResourceRight($right);
459
460
        return $resourceLink;
461
    }
462
463
    /**
464
     * @param array $userList User id list
465
     */
466
    public function addResourceToUserList(ResourceNode $resourceNode, array $userList)
467
    {
468
        $em = $this->getEntityManager();
469
470
        if (!empty($userList)) {
471
            foreach ($userList as $userId) {
472
                $toUser = $em->getRepository('ChamiloUserBundle:User')->find($userId);
473
474
                $resourceLink = $this->addResourceNodeToUser($resourceNode, $toUser);
475
                $em->persist($resourceLink);
476
            }
477
        }
478
    }
479
480
    /**
481
     * @return ResourceType
482
     */
483
    public function getResourceType()
484
    {
485
        $em = $this->getEntityManager();
486
        $service = get_class($this);
487
        $name = $this->toolChain->getResourceTypeNameFromRepository($service);
488
        $repo = $em->getRepository('ChamiloCoreBundle:Resource\ResourceType');
489
490
        return $repo->findOneBy(['name' => $name]);
491
    }
492
493
    /**
494
     * @return QueryBuilder
495
     */
496
    public function getResourcesByCourse(Course $course, Session $session = null, CGroupInfo $group = null, ResourceNode $parentNode = null)
497
    {
498
        $repo = $this->getRepository();
499
        $className = $repo->getClassName();
500
        $checker = $this->getAuthorizationChecker();
501
        $reflectionClass = $repo->getClassMetadata()->getReflectionClass();
502
503
        // Check if this resource type requires to load the base course resources when using a session
504
        $loadBaseSessionContent = $reflectionClass->hasProperty('loadCourseResourcesInSession');
505
506
        $type = $this->getResourceType();
507
508
        $qb = $repo->getEntityManager()->createQueryBuilder()
509
            ->select('resource')
510
            ->from($className, 'resource')
511
            ->innerJoin(
512
                ResourceNode::class,
513
                'node',
514
                Join::WITH,
515
                'resource.resourceNode = node.id'
516
            )
517
            ->innerJoin('node.resourceLinks', 'links')
518
            ->where('node.resourceType = :type')
519
            ->setParameter('type', $type);
520
        $qb
521
            ->andWhere('links.course = :course')
522
            ->setParameter('course', $course)
523
        ;
524
525
        $isAdmin = $checker->isGranted('ROLE_ADMIN') ||
526
            $checker->isGranted('ROLE_CURRENT_COURSE_TEACHER');
527
528
        // Do not show deleted resources
529
530
        $qb
531
            ->andWhere('links.visibility != :visibilityDeleted')
532
            ->setParameter('visibilityDeleted', ResourceLink::VISIBILITY_DELETED)
533
        ;
534
535
        if (false === $isAdmin) {
536
            $qb
537
                ->andWhere('links.visibility = :visibility')
538
                ->setParameter('visibility', ResourceLink::VISIBILITY_PUBLISHED)
539
            ;
540
            // @todo Add start/end visibility restrictrions
541
        }
542
543
        if (null === $session) {
544
            $qb->andWhere('links.session IS NULL');
545
        } else {
546
            if ($loadBaseSessionContent) {
547
                // Load course base content.
548
                $qb->andWhere('links.session = :session OR links.session IS NULL');
549
                $qb->setParameter('session', $session);
550
            } else {
551
                // Load only session resources.
552
                $qb->andWhere('links.session = :session');
553
                $qb->setParameter('session', $session);
554
            }
555
        }
556
557
        if (null !== $parentNode) {
558
            $qb->andWhere('node.parent = :parentNode');
559
            $qb->setParameter('parentNode', $parentNode);
560
        }
561
562
        if (null === $group) {
563
            $qb->andWhere('links.group IS NULL');
564
        }
565
566
        ///var_dump($qb->getQuery()->getSQL(), $type->getId(), $parentNode->getId());exit;
567
568
        return $qb;
569
    }
570
571
    /**
572
     * @return QueryBuilder
573
     */
574
    public function getResourcesByCreator(User $user, ResourceNode $parentNode = null)
575
    {
576
        $repo = $this->getRepository();
577
        $className = $repo->getClassName();
578
579
        $qb = $repo->getEntityManager()->createQueryBuilder()
580
            ->select('resource')
581
            ->from($className, 'resource')
582
            ->innerJoin(
583
                ResourceNode::class,
584
                'node',
585
                Join::WITH,
586
                'resource.resourceNode = node.id'
587
            )
588
            //->innerJoin('node.resourceLinks', 'links')
589
            //->where('node.resourceType = :type')
590
            //->setParameter('type',$type)
591
            ;
592
        /*$qb
593
            ->andWhere('links.visibility = :visibility')
594
            ->setParameter('visibility', ResourceLink::VISIBILITY_PUBLISHED)
595
        ;*/
596
597
        if (null !== $parentNode) {
598
            $qb->andWhere('node.parent = :parentNode');
599
            $qb->setParameter('parentNode', $parentNode);
600
        }
601
602
        $qb->andWhere('node.creator = :creator');
603
        $qb->setParameter('creator', $user);
604
        //var_dump($qb->getQuery()->getSQL(), $parentNode->getId());exit;
605
606
        return $qb;
607
    }
608
609
    public function getResourceFromResourceNode($resourceNodeId): ?AbstractResource
610
    {
611
        return $this->getRepository()->findOneBy(['resourceNode' => $resourceNodeId]);
612
    }
613
614
    public function rowCanBeEdited(RowAction $action, Row $row, Session $session = null): ?RowAction
615
    {
616
        if (null !== $session) {
617
            /** @var AbstractResource $entity */
618
            $entity = $row->getEntity();
619
            $hasSession = $entity->getResourceNode()->hasSession($session);
620
            if ($hasSession->count() > 0) {
621
                return $action;
622
            }
623
624
            return null;
625
        }
626
627
        return $action;
628
    }
629
630
    /**
631
     * Deletes several entities: AbstractResource (Ex: CDocument, CQuiz), ResourceNode,
632
     * ResourceLinks and ResourceFile (including files via Flysystem).
633
     */
634
    public function hardDelete(AbstractResource $resource)
635
    {
636
        $em = $this->getEntityManager();
637
        $em->remove($resource);
638
        $em->flush();
639
    }
640
641
    public function getResourceFileContent(AbstractResource $resource): string
642
    {
643
        try {
644
            $resourceNode = $resource->getResourceNode();
645
            if ($resourceNode->hasResourceFile()) {
646
                $resourceFile = $resourceNode->getResourceFile();
647
                $fileName = $resourceFile->getFile()->getPathname();
648
649
                return $this->fs->read($fileName);
650
            }
651
652
            return '';
653
        } catch (\Throwable $exception) {
654
            throw new FileNotFoundException($resource);
655
        }
656
    }
657
658
    public function getResourceNodeFileContent(ResourceNode $resourceNode): string
659
    {
660
        try {
661
            if ($resourceNode->hasResourceFile()) {
662
                $resourceFile = $resourceNode->getResourceFile();
663
                $fileName = $resourceFile->getFile()->getPathname();
664
665
                return $this->fs->read($fileName);
666
            }
667
668
            return '';
669
        } catch (\Throwable $exception) {
670
            throw new FileNotFoundException($resourceNode);
671
        }
672
    }
673
674
    public function getResourceNodeFileStream(ResourceNode $resourceNode)
675
    {
676
        try {
677
            if ($resourceNode->hasResourceFile()) {
678
                $resourceFile = $resourceNode->getResourceFile();
679
                $fileName = $resourceFile->getFile()->getPathname();
680
681
                return $this->fs->readStream($fileName);
682
            }
683
684
            return '';
685
        } catch (\Throwable $exception) {
686
            throw new FileNotFoundException($resourceNode);
687
        }
688
    }
689
690
    public function getResourceFileUrl(AbstractResource $resource, array $extraParams = [], $referenceType = null): string
691
    {
692
        try {
693
            $resourceNode = $resource->getResourceNode();
694
            if ($resourceNode->hasResourceFile()) {
695
                $params = [
696
                    'tool' => $resourceNode->getResourceType()->getTool(),
697
                    'type' => $resourceNode->getResourceType(),
698
                    'id' => $resourceNode->getId(),
699
                ];
700
701
                if (!empty($extraParams)) {
702
                    $params = array_merge($params, $extraParams);
703
                }
704
705
                $referenceType = $referenceType ?? UrlGeneratorInterface::ABSOLUTE_PATH;
706
707
                return $this->router->generate('chamilo_core_resource_view', $params, $referenceType);
708
            }
709
710
            return '';
711
        } catch (\Throwable $exception) {
712
            throw new FileNotFoundException($resource);
713
        }
714
    }
715
716
    public function getResourceSettings(): ResourceSettings
717
    {
718
        $settings = new ResourceSettings();
719
        $settings
720
            ->setAllowNodeCreation(false)
721
            ->setAllowResourceCreation(false)
722
            ->setAllowResourceUpload(false)
723
        ;
724
725
        return $settings;
726
    }
727
728
    /**
729
     * @param string $content
730
     *
731
     * @return bool
732
     */
733
    public function updateResourceFileContent(AbstractResource $resource, $content)
734
    {
735
        try {
736
            $resourceNode = $resource->getResourceNode();
737
            if ($resourceNode->hasResourceFile()) {
738
                $resourceFile = $resourceNode->getResourceFile();
739
                if ($resourceFile) {
0 ignored issues
show
introduced by
$resourceFile is of type Chamilo\CoreBundle\Entity\Resource\ResourceFile, thus it always evaluated to true.
Loading history...
740
                    $fileName = $resourceFile->getFile()->getPathname();
741
                    $this->fs->update($fileName, $content);
742
                    $size = $this->fs->getSize($fileName);
743
                    if ($resource instanceof CDocument) {
744
                        $resource->setSize($size);
745
                    }
746
                    $this->entityManager->persist($resource);
747
748
                    return true;
749
                }
750
            }
751
752
            return false;
753
        } catch (\Throwable $exception) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
754
        }
755
    }
756
757
    /**
758
     * Change all links visibility to DELETED.
759
     */
760
    public function softDelete(AbstractResource $resource)
761
    {
762
        $this->setLinkVisibility($resource, ResourceLink::VISIBILITY_DELETED);
763
    }
764
765
    public function setVisibilityPublished(AbstractResource $resource)
766
    {
767
        $this->setLinkVisibility($resource, ResourceLink::VISIBILITY_PUBLISHED);
768
    }
769
770
    public function setVisibilityDraft(AbstractResource $resource)
771
    {
772
        $this->setLinkVisibility($resource, ResourceLink::VISIBILITY_DRAFT);
773
    }
774
775
    public function setVisibilityPending(AbstractResource $resource)
776
    {
777
        $this->setLinkVisibility($resource, ResourceLink::VISIBILITY_PENDING);
778
    }
779
780
    private function setLinkVisibility(AbstractResource $resource, int $visibility, bool $recursive = true): bool
781
    {
782
        $resourceNode = $resource->getResourceNode();
783
784
        if (null === $resourceNode) {
785
            return false;
786
        }
787
788
        $em = $this->getEntityManager();
789
        if ($recursive) {
790
            $children = $resourceNode->getChildren();
791
            if (!empty($children)) {
792
                /** @var ResourceNode $child */
793
                foreach ($children as $child) {
794
                    $criteria = ['resourceNode' => $child];
795
                    $childDocument = $this->getRepository()->findOneBy($criteria);
796
                    if ($childDocument) {
797
                        $this->setLinkVisibility($childDocument, $visibility);
798
                    }
799
                }
800
            }
801
        }
802
803
        $links = $resourceNode->getResourceLinks();
804
805
        if (!empty($links)) {
806
            /** @var ResourceLink $link */
807
            foreach ($links as $link) {
808
                $link->setVisibility($visibility);
809
                if (ResourceLink::VISIBILITY_DRAFT === $visibility) {
810
                    $editorMask = ResourceNodeVoter::getEditorMask();
811
                    $rights = [];
812
                    $resourceRight = new ResourceRight();
813
                    $resourceRight
814
                        ->setMask($editorMask)
815
                        ->setRole(ResourceNodeVoter::ROLE_CURRENT_COURSE_TEACHER)
816
                        ->setResourceLink($link)
817
                    ;
818
                    $rights[] = $resourceRight;
819
820
                    if (!empty($rights)) {
821
                        $link->setResourceRight($rights);
822
                    }
823
                } else {
824
                    $link->setResourceRight([]);
825
                }
826
                $em->persist($link);
827
            }
828
        }
829
        $em->flush();
830
831
        return true;
832
    }
833
}
834