Newer
Older
namespace Dbp\Relay\BaseCourseBundle\DataProvider;
use ApiPlatform\Core\DataProvider\CollectionDataProviderInterface;
use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
use Dbp\Relay\BaseCourseBundle\API\CourseProviderInterface;
use Dbp\Relay\BaseCourseBundle\Entity\Course;
use Dbp\Relay\CoreBundle\Helpers\ArrayFullPaginator;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
final class CourseCollectionDataProvider extends AbstractController implements CollectionDataProviderInterface, RestrictedDataProviderInterface
{
private $courseProvider;
public function __construct(CourseProviderInterface $courseProvider)
$this->courseProvider = $courseProvider;
}
public function supports(string $resourceClass, string $operationName = null, array $context = []): bool
{
return Course::class === $resourceClass;
}
public function getCollection(string $resourceClass, string $operationName = null, array $context = []): ArrayFullPaginator
{
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
$options['lang'] = $filters['lang'] ?? 'de';
$term = $filters['term'] ?? null;
if ($term !== null) {
$options['term'] = $term;
}
$organizationId = $filters['organizationId'] ?? null;
$personId = $filters['personId'] ?? null;
$courses = null;
if (!empty($organizationId) || !empty($personId)) {
if (!empty($organizationId)) {
$courses = $this->courseProvider->getCoursesByOrganization($organizationId, $options);
}
if (!empty($personId)) {
$coursesByPerson = $this->courseProvider->getCoursesByPerson($personId, $options);
if (!empty($organizationId)) {
Tobias Gross-Vogt
committed
$courses = array_uintersect($courses, $coursesByPerson,
'Dbp\Relay\BaseCourseBundle\DataProvider\CourseCollectionDataProvider::compareCourses');
$courses = array_values($courses);
} else {
$courses = $coursesByPerson;
}
}
} else {
$courses = $this->courseProvider->getCourses($options);
}
if (isset($filters['page'])) {
$page = (int) $filters['page'];
}
if (isset($filters['perPage'])) {
$perPage = (int) $filters['perPage'];
}
return new ArrayFullPaginator($courses, $page, $perPage);
}
Tobias Gross-Vogt
committed
public static function compareCourses(Course $a, Course $b): int
{
if ($a->getIdentifier() > $b->getIdentifier()) {
return 1;
Tobias Gross-Vogt
committed
} elseif ($a->getIdentifier() === $b->getIdentifier()) {
return 0;
} else {
return -1;
}