Completed
Push — master ( 1b7a17...dd6a34 )
by Julito
13:30
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 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