Completed
Push — master ( 7daaad...a8dd9d )
by Julito
09:46
created

ResourceRepository::rowCanBeEdited()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 14
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 7
c 0
b 0
f 0
nc 3
nop 3
dl 0
loc 14
rs 10
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
        string $className
94
    ) {
95
        $this->authorizationChecker = $authorizationChecker;
96
        $this->repository = $entityManager->getRepository($className);
97
        $this->router = $router;
98
        $this->resourceNodeRepository = $resourceNodeRepository;
99
        $this->slugify = $slugify;
100
        $this->toolChain = $toolChain;
101
        $this->settings = new Settings();
102
        $this->templates = new Template();
103
    }
104
105
    public function getAuthorizationChecker(): AuthorizationCheckerInterface
106
    {
107
        return $this->authorizationChecker;
108
    }
109
110
    /**
111
     * @return AbstractResource
112
     */
113
    public function create()
114
    {
115
        $class = $this->repository->getClassName();
116
117
        return new $class();
118
    }
119
120
    public function getRouter(): RouterInterface
121
    {
122
        return $this->router;
123
    }
124
125
    /**
126
     * @return ResourceNodeRepository
127
     */
128
    public function getResourceNodeRepository()
129
    {
130
        return $this->resourceNodeRepository;
131
    }
132
133
    public function getEntityManager(): EntityManager
134
    {
135
        return $this->getRepository()->getEntityManager();
136
    }
137
138
    /**
139
     * @return EntityRepository
140
     */
141
    public function getRepository()
142
    {
143
        return $this->repository;
144
    }
145
146
    /**
147
     * @return FormInterface
148
     */
149
    public function getForm(FormFactory $formFactory, AbstractResource $resource = null, $options = [])
150
    {
151
        $formType = $this->getResourceFormType();
152
153
        if (null === $resource) {
154
            $className = $this->repository->getClassName();
155
            $resource = new $className();
156
        }
157
158
        return $formFactory->create($formType, $resource, $options);
159
    }
160
161
    /**
162
     * @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...
163
     * @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...
164
     *
165
     * @return ResourceInterface
166
     */
167
    public function find($id, $lockMode = null, $lockVersion = null)
168
    {
169
        return $this->getRepository()->find($id, $lockMode, $lockVersion);
170
    }
171
172
    public function findOneBy(array $criteria, array $orderBy = null)
173
    {
174
        return $this->getRepository()->findOneBy($criteria, $orderBy);
175
    }
176
177
    public function updateNodeForResource(ResourceInterface $resource): ResourceNode
178
    {
179
        $em = $this->getEntityManager();
180
181
        $resourceNode = $resource->getResourceNode();
182
        $resourceName = $resource->getResourceName();
183
184
        if ($resourceNode->hasResourceFile()) {
185
            $resourceFile = $resourceNode->getResourceFile();
186
            if ($resourceFile) {
0 ignored issues
show
introduced by
$resourceFile is of type Chamilo\CoreBundle\Entity\ResourceFile, thus it always evaluated to true.
Loading history...
187
                $originalName = $resourceFile->getOriginalName();
188
                $originalExtension = pathinfo($originalName, PATHINFO_EXTENSION);
189
190
                //$originalBasename = \basename($resourceName, $originalExtension);
191
                /*$slug = sprintf(
192
                    '%s.%s',
193
                    $this->slugify->slugify($originalBasename),
194
                    $this->slugify->slugify($originalExtension)
195
                );*/
196
197
                $newOriginalName = sprintf('%s.%s', $resourceName, $originalExtension);
198
                $resourceFile->setOriginalName($newOriginalName);
199
200
                $em->persist($resourceFile);
201
            }
202
        } else {
203
            //$slug = $this->slugify->slugify($resourceName);
204
        }
205
206
        $resourceNode->setTitle($resourceName);
207
        //$resourceNode->setSlug($slug);
208
209
        $em->persist($resourceNode);
210
        $em->persist($resource);
211
212
        $em->flush();
213
214
        return $resourceNode;
215
    }
216
217
    public function addFile(ResourceInterface $resource, UploadedFile $file): ?ResourceFile
