Course: Filter courses by access URL if multiple URLs enabled

pull/5694/head
christianbeeznst 1 year ago
parent 6e368ec51c
commit ea18bb5c34
  1. 2
      public/main/admin/course_edit.php
  2. 40
      src/CoreBundle/DataProvider/Extension/CourseRelUserExtension.php

@ -310,7 +310,7 @@ if ($form->validate()) {
$visibility = $course['visibility']; $visibility = $course['visibility'];
if (isset($course['duration'])) { if (isset($course['duration'])) {
$course['duration'] = $course['duration'] * 60; $course['duration'] = (int) $course['duration'] * 60;
} }
// @todo should be check in the CidReqListener // @todo should be check in the CidReqListener

@ -9,18 +9,19 @@ namespace Chamilo\CoreBundle\DataProvider\Extension;
use ApiPlatform\Doctrine\Orm\Extension\QueryCollectionExtensionInterface; use ApiPlatform\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface; use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use ApiPlatform\Metadata\Operation; use ApiPlatform\Metadata\Operation;
use Chamilo\CoreBundle\Entity\AccessUrlRelCourse;
use Chamilo\CoreBundle\Entity\CourseRelUser; use Chamilo\CoreBundle\Entity\CourseRelUser;
use Chamilo\CoreBundle\Entity\User; use Chamilo\CoreBundle\Entity\User;
use Chamilo\CoreBundle\ServiceHelper\AccessUrlHelper;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
use Symfony\Bundle\SecurityBundle\Security; use Symfony\Bundle\SecurityBundle\Security;
use Symfony\Component\Security\Core\Exception\AccessDeniedException; use Symfony\Component\Security\Core\Exception\AccessDeniedException;
// use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryItemExtensionInterface; final class CourseRelUserExtension implements QueryCollectionExtensionInterface
final class CourseRelUserExtension implements QueryCollectionExtensionInterface // , QueryItemExtensionInterface
{ {
public function __construct( public function __construct(
private readonly Security $security private readonly Security $security,
private readonly AccessUrlHelper $accessUrlHelper
) {} ) {}
public function applyToCollection( public function applyToCollection(
@ -30,13 +31,34 @@ final class CourseRelUserExtension implements QueryCollectionExtensionInterface
?Operation $operation = null, ?Operation $operation = null,
array $context = [] array $context = []
): void { ): void {
if ($this->accessUrlHelper->isMultiple()) {
$accessUrl = $this->accessUrlHelper->getCurrent();
$rootAlias = $queryBuilder->getRootAliases()[0];
if (isset($context['filters']['sticky']) && $context['filters']['sticky']) {
$queryBuilder
->innerJoin(
AccessUrlRelCourse::class,
'url_rel',
'WITH',
'url_rel.course = ' . $rootAlias
)
->andWhere('url_rel.url = :access_url_id')
->setParameter('access_url_id', $accessUrl->getId());
} else {
$queryBuilder
->innerJoin("$rootAlias.course", 'c')
->innerJoin('c.urls', 'url_rel')
->andWhere('url_rel.url = :access_url_id')
->setParameter('access_url_id', $accessUrl->getId());
}
}
if ($this->security->isGranted('ROLE_ADMIN')) { if ($this->security->isGranted('ROLE_ADMIN')) {
return; return;
} }
if (CourseRelUser::class === $resourceClass) { if (CourseRelUser::class === $resourceClass) {
// Blocks a ROLE_USER to access CourseRelUsers from another User. if ('collection_query' === $operation?->getName()) {
if ('collection_query' === $operation->getName()) {
/** @var User|null $user */ /** @var User|null $user */
if (null === $user = $this->security->getUser()) { if (null === $user = $this->security->getUser()) {
throw new AccessDeniedException('Access Denied.'); throw new AccessDeniedException('Access Denied.');
@ -51,12 +73,6 @@ final class CourseRelUserExtension implements QueryCollectionExtensionInterface
$this->addWhere($queryBuilder, $resourceClass); $this->addWhere($queryBuilder, $resourceClass);
} }
/*public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, string $operationName = null, array $context = []): void
{
error_log('applyToItem');
$this->addWhere($queryBuilder, $resourceClass);
}*/
private function addWhere(QueryBuilder $queryBuilder, string $resourceClass): void private function addWhere(QueryBuilder $queryBuilder, string $resourceClass): void
{ {
if (CourseRelUser::class !== $resourceClass) { if (CourseRelUser::class !== $resourceClass) {

Loading…
Cancel
Save