Skip to content

Commit 31eb027

Browse files
Attendance: Fix session reference handling - refs BT#22571
1 parent 5f0aea6 commit 31eb027

File tree

2 files changed

+26
-23
lines changed

2 files changed

+26
-23
lines changed

src/CoreBundle/Filter/SidFilter.php

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,17 @@ public function getDescription(string $resourceClass): array
4242
'property' => null,
4343
'type' => 'string',
4444
'required' => false,
45-
'description' => 'Course identifier',
45+
'description' => 'Session identifier',
4646
],
4747
];
4848
}
4949

5050
/**
51-
* @param mixed $value
52-
*
5351
* @throws ReflectionException
5452
*/
5553
protected function filterProperty(
5654
string $property,
57-
$value,
55+
$value,
5856
QueryBuilder $queryBuilder,
5957
QueryNameGeneratorInterface $queryNameGenerator,
6058
string $resourceClass,
@@ -65,41 +63,44 @@ protected function filterProperty(
6563
return;
6664
}
6765

68-
$reflection = new ReflectionClass($resourceClass);
66+
$alias = $queryBuilder->getRootAliases()[0];
67+
$session = $this->getSession();
6968

69+
$reflection = new ReflectionClass($resourceClass);
7070
$loadBaseSessionContent = \in_array(
7171
ResourceShowCourseResourcesInSessionInterface::class,
7272
$reflection->getInterfaceNames(),
7373
true
7474
);
7575

76-
// Session was set with a kernel request from CoreBundle\EventListener\CidReqListener class
77-
$session = $this->getSession();
76+
$joins = $queryBuilder->getDQLPart('join');
77+
78+
if (empty($joins[$alias]) || !array_filter($joins[$alias], fn($j) => $j->getAlias() === 'resourceNode')) {
79+
$queryBuilder->leftJoin($alias . '.resourceNode', 'resourceNode');
80+
}
81+
82+
if (empty($joins['resourceNode']) || !array_filter($joins['resourceNode'], fn($j) => $j->getAlias() === 'resourceLink')) {
83+
$queryBuilder->leftJoin('resourceNode.resourceLinks', 'resourceLink');
84+
}
7885

7986
if (null === $session) {
8087
$queryBuilder->andWhere(
8188
$queryBuilder->expr()->orX(
82-
$queryBuilder->expr()->isNull('resource_links.session'),
83-
$queryBuilder->expr()->eq('resource_links.session', 0)
89+
'resourceLink.session IS NULL',
90+
'resourceLink.session = 0'
8491
)
8592
);
8693
} elseif ($loadBaseSessionContent) {
87-
$queryBuilder
88-
->andWhere(
89-
$queryBuilder->expr()->orX(
90-
$queryBuilder->expr()->eq('resource_links.session', ':session'),
91-
$queryBuilder->expr()->isNull('resource_links.session')
92-
)
94+
$queryBuilder->andWhere(
95+
$queryBuilder->expr()->orX(
96+
'resourceLink.session = :session',
97+
'resourceLink.session IS NULL'
9398
)
94-
->setParameter('session', $session?->getId())
95-
;
99+
)->setParameter('session', $session->getId());
96100
} else {
97101
$queryBuilder
98-
->andWhere(
99-
$queryBuilder->expr()->eq('resource_links.session', ':session')
100-
)
101-
->setParameter('session', $session?->getId())
102-
;
102+
->andWhere('resourceLink.session = :session')
103+
->setParameter('session', $session->getId());
103104
}
104105
}
105106
}

src/CourseBundle/Entity/CAttendance.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use ApiPlatform\Metadata\Put;
1717
use Chamilo\CoreBundle\Entity\AbstractResource;
1818
use Chamilo\CoreBundle\Entity\ResourceInterface;
19+
use Chamilo\CoreBundle\Filter\SidFilter;
1920
use Chamilo\CoreBundle\State\CAttendanceStateProcessor;
2021
use Chamilo\CourseBundle\Repository\CAttendanceRepository;
2122
use Doctrine\Common\Collections\ArrayCollection;
@@ -78,11 +79,12 @@
7879
security: "is_granted('ROLE_TEACHER')"
7980
),
8081
],
81-
normalizationContext: ['groups' => ['attendance:read']],
82+
normalizationContext: ['groups' => ['attendance:read', 'resource_node:read', 'resource_link:read']],
8283
denormalizationContext: ['groups' => ['attendance:write']],
8384
paginationEnabled: true,
8485
)]
8586
#[ApiFilter(SearchFilter::class, properties: ['active' => 'exact', 'title' => 'partial', 'resourceNode.parent' => 'exact'])]
87+
#[ApiFilter(filterClass: SidFilter::class)]
8688
#[ORM\Table(name: 'c_attendance')]
8789
#[ORM\Index(columns: ['active'], name: 'active')]
8890
#[ORM\Entity(repositoryClass: CAttendanceRepository::class)]

0 commit comments

Comments
 (0)