Completed
Push — master ( 1b7a17...dd6a34 )
by Julito
13:30
created

ResourceRepository::addResourceToCourseGroup()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 20
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

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

706
                /** @scrutinizer ignore-call */ 
707
                $title = $resource->getTitle();
Loading history...
707
                $handle = tmpfile();
708
                fwrite($handle, $content);
709
                error_log($title);
710
                error_log($content);
711
                $meta = stream_get_meta_data($handle);
712
                $file = new UploadedFile($meta['uri'], $title, 'text/html', null, true);
713
                $resource->setUploadFile($file);
714
715
                return true;
716
            }
717
        }
718
        error_log('false');
719
720
        return false;
721
    }
722
723
    /**
724
     * Change all links visibility to DELETED.
725
     */
726
    public function softDelete(AbstractResource $resource)
727
    {
728
        $this->setLinkVisibility($resource, ResourceLink::VISIBILITY_DELETED);
729
    }
730
731
    public function setVisibilityPublished(AbstractResource $resource)
732
    {
733
        $this->setLinkVisibility($resource, ResourceLink::VISIBILITY_PUBLISHED);
734
    }
735
736
    public function setVisibilityDraft(AbstractResource $resource)
737
    {
738
        $this->setLinkVisibility($resource, ResourceLink::VISIBILITY_DRAFT);
739
    }
740
741
    public function setVisibilityPending(AbstractResource $resource)
742
    {
743
        $this->setLinkVisibility($resource, ResourceLink::VISIBILITY_PENDING);
744
    }
745
746
    public function setResourceTitle(AbstractResource $resource, $title)
747
    {
748
        $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

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