Completed
Push — master ( d4770b...bab70a )
by Julito
18:22 queued 09:08
created

ResourceRepository::updateNodeForResource()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 37
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 23
c 1
b 0
f 0
nc 3
nop 1
dl 0
loc 37
rs 9.552
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\ResourceLink;
14
use Chamilo\CoreBundle\Entity\Resource\ResourceNode;
15
use Chamilo\CoreBundle\Entity\Resource\ResourceRight;
16
use Chamilo\CoreBundle\Entity\Resource\ResourceType;
17
use Chamilo\CoreBundle\Entity\Session;
18
use Chamilo\CoreBundle\Entity\Usergroup;
19
use Chamilo\CoreBundle\Security\Authorization\Voter\ResourceNodeVoter;
20
use Chamilo\CoreBundle\ToolChain;
21
use Chamilo\CourseBundle\Entity\CDocument;
22
use Chamilo\CourseBundle\Entity\CGroupInfo;
23
use Chamilo\UserBundle\Entity\User;
24
use Cocur\Slugify\SlugifyInterface;
25
use Doctrine\ORM\EntityManager;
26
use Doctrine\ORM\EntityRepository;
27
use Doctrine\ORM\EntityRepository as BaseEntityRepository;
28
use Doctrine\ORM\Query\Expr\Join;
29
use Doctrine\ORM\QueryBuilder;
30
use League\Flysystem\FilesystemInterface;
31
use League\Flysystem\MountManager;
32
use Symfony\Component\Filesystem\Exception\FileNotFoundException;
33
use Symfony\Component\Form\FormFactory;
34
use Symfony\Component\Form\FormInterface;
35
use Symfony\Component\HttpFoundation\File\UploadedFile;
36
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
37
use Symfony\Component\Routing\RouterInterface;
38
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
39
40
/**
41
 * Class ResourceRepository.
42
 * Extends EntityRepository is needed to process settings.
43
 */
