Completed
Push — master ( db9c88...be5baf )
by Julito
14:58
created

ResourceRepository::getResourceFromResourceNode()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 25
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

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