Passed
Push — master ( 4357b6...fb3111 )
by Julito
08:58
created

ResourceRepository::findResourceByTitle()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 14
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

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