218
    {
219
        $resourceNode = $resource->getResourceNode();
220
221
        if (null === $resourceNode) {
222
            throw new \LogicException('Resource node is null');
223
        }
224
225
        $resourceFile = $resourceNode->getResourceFile();
226
        if (null === $resourceFile) {
227
            $resourceFile = new ResourceFile();
228
        }
229
230
        $em = $this->getEntityManager();
231
        $resourceFile->setFile($file);
232
        $resourceFile->setName($resource->getResourceName());
233
        $em->persist($resourceFile);
234
235
        $resourceNode->setResourceFile($resourceFile);
236
        $em->persist($resourceNode);
237
238
        return $resourceFile;
239
    }
240
241
    public function addResourceNode(AbstractResource $resource, User $creator, AbstractResource $parent = null): ResourceNode
242
    {
243
        if (null !== $parent) {
244
            $parent = $parent->getResourceNode();
245
        }
246
247
        return $this->createNodeForResource($resource, $creator, $parent);
248
    }
249
250
    public function addResourceToCourse(AbstractResource $resource, int $visibility, User $creator, Course $course, Session $session = null, CGroup $group = null, UploadedFile $file = null)
251
    {
252
        $resourceNode = $this->createNodeForResource($resource, $creator, $course->getResourceNode(), $file);
253
254
        $this->addResourceNodeToCourse($resourceNode, $visibility, $course, $session, $group);
255
    }
256
257
    public function addResourceToCourseWithParent(AbstractResource $resource, ResourceNode $parentNode, int $visibility, User $creator, Course $course, Session $session = null, CGroup $group = null, UploadedFile $file = null)
258
    {
259
        $resourceNode = $this->createNodeForResource($resource, $creator, $parentNode, $file);
260
261
        $this->addResourceNodeToCourse($resourceNode, $visibility, $course, $session, $group);
262
    }
263
264
    public function addResourceNodeToCourse(ResourceNode $resourceNode, int $visibility, Course $course, Session $session = null, CGroup $group = null, User $toUser = null): void
265
    {
266
        if (0 === $visibility) {
267
            $visibility = ResourceLink::VISIBILITY_PUBLISHED;
268
        }
269
270
        $link = new ResourceLink();
271
        $link
272
            ->setCourse($course)
273
            ->setSession($session)
274
            ->setGroup($group)
275
            ->setUser($toUser)
276
            ->setResourceNode($resourceNode)
277
            ->setVisibility($visibility)
278
        ;
279
280
        $rights = [];
281
        switch ($visibility) {
282
            case ResourceLink::VISIBILITY_PENDING:
283
            case ResourceLink::VISIBILITY_DRAFT:
284
                $editorMask = ResourceNodeVoter::getEditorMask();
285
                $resourceRight = new ResourceRight();
286
                $resourceRight
287
                    ->setMask($editorMask)
288
                    ->setRole(ResourceNodeVoter::ROLE_CURRENT_COURSE_TEACHER)
289
                ;
290
                $rights[] = $resourceRight;
291
292
                break;
293
        }
294
295
        if (!empty($rights)) {
296
            foreach ($rights as $right) {
297
                $link->addResourceRight($right);
298
            }
299
        }
300
301
        $em = $this->getEntityManager();
302
        $em->persist($resourceNode);
303
        $em->persist($link);
304
    }
305
306
    /**
307
     * @return ResourceType
308
     */
309
    public function getResourceType()
310
    {
311
        $name = $this->getResourceTypeName();
312
        $repo = $this->getEntityManager()->getRepository('ChamiloCoreBundle:ResourceType');
313
        $this->resourceType = $repo->findOneBy(['name' => $name]);
314
315
        return $this->resourceType;
316
    }
317
318
    public function getResourceTypeName(): string
319
    {
320
        return $this->toolChain->getResourceTypeNameFromRepository(get_class($this));
321
    }
322
323
    public function getResourcesByCourse(Course $course, Session $session = null, CGroup $group = null, ResourceNode $parentNode = null): QueryBuilder
