Completed
Push — master ( 5627cd...c7e907 )
by Julito
15:36
created

ResourceRepository::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 5
nc 1
nop 4
dl 0
loc 8
rs 10
c 0
b 0
f 0
1
<?php
2
/* For licensing terms, see /license.txt */
3
4
namespace Chamilo\CoreBundle\Repository;
5
6
use Chamilo\CoreBundle\Entity\Course;
7
use Chamilo\CoreBundle\Entity\Resource\AbstractResource;
8
use Chamilo\CoreBundle\Entity\Resource\ResourceFile;
9
use Chamilo\CoreBundle\Entity\Resource\ResourceLink;
10
use Chamilo\CoreBundle\Entity\Resource\ResourceNode;
11
use Chamilo\CoreBundle\Entity\Resource\ResourceRight;
12
use Chamilo\CoreBundle\Entity\Resource\ResourceType;
13
use Chamilo\CoreBundle\Entity\Session;
14
use Chamilo\CoreBundle\Entity\Tool;
15
use Chamilo\CoreBundle\Entity\Usergroup;
16
use Chamilo\CoreBundle\Security\Authorization\Voter\ResourceNodeVoter;
17
use Chamilo\CourseBundle\Entity\CGroupInfo;
18
use Chamilo\UserBundle\Entity\User;
19
use Doctrine\ORM\EntityManager;
20
use Doctrine\ORM\Query\Expr\Join;
21
use League\Flysystem\FilesystemInterface;
22
use League\Flysystem\MountManager;
23
use Sylius\Bundle\ResourceBundle\Doctrine\ORM\EntityRepository;
24
use Symfony\Component\HttpFoundation\File\UploadedFile;
25
use Symfony\Component\Routing\RouterInterface;
26
27
/**
28
 * Class ResourceRepository.
29
 */