44
class ResourceRepository extends BaseEntityRepository
45
{
46
    /**
47
     * @var EntityRepository
48
     */
49
    protected $repository;
50
51
    /**
52
     * @var FilesystemInterface
53
     */
54
    protected $fs;
55
56
    /**
57
     * @var EntityManager
58
     */
59
    protected $entityManager;
60
61
    /**
62
     * The entity class FQN.
63
     *
64
     * @var string
65
     */
66
    protected $className;
67
68
    /** @var RouterInterface */
69
    protected $router;
70
71
    protected $resourceNodeRepository;
72
73
    /**
74
     * @var AuthorizationCheckerInterface
75
     */
76
    protected $authorizationChecker;
77
78
    /** @var MountManager */
79
    protected $mountManager;
80
81
    /** @var SlugifyInterface */
82
    protected $slugify;
83
    /** @var ToolChain */
84
    protected $toolChain;
85
86
    /**
87
     * ResourceRepository constructor.
88
     */
89
    public function __construct(
90
        AuthorizationCheckerInterface $authorizationChecker,
91
        EntityManager $entityManager,
92
        MountManager $mountManager,
93
        RouterInterface $router,
94
        SlugifyInterface $slugify,
95
        ToolChain $toolChain,
96
        string $className
97
    ) {
98
        $this->authorizationChecker = $authorizationChecker;
99
        $this->repository = $entityManager->getRepository($className);
100
101
        // Flysystem mount name is saved in config/packages/oneup_flysystem.yaml @todo add it as a service.
102
        $this->fs = $mountManager->getFilesystem('resources_fs');
103
        $this->mountManager = $mountManager;
104
        $this->router = $router;
105
        $this->resourceNodeRepository = $entityManager->getRepository('ChamiloCoreBundle:Resource\ResourceNode');
106
        $this->slugify = $slugify;
107
        $this->toolChain = $toolChain;
108
    }
109
110
    public function getAuthorizationChecker(): AuthorizationCheckerInterface
111
    {
112
        return $this->authorizationChecker;
113
    }
114
115
    /**
116
     * @return mixed
117
     */
118
    public function create()
119
    {
120
        return new $this->className();
121
    }
122
123
    public function getRouter(): RouterInterface
124
    {
125
        return $this->router;
126
    }
127
128
    /**
129
     * @return ResourceNodeRepository
130
     */
131
    public function getResourceNodeRepository()
132
    {
133
        return $this->resourceNodeRepository;
134
    }
135
136
    /**
137
     * @return FilesystemInterface
138
     */
139
    public function getFileSystem()
140
    {
141
        return $this->fs;
142
    }
143
144
    public function getEntityManager(): EntityManager
145
    {
146
        return $this->getRepository()->getEntityManager();
147
    }
148
149
    /**
150
     * @return EntityRepository
151
     */
152
    public function getRepository()
153
    {
154
        return $this->repository;
155
    }
156
157
    /**
158
     * @return FormInterface
159
     */
160
    public function getForm(FormFactory $formFactory, AbstractResource $resource = null, $options = [])
161
    {
162
        $className = $this->repository->getClassName();
163
        $shortName = (new \ReflectionClass($className))->getShortName();
164
165
        // @todo remove hardcode class loading
166
        $formType = 'Chamilo\CoreBundle\Form\Resource\\'.$shortName.'Type';
167
        if (null === $resource) {
168
            $resource = new $className();
169
        }
170
171
        return $formFactory->create($formType, $resource, $options);
172
    }
173
174
    /**
175
     * @param mixed $id
176
     * @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...
177
     * @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...
178
     */
179
    public function find($id, $lockMode = null, $lockVersion = null) //: ?AbstractResource
180
    {
181
        return $this->getRepository()->find($id);
182
    }
183
184
    public function findOneBy(array $criteria, array $orderBy = null): ?AbstractResource
185
    {
186
        return $this->getRepository()->findOneBy($criteria, $orderBy);
187
    }
188
189
    public function createNodeForResource(AbstractResource $resource, User $creator, ResourceNode $parent = null, UploadedFile $file = null): ResourceNode
190
    {
191
        $em = $this->getEntityManager();
192
193
        $resourceType = $this->getResourceType();
194
        $resourceNode = new ResourceNode();
195
        $resourceName = $resource->getResourceName();
196
        $extension = $this->slugify->slugify(pathinfo($resourceName, PATHINFO_EXTENSION));
197
198
        if (empty($extension)) {
199
            $slug = $this->slugify->slugify($resourceName);
200
        } else {
201
            $originalExtension = pathinfo($resourceName, PATHINFO_EXTENSION);
202
            $originalBasename = \basename($resourceName, $originalExtension);
203
            $slug = sprintf('%s.%s', $this->slugify->slugify($originalBasename), $originalExtension);
204
        }
205
206
        $resourceNode
207
            ->setSlug($slug)
208
            ->setCreator($creator)
209
            ->setResourceType($resourceType)
210
        ;
211
212
        if (null !== $parent) {
213
            $resourceNode->setParent($parent);
214
        }
215
216
        $resource->setResourceNode($resourceNode);
217
        $em->persist($resourceNode);
218
        $em->persist($resource);
219
220
        if (null !== $file) {
221
            $this->addFile($resource, $file);
222
        }
223
224
        return $resourceNode;
225
    }
226
227
    public function updateNodeForResource(AbstractResource $resource): ResourceNode
228
    {
229
        $em = $this->getEntityManager();
230
231
        $resourceNode = $resource->getResourceNode();
232
        $resourceName = $resource->getResourceName();
233
234
        if ($resourceNode->hasResourceFile()) {
235
            $resourceFile = $resourceNode->getResourceFile();
236
            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...
237
                $originalName = $resourceFile->getOriginalName();
238
                $originalExtension = pathinfo($originalName, PATHINFO_EXTENSION);
239
240
                $originalBasename = \basename($resourceName, $originalExtension);
241
                $slug = sprintf(
242
                    '%s.%s',
243
                    $this->slugify->slugify($originalBasename),
244
                    $this->slugify->slugify($originalExtension)
245
                );
246
247
                $newOriginalName = sprintf('%s.%s', $resourceName, $originalExtension);
248
                $resourceFile->setOriginalName($newOriginalName);
249
250
                $em->persist($resourceFile);
251
            }
252
        } else {
253
            $slug = $this->slugify->slugify($resourceName);
254
        }
255
256
        $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...
257
258
        $em->persist($resourceNode);
259
        $em->persist($resource);
260
261
        $em->flush();
262
263
        return $resourceNode;
264
    }
