From e621a98e44ebca3137e22b69113694d3e3a7234a Mon Sep 17 00:00:00 2001 From: Tobias Wojtylak Date: Mon, 28 Nov 2022 11:22:49 +0100 Subject: [PATCH] feat: add site restriction for api relates: https://app.clickup.com/t/34g9gt1 --- .../Restriction/ApiRestrictionContainer.php | 1 + .../Query/Restriction/SiteRestriction.php | 75 +++++++++++++++++++ Configuration/Services.yaml | 3 + Tests/Acceptance/Fixtures/pages.xml | 7 ++ 4 files changed, 86 insertions(+) create mode 100644 Classes/Database/Query/Restriction/SiteRestriction.php diff --git a/Classes/Database/Query/Restriction/ApiRestrictionContainer.php b/Classes/Database/Query/Restriction/ApiRestrictionContainer.php index 675135d..34f49aa 100644 --- a/Classes/Database/Query/Restriction/ApiRestrictionContainer.php +++ b/Classes/Database/Query/Restriction/ApiRestrictionContainer.php @@ -18,6 +18,7 @@ class ApiRestrictionContainer extends AbstractRestrictionContainer protected $defaultRestrictionTypes = [ DeletedRestriction::class, LanguageRestriction::class, + SiteRestriction::class, ]; /** diff --git a/Classes/Database/Query/Restriction/SiteRestriction.php b/Classes/Database/Query/Restriction/SiteRestriction.php new file mode 100644 index 0000000..4af6959 --- /dev/null +++ b/Classes/Database/Query/Restriction/SiteRestriction.php @@ -0,0 +1,75 @@ +queryGenerator = $queryGenerator; + } + + public function buildExpression(array $queriedTables, ExpressionBuilder $expressionBuilder): CompositeExpression + { + $constraints = []; + + $sitePids = $this->getSitePids(); + + if ([] === $sitePids) { + return $expressionBuilder->andX(); + } + + foreach ($queriedTables as $tableAlias => $tableName) { + if ('pages' === $tableName) { + $constraints[] = $expressionBuilder->orX( + $expressionBuilder->in($tableAlias . '.uid', $sitePids), + $expressionBuilder->in($tableAlias . '.pid', $sitePids) + ); + } else { + $constraints[] = $expressionBuilder->in($tableAlias . '.pid', $sitePids); + } + } + + return $expressionBuilder->andX(...$constraints); + } + + private function getSitePids(): array + { + if (\is_array($this->cachedSitePids)) { + return $this->cachedSitePids; + } + + /** @var RequestInterface $request */ + $request = $GLOBALS['TYPO3_REQUEST'] ?? null; + + if (null === $request) { + return []; + } + + /** @var Site $site */ + $site = $request->getAttribute('site'); + + if (null === $site) { + return []; + } + + $this->cachedSitePids = \explode(',', $this->queryGenerator->getTreeList($site->getRootPageId(), 999)); + + return $this->cachedSitePids; + } +} diff --git a/Configuration/Services.yaml b/Configuration/Services.yaml index 49ea86e..885a644 100644 --- a/Configuration/Services.yaml +++ b/Configuration/Services.yaml @@ -12,3 +12,6 @@ services: DFAU\ToujouApi\Database\Query\Restriction\LanguageRestriction: public: true + + DFAU\ToujouApi\Database\Query\Restriction\SiteRestriction: + public: true diff --git a/Tests/Acceptance/Fixtures/pages.xml b/Tests/Acceptance/Fixtures/pages.xml index 5ce18b1..0912b9b 100644 --- a/Tests/Acceptance/Fixtures/pages.xml +++ b/Tests/Acceptance/Fixtures/pages.xml @@ -25,4 +25,11 @@ 2 2 + + 4 + 0 + Second Page Root + 1 + 1 +