Skip to content
Snippets Groups Projects
CourseCollectionDataProvider.php 1.6 KiB
Newer Older
Tobias Gross-Vogt's avatar
Tobias Gross-Vogt committed
<?php

declare(strict_types=1);

namespace Dbp\Relay\CourseBundle\DataProvider;

use ApiPlatform\Core\DataProvider\CollectionDataProviderInterface;
use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
use Dbp\Relay\CoreBundle\Helpers\ArrayFullPaginator;
use Dbp\Relay\CourseBundle\API\CourseProviderInterface;
Tobias Gross-Vogt's avatar
Tobias Gross-Vogt committed
use Dbp\Relay\CourseBundle\Entity\Course;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

final class CourseCollectionDataProvider extends AbstractController implements CollectionDataProviderInterface, RestrictedDataProviderInterface
{
    private $api;

    public function __construct(CourseProviderInterface $api)
    {
        $this->api = $api;
    }

    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
    {
Tobias Gross-Vogt's avatar
Tobias Gross-Vogt committed
        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
Tobias Gross-Vogt's avatar
Tobias Gross-Vogt committed

        $filters = $context['filters'] ?? [];
Tobias Gross-Vogt's avatar
Tobias Gross-Vogt committed
        $options = ['lang' => $filters['lang'] ?? 'de'];

        $term = $filters['term'] ?? null;
        if ($term !== null) {
            $options['term'] = $term;
        }

Tobias Gross-Vogt's avatar
Tobias Gross-Vogt committed
        $page = 1;
Tobias Gross-Vogt's avatar
Tobias Gross-Vogt committed
        if (isset($filters['page'])) {
            $page = (int) $filters['page'];
        }
Tobias Gross-Vogt's avatar
Tobias Gross-Vogt committed

        $perPage = 30;
Tobias Gross-Vogt's avatar
Tobias Gross-Vogt committed
        if (isset($filters['perPage'])) {
            $perPage = (int) $filters['perPage'];
        }

Tobias Gross-Vogt's avatar
Tobias Gross-Vogt committed
        return new ArrayFullPaginator($this->api->getCourses($options), $page, $perPage);
Tobias Gross-Vogt's avatar
Tobias Gross-Vogt committed
    }
}