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

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

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

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

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