265
266
    public function addFile(AbstractResource $resource, UploadedFile $file): ?ResourceFile
267
    {
268
        $resourceNode = $resource->getResourceNode();
269
270
        if (null === $resourceNode) {
271
            throw new \LogicException('Resource node is null');
272
        }
273
274
        $resourceFile = $resourceNode->getResourceFile();
275
        if (null === $resourceFile) {
276
            $resourceFile = new ResourceFile();
277
        }
278
279
        $em = $this->getEntityManager();
280
        //$resourceFile->setMimeType($file->getMimeType());
281
        $resourceFile->setFile($file);
282
        $resourceFile->setName($resource->getResourceName());
283
        $em->persist($resourceFile);
284
285
        $resourceNode->setResourceFile($resourceFile);
286
        $em->persist($resourceNode);
287
288
        return $resourceFile;
289
    }
290
291
    public function addResourceNode(AbstractResource $resource, User $creator, AbstractResource $parent = null): ResourceNode
292
    {
293
        if (null !== $parent) {
294
            $parent = $parent->getResourceNode();
295
        }
296
297
        return $this->createNodeForResource($resource, $creator, $parent);
298
    }
299
300
    public function addResourceToCourse(AbstractResource $resource, int $visibility, User $creator, Course $course, Session $session = null, CGroupInfo $group = null)
301
    {
302
        $node = $this->createNodeForResource($resource, $creator, $course->getResourceNode());
303
304
        $this->addResourceNodeToCourse($node, $visibility, $course, $session, $group);
305
    }
306
307
    /**
308
     * @param $visibility
309
     * @param $course
310
     * @param $session
311
     * @param $group
312
     */
313
    public function addResourceNodeToCourse(ResourceNode $resourceNode, $visibility, $course, $session, $group): void
314
    {
315
        $visibility = (int) $visibility;
316
        if (empty($visibility)) {
317
            $visibility = ResourceLink::VISIBILITY_PUBLISHED;
318
        }
319
320
        $link = new ResourceLink();
321
        $link
322
            ->setCourse($course)
323
            ->setSession($session)
324
            ->setGroup($group)
325
            //->setUser($toUser)
326
            ->setResourceNode($resourceNode)
327
            ->setVisibility($visibility)
328
        ;
329
330
        $rights = [];
331
        switch ($visibility) {
332
            case ResourceLink::VISIBILITY_PENDING:
333
            case ResourceLink::VISIBILITY_DRAFT:
334
                $editorMask = ResourceNodeVoter::getEditorMask();
335
                $resourceRight = new ResourceRight();
336
                $resourceRight
337
                    ->setMask($editorMask)
338
                    ->setRole(ResourceNodeVoter::ROLE_CURRENT_COURSE_TEACHER)
339
                ;
340
                $rights[] = $resourceRight;
341
342
                break;
343
        }
344
345
        if (!empty($rights)) {
346
            foreach ($rights as $right) {
347
                $link->addResourceRight($right);
348
            }
349
        }
350
351
        $em = $this->getEntityManager();
352
        $em->persist($link);
353
    }