324
    {
325
        $repo = $this->getRepository();
326
        $className = $repo->getClassName();
327
        $checker = $this->getAuthorizationChecker();
328
        $reflectionClass = $repo->getClassMetadata()->getReflectionClass();
329
330
        // Check if this resource type requires to load the base course resources when using a session
331
        $loadBaseSessionContent = $reflectionClass->hasProperty('loadCourseResourcesInSession');
332
        $resourceTypeName = $this->getResourceTypeName();
333
334
        $qb = $repo->getEntityManager()->createQueryBuilder()
335
            ->select('resource')
336
            ->from($className, 'resource')
337
            ->innerJoin('resource.resourceNode', 'node')
338
            ->innerJoin('node.resourceLinks', 'links')
339
            ->innerJoin('node.resourceType', 'type')
340
            //->innerJoin('links.course', 'course')
341
            ->leftJoin('node.resourceFile', 'file')
342
343
            ->where('type.name = :type')
344
            ->setParameter('type', $resourceTypeName)
345
            ->andWhere('links.course = :course')
346
            ->setParameter('course', $course)
347
            ->addSelect('node')
348
            ->addSelect('links')
349
            //->addSelect('course')
350
            ->addSelect('type')
351
            ->addSelect('file')
352
        ;
353
354
        $isAdmin = $checker->isGranted('ROLE_ADMIN') ||
355
            $checker->isGranted('ROLE_CURRENT_COURSE_TEACHER');
356
357
        // Do not show deleted resources
358
        $qb
359
            ->andWhere('links.visibility != :visibilityDeleted')
360
            ->setParameter('visibilityDeleted', ResourceLink::VISIBILITY_DELETED)
361
        ;
362
363
        if (false === $isAdmin) {
364
            $qb
365
                ->andWhere('links.visibility = :visibility')
366
                ->setParameter('visibility', ResourceLink::VISIBILITY_PUBLISHED)
367
            ;
368
            // @todo Add start/end visibility restrictions.
369
        }
370
371
        if (null === $session) {
372
            $qb->andWhere(
373
                $qb->expr()->orX(
374
                    $qb->expr()->isNull('links.session'),
375
                    $qb->expr()->eq('links.session', 0)
376
                )
377
            );
378
        } else {
379
            if ($loadBaseSessionContent) {
380
                // Load course base content.
381
                $qb->andWhere('links.session = :session OR links.session IS NULL');
382
                $qb->setParameter('session', $session);
383
            } else {
384
                // Load only session resources.
385
                $qb->andWhere('links.session = :session');
386
                $qb->setParameter('session', $session);
387
            }
388
        }
389
390
        if (null !== $parentNode) {
391
            $qb->andWhere('node.parent = :parentNode');
392
            $qb->setParameter('parentNode', $parentNode);
393
        }
394
395
        if (null === $group) {
396
            $qb->andWhere(
397
                $qb->expr()->orX(
398
                    $qb->expr()->isNull('links.group'),
399
                    $qb->expr()->eq('links.group', 0)
400
                )
401
            );
402
        } else {
403
            $qb->andWhere('links.group = :group');
404
            $qb->setParameter('group', $group);
405
        }
406
407
        return $qb;
408
    }
409
410
    public function getResourcesByCourseOnly(Course $course, ResourceNode $parentNode = null)
411
    {
412
        $repo = $this->getRepository();
413
        $className = $repo->getClassName();
414
        $checker = $this->getAuthorizationChecker();
415
        $resourceTypeName = $this->getResourceTypeName();
416
417
        $qb = $repo->getEntityManager()->createQueryBuilder()
418
            ->select('resource')
419
            ->from($className, 'resource')
420
            ->innerJoin(
421
                'resource.resourceNode',
422
                'node'
423
            )
424
            ->innerJoin('node.resourceLinks', 'links')
425
            ->innerJoin('node.resourceType', 'type')
426
            ->where('type.name = :type')
427
            ->setParameter('type', $resourceTypeName)
428
            ->andWhere('links.course = :course')
429
            ->setParameter('course', $course)
430
        ;
431
432
        $isAdmin = $checker->isGranted('ROLE_ADMIN') ||
433
            $checker->isGranted('ROLE_CURRENT_COURSE_TEACHER');
434
435
        // Do not show deleted resources
436
        $qb
437
            ->andWhere('links.visibility != :visibilityDeleted')
438
            ->setParameter('visibilityDeleted', ResourceLink::VISIBILITY_DELETED)
439
        ;
440
441
        if (false === $isAdmin) {
442
            $qb
443
                ->andWhere('links.visibility = :visibility')
444
                ->setParameter('visibility', ResourceLink::VISIBILITY_PUBLISHED)
445
            ;
446
            // @todo Add start/end visibility restrictrions
447
        }
448
449
        if (null !== $parentNode) {
450
            $qb->andWhere('node.parent = :parentNode');
451
            $qb->setParameter('parentNode', $parentNode);
452
        }
453
454
        return $qb;
455
    }
