Completed
Push — master ( e7429e...db9c88 )
by Julito
11:10
created

addResourceToCourseWithParent()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 8
dl 0
loc 5
rs 10
c 0
b 0
f 0

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

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

705
                /** @scrutinizer ignore-call */ 
706
                $title = $resource->getTitle();
Loading history...
706
                $handle = tmpfile();
707
                fwrite($handle, $content);
708
                error_log($title);
709
                error_log($content);
710
                $meta = stream_get_meta_data($handle);
711
                $file = new UploadedFile($meta['uri'], $title, 'text/html', null, true);
712
                $resource->setUploadFile($file);
713
714
                return true;
715
            }
716
        }
717
        error_log('false');
718
719
        return false;
720
    }
721
722
    public function setResourceTitle(AbstractResource $resource, $title)
723
    {
724
        $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

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