354
355
    public function addResourceToMe(ResourceNode $resourceNode): ResourceLink
356
    {
357
        $resourceLink = new ResourceLink();
358
        $resourceLink
359
            ->setResourceNode($resourceNode)
360
        ;
361
362
        $this->getEntityManager()->persist($resourceLink);
363
        $this->getEntityManager()->flush();
364
365
        return $resourceLink;
366
    }
367
368
    public function addResourceToEveryone(ResourceNode $resourceNode, ResourceRight $right): ResourceLink
369
    {
370
        $resourceLink = new ResourceLink();
371
        $resourceLink
372
            ->setResourceNode($resourceNode)
373
            ->addResourceRight($right)
374
        ;
375
376
        $this->getEntityManager()->persist($resourceLink);
377
        $this->getEntityManager()->flush();
378
379
        return $resourceLink;
380
    }
381
382
    public function addResourceToUser(ResourceNode $resourceNode, User $toUser): ResourceLink
383
    {
384
        $resourceLink = $this->addResourceNodeToUser($resourceNode, $toUser);
385
        $this->getEntityManager()->persist($resourceLink);
386
387
        return $resourceLink;
388
    }
389
390
    public function addResourceNodeToUser(ResourceNode $resourceNode, User $toUser): ResourceLink
391
    {
392
        $resourceLink = new ResourceLink();
393
        $resourceLink
394
            ->setResourceNode($resourceNode)
395
            ->setUser($toUser);
396
397
        return $resourceLink;
398
    }
399
400
    /*public function addResourceToSession(
401
        ResourceNode $resourceNode,
402
        Course $course,
403
        Session $session,
404
        ResourceRight $right
405
    ) {
406
        $resourceLink = $this->addResourceToCourse(
407
            $resourceNode,
408
            $course,
409
            $right
410
        );
411
        $resourceLink->setSession($session);
412
        $this->getEntityManager()->persist($resourceLink);
413
414
        return $resourceLink;
415
    }*/
416
417
    /*public function addResourceToCourseGroup(
418
        ResourceNode $resourceNode,
419
        Course $course,
420
        CGroupInfo $group,
421
        ResourceRight $right
422
    ) {
423
        $resourceLink = $this->addResourceToCourse(
424
            $resourceNode,
425
            $course,
426
            $right
427
        );
428
        $resourceLink->setGroup($group);
429
        $this->getEntityManager()->persist($resourceLink);
430
431
        return $resourceLink;
432
    }*/
433
434
    /**
435
     * @return ResourceLink
436
     */
437
    public function addResourceToGroup(
438
        ResourceNode $resourceNode,
439
        Usergroup $group,
440
        ResourceRight $right
441
    ) {
442
        $resourceLink = new ResourceLink();
443
        $resourceLink
444
            ->setResourceNode($resourceNode)
445
            ->setUserGroup($group)
446
            ->addResourceRight($right);
447
448
        return $resourceLink;
449
    }
450
451
    /**
452
     * @param array $userList User id list
453
     */
454
    public function addResourceToUserList(ResourceNode $resourceNode, array $userList)
455
    {
456
        $em = $this->getEntityManager();
457
458
        if (!empty($userList)) {
459
            foreach ($userList as $userId) {
460
                $toUser = $em->getRepository('ChamiloUserBundle:User')->find($userId);
461
462
                $resourceLink = $this->addResourceNodeToUser($resourceNode, $toUser);
463
                $em->persist($resourceLink);
464
            }
465
        }
466
    }
467
468
    /**
469
     * @return ResourceType
470
     */
471
    public function getResourceType()
472
    {
473
        $em = $this->getEntityManager();
474
        $service = get_class($this);
475
        $name = $this->toolChain->getResourceTypeNameFromRepository($service);
476
        $repo = $em->getRepository('ChamiloCoreBundle:Resource\ResourceType');
477
478
        return $repo->findOneBy(['name' => $name]);
479
    }