456
457
    /**
458
     * @return QueryBuilder
459
     */
460
    public function getResourcesByCreator(User $user, ResourceNode $parentNode = null)
461
    {
462
        $repo = $this->getRepository();
463
        $className = $repo->getClassName();
464
465
        $qb = $repo->getEntityManager()->createQueryBuilder()
466
            ->select('resource')
467
            ->from($className, 'resource')
468
            ->innerJoin(
469
                'resource.resourceNode',
470
                'node'
471
            )
472
            //->innerJoin('node.resourceLinks', 'links')
473
            //->where('node.resourceType = :type')
474
            //->setParameter('type',$type)
475
            ;
476
        /*$qb
477
            ->andWhere('links.visibility = :visibility')
478
            ->setParameter('visibility', ResourceLink::VISIBILITY_PUBLISHED)
479
        ;*/
480
481
        if (null !== $parentNode) {
482
            $qb->andWhere('node.parent = :parentNode');
483
            $qb->setParameter('parentNode', $parentNode);
484
        }
485
486
        $qb->andWhere('node.creator = :creator');
487
        $qb->setParameter('creator', $user);
488
489
        return $qb;
490
    }
491
492
    public function getResourcesByCourseLinkedToUser(
493
        User $user,
494
        Course $course,
495
        Session $session = null,
496
        CGroup $group = null,
497
        ResourceNode $parentNode = null
498
    ): QueryBuilder {
499
        $qb = $this->getResourcesByCourse($course, $session, $group, $parentNode);
500
501
        $qb
502
            ->andWhere('links.user = :user')
503
            ->setParameter('user', $user);
504
505
        return $qb;
506
    }
507
508
    public function getResourcesByLinkedUser(User $user, ResourceNode $parentNode = null): QueryBuilder
509
    {
510
        $repo = $this->getRepository();
511
        $className = $repo->getClassName();
512
        $checker = $this->getAuthorizationChecker();
513
        $resourceTypeName = $this->getResourceTypeName();
514
515
        $qb = $repo->getEntityManager()->createQueryBuilder()
516
            ->select('resource')
517
            ->from($className, 'resource')
518
            ->innerJoin(
519
                'resource.resourceNode',
520
                'node'
521
            )
522
            ->innerJoin('node.resourceLinks', 'links')
523
            ->innerJoin('node.resourceType', 'type')
524
            ->where('type.name = :type')
525
            ->setParameter('type', $resourceTypeName)
526
            ->andWhere('links.user = :user')
527
            ->setParameter('user', $user)
528
        ;
529
530
        $isAdmin = $checker->isGranted('ROLE_ADMIN') ||
531
            $checker->isGranted('ROLE_CURRENT_COURSE_TEACHER');
532
533
        // Do not show deleted resources
534
        $qb
535
            ->andWhere('links.visibility != :visibilityDeleted')
536
            ->setParameter('visibilityDeleted', ResourceLink::VISIBILITY_DELETED)
537
        ;
538
539
        if (false === $isAdmin) {
540
            $qb
541
                ->andWhere('links.visibility = :visibility')
542
                ->setParameter('visibility', ResourceLink::VISIBILITY_PUBLISHED)
543
            ;
544
            // @todo Add start/end visibility restrictrions
545
        }
546
547
        if (null !== $parentNode) {
548
            $qb->andWhere('node.parent = :parentNode');
549
            $qb->setParameter('parentNode', $parentNode);
550
        }
551
552
        return $qb;
553
    }
