diff --git a/config/services.yaml b/config/services.yaml index 92015a0c6..14e7a3cd6 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -90,6 +90,11 @@ services: Bolt\Twig\DumpExtension: arguments: ["%kernel.environment%"] + Bolt\Api\Extensions\ContentExtension: + tags: + - { name: api_platform.doctrine.orm.query_extension.collection } + - { name: api_platform.doctrine.orm.query_extension.item } + Doctrine\ORM\Query\Expr: ~ monolog.processor.request: diff --git a/src/Api/Extensions/ContentExtension.php b/src/Api/Extensions/ContentExtension.php new file mode 100644 index 000000000..3999070c4 --- /dev/null +++ b/src/Api/Extensions/ContentExtension.php @@ -0,0 +1,64 @@ +config = $config; + } + + public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?string $operationName = null): void + { + if ($resourceClass !== Content::class) { + return; + } + + $this->requirePublishedContent($queryBuilder); + } + + public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, ?string $operationName = null, array $context = []): void + { + if ($resourceClass !== Content::class) { + return; + } + + $this->requirePublishedContent($queryBuilder); + $this->excludeViewlessContent($queryBuilder); + } + + private function requirePublishedContent(QueryBuilder $queryBuilder): void + { + $rootAlias = $queryBuilder->getRootAliases()[0]; + $queryBuilder->andWhere(sprintf('%s.status = :status', $rootAlias)); + $queryBuilder->setParameter('status', Statuses::PUBLISHED); + } + + private function excludeViewlessContent(QueryBuilder $queryBuilder): void + { + $rootAlias = $queryBuilder->getRootAliases()[0]; + + $viewlessContentTypes = $this->config->get('contenttypes')->filter(function ($ct) { + return $ct->get('viewless', false); + })->map(function ($ct) { + return $ct->get('slug'); + })->toArray(); + + $queryBuilder->andWhere(sprintf('%s.contentType NOT IN (:cts)', $rootAlias)); + $queryBuilder->setParameter('cts', $viewlessContentTypes); + } +}