480
481
    /**
482
     * @return QueryBuilder
483
     */
484
    public function getResourcesByCourse(Course $course, Session $session = null, CGroupInfo $group = null, ResourceNode $parentNode = null)
485
    {
486
        $repo = $this->getRepository();
487
        $className = $repo->getClassName();
488
        $checker = $this->getAuthorizationChecker();
489
        $reflectionClass = $repo->getClassMetadata()->getReflectionClass();
490
491
        // Check if this resource type requires to load the base course resources when using a session
492
        $loadBaseSessionContent = $reflectionClass->hasProperty('loadCourseResourcesInSession');
493
494
        $type = $this->getResourceType();
495
496
        $qb = $repo->getEntityManager()->createQueryBuilder()
497
            ->select('resource')
498
            ->from($className, 'resource')
499
            ->innerJoin(
500
                ResourceNode::class,
501
                'node',
502
                Join::WITH,
503
                'resource.resourceNode = node.id'
504
            )
505
            ->innerJoin('node.resourceLinks', 'links')
506
            ->where('node.resourceType = :type')
507
            ->setParameter('type', $type);
508
        $qb
509
            ->andWhere('links.course = :course')
510
            ->setParameter('course', $course)
511
        ;
512
513
        $isAdmin = $checker->isGranted('ROLE_ADMIN') ||
514
            $checker->isGranted('ROLE_CURRENT_COURSE_TEACHER');
515
516
        // Do not show deleted resources
517
518
        $qb
519
            ->andWhere('links.visibility != :visibilityDeleted')
520
            ->setParameter('visibilityDeleted', ResourceLink::VISIBILITY_DELETED)
521
        ;
522
523
        if (false === $isAdmin) {
524
            $qb
525
                ->andWhere('links.visibility = :visibility')
526
                ->setParameter('visibility', ResourceLink::VISIBILITY_PUBLISHED)
527
            ;
528
            // @todo Add start/end visibility restrictrions
529
        }
530
531
        if (null === $session) {
532
            $qb->andWhere('links.session IS NULL');
533
        } else {
534
            if ($loadBaseSessionContent) {
535
                // Load course base content.
536
                $qb->andWhere('links.session = :session OR links.session IS NULL');
537
                $qb->setParameter('session', $session);
538
            } else {
539
                // Load only session resources.
540
                $qb->andWhere('links.session = :session');
541
                $qb->setParameter('session', $session);
542
            }
543
        }
544
545
        if (null !== $parentNode) {
546
            $qb->andWhere('node.parent = :parentNode');
547
            $qb->setParameter('parentNode', $parentNode);
548
        }
549
550
        if (null === $group) {
551
            $qb->andWhere('links.group IS NULL');
552
        }
553
554
        ///var_dump($qb->getQuery()->getSQL(), $type->getId(), $parentNode->getId());exit;
555
556
        return $qb;
557
    }
558
559
    /**
560
     * @return QueryBuilder
561
     */
562
    public function getResourcesByCreator(User $user, ResourceNode $parentNode = null)
563
    {
564
        $repo = $this->getRepository();
565
        $className = $repo->getClassName();
566
567
        $qb = $repo->getEntityManager()->createQueryBuilder()
568
            ->select('resource')
569
            ->from($className, 'resource')
570
            ->innerJoin(
571
                ResourceNode::class,
572
                'node',
573
                Join::WITH,
574
                'resource.resourceNode = node.id'
575
            )
576
            //->innerJoin('node.resourceLinks', 'links')
577
            //->where('node.resourceType = :type')
578
            //->setParameter('type',$type)
579
            ;
580
        /*$qb
581
            ->andWhere('links.visibility = :visibility')
582
            ->setParameter('visibility', ResourceLink::VISIBILITY_PUBLISHED)
583
        ;*/
584
585
        if (null !== $parentNode) {
586
            $qb->andWhere('node.parent = :parentNode');
587
            $qb->setParameter('parentNode', $parentNode);
588
        }
589
590
        $qb->andWhere('node.creator = :creator');
591
        $qb->setParameter('creator', $user);
592
        //var_dump($qb->getQuery()->getSQL(), $parentNode->getId());exit;
593
594
        return $qb;
595
    }