554
555
    public function getResourceFromResourceNode(int $resourceNodeId): ?AbstractResource
556
    {
557
        //return $this->getRepository()->findOneBy(['resourceNode' => $resourceNodeId]);
558
        //$className = $this->getClassName();
559
        /*var_dump(get_class($this->repository));
560
        var_dump(get_class($this->getRepository()));
561
        var_dump(get_class($this));*/
562
        //var_dump($className);
563
        // Include links
564
        $qb = $this->getRepository()->createQueryBuilder('resource')
565
            ->select('resource')
566
            ->addSelect('node')
567
            ->addSelect('links')
568
            //->addSelect('file')
569
            //->from($className, 'resource')
570
            ->innerJoin('resource.resourceNode', 'node')
571
        //    ->innerJoin('node.creator', 'userCreator')
572
            ->innerJoin('node.resourceLinks', 'links')
573
//            ->leftJoin('node.resourceFile', 'file')
574
            ->where('node.id = :id')
575
            ->setParameters(['id' => $resourceNodeId])
576
            //->addSelect('node')
577
        ;
578
579
        return $qb->getQuery()->getOneOrNullResult();
580
    }
581
582
    public function delete(AbstractResource $resource)
583
    {
584
        $children = $resource->getResourceNode()->getChildren();
585
        foreach ($children as $child) {
586
            if ($child->hasResourceFile()) {
587
                $this->getEntityManager()->remove($child->getResourceFile());
588
            }
589
            $resourceNode = $this->getResourceFromResourceNode($child->getId());
590
            if ($resourceNode) {
591
                $this->delete($resourceNode);
592
            }
593
        }
594
        $this->getEntityManager()->remove($resource);
595
        $this->getEntityManager()->flush();
596
    }
597
598
    /**
599
     * Deletes several entities: AbstractResource (Ex: CDocument, CQuiz), ResourceNode,
600
     * ResourceLinks and ResourceFile (including files via Flysystem).
601
     */
602
    public function hardDelete(AbstractResource $resource)
603
    {
604
        $em = $this->getEntityManager();
605
        $em->remove($resource);
606
        $em->flush();
607
    }
608
609
    public function getResourceFileContent(AbstractResource $resource): string
610
    {
611
        try {
612
            $resourceNode = $resource->getResourceNode();
613
614
            return $this->resourceNodeRepository->getResourceNodeFileContent($resourceNode);
615
        } catch (\Throwable $exception) {
616
            throw new FileNotFoundException($resource);
617
        }
618
    }
619
620
    public function getResourceNodeFileContent(ResourceNode $resourceNode): string
621
    {
622
        return $this->resourceNodeRepository->getResourceNodeFileContent($resourceNode);
623
    }
624
625
    public function getResourceNodeFileStream(ResourceNode $resourceNode)
626
    {
627
        return $this->resourceNodeRepository->getResourceNodeFileStream($resourceNode);
628
    }
629
630
    public function getResourceFileDownloadUrl(AbstractResource $resource, array $extraParams = [], $referenceType = null): string
631
    {
632
        $extraParams['mode'] = 'download';
633
634
        return $this->getResourceFileUrl($resource, $extraParams, $referenceType);
635
    }
636
637
    public function getResourceFileUrl(AbstractResource $resource, array $extraParams = [], $referenceType = null): string
638
    {
639
        try {
640
            $resourceNode = $resource->getResourceNode();
641
            if ($resourceNode->hasResourceFile()) {
642
                $params = [
643
                    'tool' => $resourceNode->getResourceType()->getTool(),
644
                    'type' => $resourceNode->getResourceType(),
645
                    'id' => $resourceNode->getId(),
646
                ];
647
648
                if (!empty($extraParams)) {
649
                    $params = array_merge($params, $extraParams);
650
                }
651
652
                $referenceType = $referenceType ?? UrlGeneratorInterface::ABSOLUTE_PATH;
653
654
                return $this->router->generate('chamilo_core_resource_view_file', $params, $referenceType);
655
            }
656
657
            return '';
658
        } catch (\Throwable $exception) {
659
            throw new FileNotFoundException($resource);
660
        }
661
    }