30
class ResourceRepository extends EntityRepository
31
{
32
    /** @var string */
33
    public $shortClassName;
34
    /**
35
     * @var EntityRepository
36
     */
37
    protected $repository;
38
39
    /**
40
     * @var FilesystemInterface
41
     */
42
    protected $fs;
43
44
    /**
45
     * @var EntityManager
46
     */
47
    protected $entityManager;
48
49
    /**
50
     * The entity class FQN.
51
     *
52
     * @var string
53
     */
54
    protected $className;
55
56
    /** @var RouterInterface */
57
    protected $router;
58
59
    protected $resourceNodeRepository;
60
61
    /**
62
     * ResourceRepository constructor.
63
     *
64
     * @param EntityManager   $entityManager
65
     * @param MountManager    $mountManager
66
     * @param RouterInterface $router
67
     * @param string          $className
68
     */
69
    public function __construct(EntityManager $entityManager, MountManager $mountManager, RouterInterface $router, string $className)
70
    {
71
        $this->repository = $entityManager->getRepository($className);
72
        // Flysystem mount name is saved in config/packages/oneup_flysystem.yaml
73
        $this->fs = $mountManager->getFilesystem('resources_fs');
74
        $this->router = $router;
75
        $this->resourceNodeRepository = $entityManager->getRepository('ChamiloCoreBundle:Resource\ResourceNode');
76
        $this->shortClassName = (new \ReflectionClass($className))->getShortName();
77
    }
78
79
    /**
80
     * @return mixed
81
     */
82
    public function create()
83
    {
84
        return new $this->className();
85
    }
86
87
    /**
88
     * @return string
89
     */
90
    public function getShortClassName(): string
91
    {
92
        return $this->shortClassName;
93
    }
94
95
    /**
96
     * @return EntityRepository
97
     */
98
    public function getResourceNodeRepository()
99
    {
100
        return $this->resourceNodeRepository;
101
    }
102
103
    /**
104
     * @return FilesystemInterface
105
     */
106
    public function getFileSystem()
107
    {
108
        return $this->fs;
109
    }
110
111
    /**
112
     * @return EntityManager
113
     */
114
    public function getEntityManager(): EntityManager
115
    {
116
        return $this->getRepository()->getEntityManager();
117
    }
118
119
    /**
120
     * @return EntityRepository
121
     */
122
    public function getRepository()
123
    {
124
        return $this->repository;
125
    }
126
127
    /**
128
     * @param mixed $id
129
     * @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...
130
     * @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...
131
     *
132
     * @return AbstractResource|null
133
     */
134
    public function find($id, $lockMode = null, $lockVersion = null)
135
    {
136
        return $this->getRepository()->find($id);
137
    }
138
139
    /**
140
     * @param array      $criteria
141
     * @param array|null $orderBy
142
     *
143
     * @return AbstractResource
144
     */
145
    public function findOneBy(array $criteria, array $orderBy = null)
146
    {
147
        return $this->getRepository()->findOneBy($criteria, $orderBy);
148
    }
149
150
    /**
151
     * @param ResourceNode $resourceNode
152
     * @param UploadedFile $file
153
     *
154
     * @return ResourceFile
155
     */
156
    public function addFile(ResourceNode $resourceNode, UploadedFile $file)
157
    {
158
        $resourceFile = $resourceNode->getResourceFile();
159
        if ($resourceFile === null) {
160
            $resourceFile = new ResourceFile();
161
        }
162
163
        $em = $this->getEntityManager();
164
165
        $resourceFile->setFile($file);
166
        $resourceFile->setName($resourceNode->getName());
167
        $em->persist($resourceFile);
168
        $resourceNode->setResourceFile($resourceFile);
169
        $em->persist($resourceNode);
170
        $em->flush();
171
172
        return $resourceFile;
173
    }
174
175
    /**
176
     * Creates a ResourceNode.
177
     *
178
     * @param AbstractResource $resource
179
     * @param User             $creator
180
     * @param AbstractResource $parent
181
     *
182
     * @return ResourceNode
183
     */
184
    public function addResourceNode(
185
        AbstractResource $resource,
186
        User $creator,
187
        AbstractResource $parent = null
188
    ): ResourceNode {
189
        $em = $this->getEntityManager();
190
191
        $resourceType = $this->getRepositoryResourceType();
192
193
        $resourceNode = new ResourceNode();
194
        $resourceNode
195
            ->setName($resource->getResourceName())
196
            ->setCreator($creator)
197
            ->setResourceType($resourceType)
198
        ;
199
200
        if ($parent !== null) {
201
            $resourceNode->setParent($parent->getResourceNode());
202
        }
203
204
        $resource->setResourceNode($resourceNode);
205
206
        $em->persist($resourceNode);
207
        $em->persist($resource);
208
        $em->flush();
209
210
        return $resourceNode;
211
    }
212
213
    /**
214
     * @return ResourceType
215
     */
216
    public function getRepositoryResourceType()
217
    {
218
        $em = $this->getEntityManager();
219
220
        return $em->getRepository('ChamiloCoreBundle:Resource\ResourceType')->findOneBy(
221
            ['name' => $this->getShortClassName()]
222
        );
223
    }
224
225
    /**
226
     * @param ResourceNode $resourceNode
227
     *
228
     * @return ResourceLink
229
     */
230
    public function addResourceToMe(ResourceNode $resourceNode): ResourceLink
231
    {
232
        $resourceLink = new ResourceLink();
233
        $resourceLink
234
            ->setResourceNode($resourceNode)
235
            ->setPrivate(true);
0 ignored issues
show
Bug introduced by
The method setPrivate() does not exist on Chamilo\CoreBundle\Entity\Resource\ResourceLink. ( Ignorable by Annotation )

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

235
            ->/** @scrutinizer ignore-call */ setPrivate(true);

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
236
237
        $this->getEntityManager()->persist($resourceLink);
238
        $this->getEntityManager()->flush();
239
240
        return $resourceLink;
241
    }
242
243
    /**
244
     * @param ResourceNode  $resourceNode
245
     * @param ResourceRight $right
246
     *
247
     * @return ResourceLink
248
     */
249
    public function addResourceToEveryone(ResourceNode $resourceNode, ResourceRight $right): ResourceLink
250
    {
251
        $resourceLink = new ResourceLink();
252
        $resourceLink
253
            ->setResourceNode($resourceNode)
254
            ->addResourceRight($right)
255
        ;
256
257
        $this->getEntityManager()->persist($resourceLink);
258
        $this->getEntityManager()->flush();
259
260
        return $resourceLink;
261
    }
262
263
    /**
264
     * @param ResourceNode $resourceNode
265
     * @param int          $visibility
266
     * @param Course       $course
267
     * @param Session      $session
268
     * @param CGroupInfo   $group
269
     */
270
    public function addResourceToCourse(ResourceNode $resourceNode, $visibility, $course, $session, $group): void
271
    {
272
        $visibility = (int) $visibility;
273
        if (empty($visibility)) {
274
            $visibility = ResourceLink::VISIBILITY_PUBLISHED;
275
        }
276
277
        $link = new ResourceLink();
278
        $link
279
            ->setCourse($course)
280
            ->setSession($session)
281
            ->setGroup($group)
282
            //->setUser($toUser)
283
            ->setResourceNode($resourceNode)
284
            ->setVisibility($visibility)
285
        ;
286
287
        $rights = [];
288
        switch ($visibility) {
289
            case ResourceLink::VISIBILITY_PENDING:
290
            case ResourceLink::VISIBILITY_DRAFT:
291
                $editorMask = ResourceNodeVoter::getEditorMask();
292
                $resourceRight = new ResourceRight();
293
                $resourceRight
294
                    ->setMask($editorMask)
295
                    ->setRole(ResourceNodeVoter::ROLE_CURRENT_COURSE_TEACHER)
296
                ;
297
                $rights[] = $resourceRight;
298
                break;
299
        }
300
301
        if (!empty($rights)) {
302
            foreach ($rights as $right) {
303
                $link->addResourceRight($right);
304
            }
305
        }
306
307
        $em = $this->getEntityManager();
308
        $em->persist($link);
309
        $em->flush();
310
    }
311
312
    /**
313
     * @param ResourceNode  $resourceNode
314
     * @param Course        $course
315
     * @param ResourceRight $right
316
     *
317
     * @return ResourceLink
318
     */
319
    public function addResourceToCourse2(ResourceNode $resourceNode, Course $course, ResourceRight $right): ResourceLink
320
    {
321
        $resourceLink = new ResourceLink();
322
        $resourceLink
323
            ->setResourceNode($resourceNode)
324
            ->setCourse($course)
325
            ->addResourceRight($right);
326
        $this->getEntityManager()->persist($resourceLink);
327
        $this->getEntityManager()->flush();
328
329
        return $resourceLink;
330
    }
331
332
    /**
333
     * @param ResourceNode $resourceNode
334
     * @param User         $toUser
335
     *
336
     * @return ResourceLink
337
     */
338
    public function addResourceToUser(ResourceNode $resourceNode, User $toUser): ResourceLink
339
    {
340
        $resourceLink = $this->addResourceNodeToUser($resourceNode, $toUser);
341
        $this->getEntityManager()->persist($resourceLink);
342
343
        return $resourceLink;
344
    }
345
346
    /**
347
     * @param ResourceNode $resourceNode
348
     * @param User         $toUser
349
     *
350
     * @return ResourceLink
351
     */
352
    public function addResourceNodeToUser(ResourceNode $resourceNode, User $toUser): ResourceLink
353
    {
354
        $resourceLink = new ResourceLink();
355
        $resourceLink
356
            ->setResourceNode($resourceNode)
357
            ->setUser($toUser);
358
359
        return $resourceLink;
360
    }
361
362
    /**
363
     * @param ResourceNode  $resourceNode
364
     * @param Course        $course
365
     * @param Session       $session
366
     * @param ResourceRight $right
367
     *
368
     * @return ResourceLink
369
     */
370
    public function addResourceToSession(
371
        ResourceNode $resourceNode,
372
        Course $course,
373
        Session $session,
374
        ResourceRight $right
375
    ) {
376
        $resourceLink = $this->addResourceToCourse(
0 ignored issues
show
Bug introduced by
The call to Chamilo\CoreBundle\Repos...::addResourceToCourse() has too few arguments starting with session. ( Ignorable by Annotation )

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

376
        /** @scrutinizer ignore-call */ 
377
        $resourceLink = $this->addResourceToCourse(

This check compares calls to functions or methods with their respective definitions. If the call has less arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
Bug introduced by
Are you sure the assignment to $resourceLink is correct as $this->addResourceToCour...eNode, $course, $right) targeting Chamilo\CoreBundle\Repos...::addResourceToCourse() seems to always return null.

This check looks for function or method calls that always return null and whose return value is assigned to a variable.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
$object = $a->getObject();

The method getObject() can return nothing but null, so it makes no sense to assign that value to a variable.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
377
            $resourceNode,
378
            $course,
379
            $right
380
        );
381
        $resourceLink->setSession($session);
382
        $this->getEntityManager()->persist($resourceLink);
383
384
        return $resourceLink;
385
    }
386
387
    /**
388
     * @param ResourceNode  $resourceNode
389
     * @param Course        $course
390
     * @param CGroupInfo    $group
391
     * @param ResourceRight $right
392
     *
393
     * @return ResourceLink
394
     */
395
    public function addResourceToCourseGroup(
396
        ResourceNode $resourceNode,
397
        Course $course,
398
        CGroupInfo $group,
399
        ResourceRight $right
400
    ) {
401
        $resourceLink = $this->addResourceToCourse(
0 ignored issues
show
Bug introduced by
The call to Chamilo\CoreBundle\Repos...::addResourceToCourse() has too few arguments starting with session. ( Ignorable by Annotation )

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

401
        /** @scrutinizer ignore-call */ 
402
        $resourceLink = $this->addResourceToCourse(

This check compares calls to functions or methods with their respective definitions. If the call has less arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
Bug introduced by
Are you sure the assignment to $resourceLink is correct as $this->addResourceToCour...eNode, $course, $right) targeting Chamilo\CoreBundle\Repos...::addResourceToCourse() seems to always return null.

This check looks for function or method calls that always return null and whose return value is assigned to a variable.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
$object = $a->getObject();

The method getObject() can return nothing but null, so it makes no sense to assign that value to a variable.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
402
            $resourceNode,
403
            $course,
404
            $right
405
        );
406
        $resourceLink->setGroup($group);
407
        $this->getEntityManager()->persist($resourceLink);
408
409
        return $resourceLink;
410
    }
411
412
    /**
413
     * @param ResourceNode  $resourceNode
414
     * @param Usergroup     $group
415
     * @param ResourceRight $right
416
     *
417
     * @return ResourceLink
418
     */
419
    public function addResourceToGroup(
420
        ResourceNode $resourceNode,
421
        Usergroup $group,
422
        ResourceRight $right
423
    ) {
424
        $resourceLink = new ResourceLink();
425
        $resourceLink
426
            ->setResourceNode($resourceNode)
427
            ->setUserGroup($group)
428
            ->addResourceRight($right);
429
430
        return $resourceLink;
431
    }
432
433
    /**
434
     * @param ResourceNode $resourceNode
435
     * @param array        $userList     User id list
436
     */
437
    public function addResourceToUserList(ResourceNode $resourceNode, array $userList)
438
    {
439
        $em = $this->getEntityManager();
440
441
        if (!empty($userList)) {
442
            foreach ($userList as $userId) {
443
                $toUser = $em->getRepository('ChamiloUserBundle:User')->find($userId);
444
445
                $resourceLink = $this->addResourceNodeToUser($resourceNode, $toUser);
446
                $em->persist($resourceLink);
447
            }
448
        }
449
    }
450
451
    /**
452
     * @param Course           $course
453
     * @param Tool             $tool
454
     * @param AbstractResource $parent
455
     *
456
     * @return ResourceLink
457
     */
458
    public function getResourceByCourse(Course $course, Tool $tool, AbstractResource $parent = null)
459
    {
460
        $query = $this->getEntityManager()->createQueryBuilder()
461
            ->select('resource')
462
            ->from('Chamilo\CoreBundle\Entity\Resource\ResourceNode', 'node')
463
            ->innerJoin('node.links', 'links')
464
            ->innerJoin(
465
                $this->getClassName(),
466
                'resource',
467
                Join::WITH,
468
                'resource.course = links.course AND resource.resourceNode = node.id'
469
            )
470
            ->where('node.tool = :tool')
471
            ->andWhere('links.course = :course')
472
            //->where('link.cId = ?', $course->getId())
473
            //->where('node.cId = 0')
474
            //->orderBy('node');
475
            ->setParameters(
476
                [
477
                    'tool' => $tool,
478
                    'course' => $course,
479
                ]
480
            );
481
482
        if ($parent !== null) {
483
            $query->andWhere('node.parent = :parentId');
484
            $query->setParameter('parentId', $parent->getResourceNode()->getId());
485
        } else {
486
            $query->andWhere('node.parent IS NULL');
487
        }
488
489
        $query = $query->getQuery();
490
491
        /*$query = $this->getEntityManager()->createQueryBuilder()
492
            ->select('notebook')
493
            ->from('ChamiloNotebookBundle:CNotebook', 'notebook')
494
            ->innerJoin('notebook.resourceNodes', 'node')
495
            //->innerJoin('node.links', 'link')
496
            ->where('node.tool = :tool')
497
            //->where('link.cId = ?', $course->getId())
498
            //->where('node.cId = 0')
499
            //->orderBy('node');
500
            ->setParameters(array(
501
                    'tool'=> 'notebook'
502
                )
503
            )
504
            ->getQuery()
505
        ;*/
506
507
        return $query->getResult();
508
    }
509
510
    /**
511
     * @param string $tool
512
     *
513
     * @return Tool|null
514
     */
515
    public function getTool($tool)
516
    {
517
        return $this
518
            ->getEntityManager()
519
            ->getRepository('ChamiloCoreBundle:Tool')
520
            ->findOneBy(['name' => $tool]);
521
    }
522
523
    /**
524
     * @param AbstractResource $resource
525
     * @param int              $visibility
526
     * @param bool             $recursive
527
     */
528
    private function setLinkVisibility(AbstractResource $resource, $visibility, $recursive = true)
529
    {
530
        $resourceNode = $resource->getResourceNode();
531
532
        $em = $this->getEntityManager();
533
        if ($recursive) {
534
            $children = $resourceNode->getChildren();
535
            if (!empty($children)) {
536
                /** @var ResourceNode $child */
537
                foreach ($children as $child) {
538
                    $criteria = ['resourceNode' => $child];
539
                    $childDocument = $this->getRepository()->findOneBy($criteria);
540
                    if ($childDocument) {
541
                        $this->setLinkVisibility($childDocument, $visibility);
542
                    }
543
                }
544
            }
545
        }
546
547
        $links = $resourceNode->getResourceLinks();
548
549
        if (!empty($links)) {
550
            /** @var ResourceLink $link */
551
            foreach ($links as $link) {
552
                $link->setVisibility($visibility);
553
554
                if ($visibility === ResourceLink::VISIBILITY_DRAFT) {
555
                    $editorMask = ResourceNodeVoter::getEditorMask();
556
                    $rights = [];
557
                    $resourceRight = new ResourceRight();
558
                    $resourceRight
559
                        ->setMask($editorMask)
560
                        ->setRole(ResourceNodeVoter::ROLE_CURRENT_COURSE_TEACHER)
561
                        ->setResourceLink($link)
562
                    ;
563
                    $rights[] = $resourceRight;
564
565
                    if (!empty($rights)) {
566
                        $link->setResourceRight($rights);
567
                    }
568
                } else {
569
                    $link->setResourceRight([]);
570
                }
571
                $em->merge($link);
572
            }
573
        }
574
        $em->flush();
575
    }
576
577
    /**
578
     * Deletes the AbstractResource (CDocument, CQuiz), ResourceNode,
579
     * ResourceLinks and ResourceFile as well as deletes the files phisically via Flysystem.
580
     *
581
     * @param AbstractResource $resource
582
     *
583
     */
584
    public function hardDelete(AbstractResource $resource)
585
    {
586
        $em = $this->getEntityManager();
587
        $em->remove($resource);
588
        $em->flush();
589
    }
590
591
    /**
592
     * Change all links visibility to DELETED.
593
     *
594
     * @param AbstractResource $resource
595
     */
596
    public function softDelete(AbstractResource $resource)
597
    {
598
        $this->setLinkVisibility($resource, ResourceLink::VISIBILITY_DELETED);
599
    }
600
}
601