596
597
    public function getResourceFromResourceNode($resourceNodeId): ?AbstractResource
598
    {
599
        return $this->getRepository()->findOneBy(['resourceNode' => $resourceNodeId]);
600
    }
601
602
    public function rowCanBeEdited(RowAction $action, Row $row, Session $session = null): ?RowAction
603
    {
604
        if (null !== $session) {
605
            /** @var AbstractResource $entity */
606
            $entity = $row->getEntity();
607
            $hasSession = $entity->getResourceNode()->hasSession($session);
608
            if ($hasSession->count() > 0) {
609
                return $action;
610
            }
611
612
            return null;
613
        }
614
615
        return $action;
616
    }
617
618
    /**
619
     * Deletes several entities: AbstractResource (Ex: CDocument, CQuiz), ResourceNode,
620
     * ResourceLinks and ResourceFile (including files via Flysystem).
621
     */
622
    public function hardDelete(AbstractResource $resource)
623
    {
624
        $em = $this->getEntityManager();
625
        $em->remove($resource);
626
        $em->flush();
627
    }
628
629
    public function getResourceFileContent(AbstractResource $resource): string
630
    {
631
        try {
632
            $resourceNode = $resource->getResourceNode();
633
            if ($resourceNode->hasResourceFile()) {
634
                $resourceFile = $resourceNode->getResourceFile();
635
                $fileName = $resourceFile->getFile()->getPathname();
636
637
                return $this->fs->read($fileName);
638
            }
639
640
            return '';
641
        } catch (\Throwable $exception) {
642
            throw new FileNotFoundException($resource);
643
        }
644
    }
645
646
    public function getResourceNodeFileContent(ResourceNode $resourceNode): string
647
    {
648
        try {
649
            if ($resourceNode->hasResourceFile()) {
650
                $resourceFile = $resourceNode->getResourceFile();
651
                $fileName = $resourceFile->getFile()->getPathname();
652
653
                return $this->fs->read($fileName);
654
            }
655
656
            return '';
657
        } catch (\Throwable $exception) {
658
            throw new FileNotFoundException($resourceNode);
659
        }
660
    }
661
662
    public function getResourceNodeFileStream(ResourceNode $resourceNode)
663
    {
664
        try {
665
            if ($resourceNode->hasResourceFile()) {
666
                $resourceFile = $resourceNode->getResourceFile();
667
                $fileName = $resourceFile->getFile()->getPathname();
668
669
                return $this->fs->readStream($fileName);
670
            }
671
672
            return '';
673
        } catch (\Throwable $exception) {
674
            throw new FileNotFoundException($resourceNode);
675
        }
676
    }
677
678
    public function getResourceFileUrl(AbstractResource $resource, array $extraParams = [], $referenceType = null): string
679
    {
680
        try {
681
            $resourceNode = $resource->getResourceNode();
682
            if ($resourceNode->hasResourceFile()) {
683
                $params = [
684
                    'tool' => $resourceNode->getResourceType()->getTool(),
685
                    'type' => $resourceNode->getResourceType(),
686
                    'id' => $resourceNode->getId(),
687
                ];
688
689
                if (!empty($extraParams)) {
690
                    $params = array_merge($params, $extraParams);
691
                }
692
693
                $referenceType = $referenceType ?? UrlGeneratorInterface::ABSOLUTE_PATH;
694
695
                return $this->router->generate('chamilo_core_resource_view', $params, $referenceType);
696
            }
697
698
            return '';
699
        } catch (\Throwable $exception) {
700
            throw new FileNotFoundException($resource);
701
        }
702
    }