662
663
    public function getResourceSettings(): Settings
664
    {
665
        return $this->settings;
666
    }
667
668
    public function getTemplates(): Template
669
    {
670
        return $this->templates;
671
    }
672
673
    /**
674
     * @param string $content
675
     *
676
     * @return bool
677
     */
678
    public function updateResourceFileContent(AbstractResource $resource, $content)
679
    {
680
        error_log('updateResourceFileContent');
681
682
        $resourceNode = $resource->getResourceNode();
683
        if ($resourceNode->hasResourceFile()) {
684
            error_log('has file');
685
            $resourceFile = $resourceNode->getResourceFile();
686
            if ($resourceFile) {
0 ignored issues
show
introduced by
$resourceFile is of type Chamilo\CoreBundle\Entity\ResourceFile, thus it always evaluated to true.
Loading history...
687
                error_log('$resourceFile');
688
                $title = $resource->getTitle();
0 ignored issues
show
Bug introduced by
The method getTitle() does not exist on Chamilo\CoreBundle\Entity\AbstractResource. It seems like you code against a sub-type of Chamilo\CoreBundle\Entity\AbstractResource such as Chamilo\CoreBundle\Entity\Course or Chamilo\CourseBundle\Entity\CLink or Chamilo\CourseBundle\Entity\CAnnouncement or Chamilo\CourseBundle\Entity\CThematicPlan or Chamilo\CourseBundle\Entity\CQuiz or Chamilo\CourseBundle\Entity\CCourseDescription or Chamilo\CourseBundle\Entity\CDocument or Chamilo\CourseBundle\Entity\CThematic or Chamilo\CourseBundle\Entity\CQuizQuestionCategory or Chamilo\CourseBundle\Entity\CStudentPublication or Chamilo\CourseBundle\Entity\CCalendarEvent. ( Ignorable by Annotation )

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

688
                /** @scrutinizer ignore-call */ 
689
                $title = $resource->getTitle();
Loading history...
689
                $handle = tmpfile();
690
                fwrite($handle, $content);
691
                error_log($title);
692
                error_log($content);
693
                $meta = stream_get_meta_data($handle);
694
                $file = new UploadedFile($meta['uri'], $title, 'text/html', null, true);
695
                $resource->setUploadFile($file);
696
697
                return true;
698
            }
699
        }
700
        error_log('false');
701
702
        return false;
703
    }
704
705
    /**
706
     * Change all links visibility to DELETED.
707
     */
708
    public function softDelete(AbstractResource $resource)
709
    {
710
        $this->setLinkVisibility($resource, ResourceLink::VISIBILITY_DELETED);
711
    }
712
713
    public function setVisibilityPublished(AbstractResource $resource)
714
    {
715
        $this->setLinkVisibility($resource, ResourceLink::VISIBILITY_PUBLISHED);
716
    }
717
718
    public function setVisibilityDraft(AbstractResource $resource)
719
    {
720
        $this->setLinkVisibility($resource, ResourceLink::VISIBILITY_DRAFT);
721
    }
722
723
    public function setVisibilityPending(AbstractResource $resource)
724
    {
725
        $this->setLinkVisibility($resource, ResourceLink::VISIBILITY_PENDING);
726
    }
727
728
    public function setResourceTitle(AbstractResource $resource, $title)
729
    {
730
        $resource->setTitle($title);
0 ignored issues
show
Bug introduced by
The method setTitle() does not exist on Chamilo\CoreBundle\Entity\AbstractResource. It seems like you code against a sub-type of Chamilo\CoreBundle\Entity\AbstractResource such as Chamilo\CoreBundle\Entity\Course or Chamilo\CourseBundle\Entity\CLink or Chamilo\CourseBundle\Entity\CAnnouncement or Chamilo\CourseBundle\Entity\CThematicPlan or Chamilo\CourseBundle\Entity\CQuiz or Chamilo\CourseBundle\Entity\CCourseDescription or Chamilo\CourseBundle\Entity\CDocument or Chamilo\CourseBundle\Entity\CThematic or Chamilo\CourseBundle\Entity\CQuizQuestionCategory or Chamilo\CourseBundle\Entity\CStudentPublication or Chamilo\CourseBundle\Entity\CCalendarEvent. ( Ignorable by Annotation )

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

730
        $resource->/** @scrutinizer ignore-call */ 
731
                   setTitle($title);
Loading history...
731
        $resourceNode = $resource->getResourceNode();
732
        $resourceNode->setTitle($title);
733
        if ($resourceNode->hasResourceFile()) {
734
            //$resourceFile = $resourceNode->getResourceFile();
735
            //$resourceFile->setName($title);
736
737
            /*$fileName = $this->getResourceNodeRepository()->getFilename($resourceFile);
738
            error_log('$fileName');
739
            error_log($fileName);
740
            error_log($title);
741
            $this->getResourceNodeRepository()->getFileSystem()->rename($fileName, $title);
742
            $resourceFile->setName($title);
743
            $resourceFile->setOriginalName($title);*/
744
        }
745
    }
