Passed
Push — master ( 1e0b50...40a262 )
by Angel Fernando Quiroz
09:11
created

CCalendarEventExtension::applyToCollection()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
c 0
b 0
f 0
nc 1
nop 5
dl 0
loc 8
rs 10
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
declare(strict_types=1);
6
7
namespace Chamilo\CoreBundle\DataProvider\Extension;
8
9
use ApiPlatform\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
10
// use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryItemExtensionInterface;
11
// use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryItemExtensionInterface;
12
use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface;
13
use ApiPlatform\Metadata\Operation;
14
use Chamilo\CoreBundle\Entity\User;
15
use Chamilo\CourseBundle\Entity\CCalendarEvent;
16
use Doctrine\ORM\QueryBuilder;
17
use Symfony\Component\HttpFoundation\RequestStack;
18
use Symfony\Component\Security\Core\Security;
19
20
final class CCalendarEventExtension implements QueryCollectionExtensionInterface // , QueryItemExtensionInterface
21
{
22
    use CourseLinkExtensionTrait;
23
24
    public function __construct(
25
        private readonly Security $security,
26
        private readonly RequestStack $requestStack
27
    ) {}
28
29
    public function applyToCollection(
30
        QueryBuilder $queryBuilder,
31
        QueryNameGeneratorInterface $queryNameGenerator,
32
        string $resourceClass,
33
        ?Operation $operation = null,
34
        array $context = []
35
    ): void {
36
        $this->addWhere($queryBuilder, $resourceClass);
37
    }
38
39
    private function addWhere(QueryBuilder $qb, string $resourceClass): void
40
    {
41
        if (CCalendarEvent::class !== $resourceClass) {
42
            return;
43
        }
44
45
        /** @var User $user */
46
        $user = $this->security->getUser();
47
        $alias = $qb->getRootAliases()[0];
48
49
        $qb
50
            ->innerJoin("$alias.resourceNode", 'node')
51
            ->leftJoin('node.resourceLinks', 'resource_links')
52
        ;
53
54
        $request = $this->requestStack->getCurrentRequest();
55
        $courseId = $request->query->getInt('cid');
56
        $sessionId = $request->query->getInt('sid');
57
        $groupId = $request->query->getInt('gid');
58
59
        $inCourseBase = !empty($courseId);
60
        $inSession = !empty($sessionId);
61
        $inCourseSession = $inCourseBase && $inSession;
62
63
        $inPersonalList = !$inCourseBase && !$inCourseSession;
64
65
        if ($inPersonalList) {
66
            $qb
67
                ->andWhere(
68
                    $qb->expr()->orX(
69
                        $qb->expr()->eq('resource_links.user', ':user'),
70
                        $qb->expr()->eq('node.creator', ':user')
71
                    )
72
                )
73
                ->setParameter('user', $user->getId())
74
            ;
75
        }
76
    }
77
}
78