703
704
    public function getResourceSettings(): ResourceSettings
705
    {
706
        $settings = new ResourceSettings();
707
        $settings
708
            ->setAllowNodeCreation(false)
709
            ->setAllowResourceCreation(false)
710
            ->setAllowResourceUpload(false)
711
        ;
712
713
        return $settings;
714
    }
715
716
    /**
717
     * @param string $content
718
     *
719
     * @return bool
720
     */
721
    public function updateResourceFileContent(AbstractResource $resource, $content)
722
    {
723
        try {
724
            $resourceNode = $resource->getResourceNode();
725
            if ($resourceNode->hasResourceFile()) {
726
                $resourceFile = $resourceNode->getResourceFile();
727
                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...
728
                    $fileName = $resourceFile->getFile()->getPathname();
729
                    $this->fs->update($fileName, $content);
730
                    $size = $this->fs->getSize($fileName);
731
                    if ($resource instanceof CDocument) {
732
                        $resource->setSize($size);
733
                    }
734
                    $this->entityManager->persist($resource);
735
736
                    return true;
737
                }
738
            }
739
740
            return false;
741
        } catch (\Throwable $exception) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
742
        }
743
    }
744
745
    /**
746
     * Change all links visibility to DELETED.
747
     */
748
    public function softDelete(AbstractResource $resource)
749
    {
750
        $this->setLinkVisibility($resource, ResourceLink::VISIBILITY_DELETED);
751
    }
752
753
    public function setVisibilityPublished(AbstractResource $resource)
754
    {
755
        $this->setLinkVisibility($resource, ResourceLink::VISIBILITY_PUBLISHED);
756
    }
757
758
    public function setVisibilityDraft(AbstractResource $resource)
759
    {
760
        $this->setLinkVisibility($resource, ResourceLink::VISIBILITY_DRAFT);
761
    }
762
763
    public function setVisibilityPending(AbstractResource $resource)
764
    {
765
        $this->setLinkVisibility($resource, ResourceLink::VISIBILITY_PENDING);
766
    }
767
768
    private function setLinkVisibility(AbstractResource $resource, int $visibility, bool $recursive = true): bool
769
    {
770
        $resourceNode = $resource->getResourceNode();
771
772
        if (null === $resourceNode) {
773
            return false;
774
        }
775
776
        $em = $this->getEntityManager();
777
        if ($recursive) {
778
            $children = $resourceNode->getChildren();
779
            if (!empty($children)) {
780
                /** @var ResourceNode $child */
781
                foreach ($children as $child) {
782
                    $criteria = ['resourceNode' => $child];
783
                    $childDocument = $this->getRepository()->findOneBy($criteria);
784
                    if ($childDocument) {
785
                        $this->setLinkVisibility($childDocument, $visibility);
786
                    }
787
                }
788
            }
789
        }
790
791
        $links = $resourceNode->getResourceLinks();
792
793
        if (!empty($links)) {
794
            /** @var ResourceLink $link */
795
            foreach ($links as $link) {
796
                $link->setVisibility($visibility);
797
                if (ResourceLink::VISIBILITY_DRAFT === $visibility) {
798
                    $editorMask = ResourceNodeVoter::getEditorMask();
799
                    $rights = [];
800
                    $resourceRight = new ResourceRight();
801
                    $resourceRight
802
                        ->setMask($editorMask)
803
                        ->setRole(ResourceNodeVoter::ROLE_CURRENT_COURSE_TEACHER)
804
                        ->setResourceLink($link)
805
                    ;
806
                    $rights[] = $resourceRight;
807
808
                    if (!empty($rights)) {
809
                        $link->setResourceRight($rights);
810
                    }
811
                } else {
812
                    $link->setResourceRight([]);
813
                }
814
                $em->persist($link);
815
            }
816
        }
817
        $em->flush();
818
819
        return true;
820
    }
821
}
822