746
747
    public function createNodeForResource(ResourceInterface $resource, User $creator, ResourceNode $parentNode = null, UploadedFile $file = null): ResourceNode
748
    {
749
        $em = $this->getEntityManager();
750
751
        $resourceType = $this->getResourceType();
752
        $resourceName = $resource->getResourceName();
753
        $extension = $this->slugify->slugify(pathinfo($resourceName, PATHINFO_EXTENSION));
754
755
        if (empty($extension)) {
756
            $slug = $this->slugify->slugify($resourceName);
757
        } else {
758
            $originalExtension = pathinfo($resourceName, PATHINFO_EXTENSION);
759
            $originalBasename = \basename($resourceName, $originalExtension);
760
            $slug = sprintf('%s.%s', $this->slugify->slugify($originalBasename), $originalExtension);
761
        }
762
763
        $resourceNode = new ResourceNode();
764
        $resourceNode
765
            ->setTitle($resourceName)
766
            ->setSlug($slug)
767
            ->setCreator($creator)
768
            ->setResourceType($resourceType)
769
        ;
770
771
        if (null !== $parentNode) {
772
            $resourceNode->setParent($parentNode);
773
        }
774
775
        $resource->setResourceNode($resourceNode);
776
        $em->persist($resourceNode);
777
        $em->persist($resource);
778
779
        if (null !== $file) {
780
            $this->addFile($resource, $file);
781
        }
782
783
        return $resourceNode;
784
    }
785
786
    private function setLinkVisibility(AbstractResource $resource, int $visibility, bool $recursive = true): bool
787
    {
788
        $resourceNode = $resource->getResourceNode();
789
790
        if (null === $resourceNode) {
791
            return false;
792
        }
793
794
        $em = $this->getEntityManager();
795
        if ($recursive) {
796
            $children = $resourceNode->getChildren();
797
            if (!empty($children)) {
798
                /** @var ResourceNode $child */
799
                foreach ($children as $child) {
800
                    $criteria = ['resourceNode' => $child];
801
                    $childDocument = $this->getRepository()->findOneBy($criteria);
802
                    if ($childDocument) {
803
                        $this->setLinkVisibility($childDocument, $visibility);
804
                    }
805
                }
806
            }
807
        }
808
809
        $links = $resourceNode->getResourceLinks();
810
811
        if (!empty($links)) {
812
            /** @var ResourceLink $link */
813
            foreach ($links as $link) {
814
                $link->setVisibility($visibility);
815
                if (ResourceLink::VISIBILITY_DRAFT === $visibility) {
816
                    $editorMask = ResourceNodeVoter::getEditorMask();
817
                    $rights = [];
818
                    $resourceRight = new ResourceRight();
819
                    $resourceRight
820
                        ->setMask($editorMask)
821
                        ->setRole(ResourceNodeVoter::ROLE_CURRENT_COURSE_TEACHER)
822
                        ->setResourceLink($link)
823
                    ;
824
                    $rights[] = $resourceRight;
825
826
                    if (!empty($rights)) {
827
                        $link->setResourceRight($rights);
828
                    }
829
                } else {
830
                    $link->setResourceRight([]);
831
                }
832
                $em->persist($link);
833
            }
834
        }
835
        $em->flush();
836
837
        return true;
838
    }
839
}
840