diff --git a/src/bundle/Resources/config/input_parsers.yml b/src/bundle/Resources/config/input_parsers.yml index 4965346a..80f50e1f 100644 --- a/src/bundle/Resources/config/input_parsers.yml +++ b/src/bundle/Resources/config/input_parsers.yml @@ -285,6 +285,11 @@ services: tags: - { name: ibexa.rest.input.parser, mediaType: application/vnd.ibexa.api.internal.ContentQuery } + Ibexa\Rest\Server\Input\Parser\FilterParser: + parent: Ibexa\Rest\Server\Common\Parser + tags: + - { name: ibexa.rest.input.parser, mediaType: application/vnd.ibexa.api.internal.Filter } + Ibexa\Rest\Server\Input\Parser\LocationQuery: parent: Ibexa\Rest\Server\Common\Parser class: Ibexa\Rest\Server\Input\Parser\LocationQuery @@ -441,6 +446,14 @@ services: tags: - { name: ibexa.rest.input.parser, mediaType: application/vnd.ibexa.api.internal.criterion.UserMetadata } + Ibexa\Rest\Server\Input\Parser\Criterion\IsContainer: + parent: Ibexa\Rest\Server\Common\Parser + class: Ibexa\Rest\Server\Input\Parser\Criterion\IsContainer + arguments: + $parserTools: '@Ibexa\Rest\Input\ParserTools' + tags: + - { name: ibexa.rest.input.parser, mediaType: application/vnd.ibexa.api.internal.criterion.IsContainer } + Ibexa\Rest\Server\Input\Parser\Criterion\IsUserBased: parent: Ibexa\Rest\Server\Common\Parser arguments: diff --git a/src/lib/Server/Input/Parser/Criterion/IsContainer.php b/src/lib/Server/Input/Parser/Criterion/IsContainer.php new file mode 100644 index 00000000..3cea08bd --- /dev/null +++ b/src/lib/Server/Input/Parser/Criterion/IsContainer.php @@ -0,0 +1,35 @@ +parserTools = $parserTools; + } + + public function parse(array $data, ParsingDispatcher $parsingDispatcher): IsContainerCriterion + { + if (!array_key_exists('IsContainer', $data)) { + throw new Exceptions\Parser('Invalid format'); + } + + return new IsContainerCriterion($this->parserTools->parseBooleanValue($data['IsContainer'])); + } +} diff --git a/src/lib/Server/Input/Parser/FilterParser.php b/src/lib/Server/Input/Parser/FilterParser.php new file mode 100644 index 00000000..fe45c849 --- /dev/null +++ b/src/lib/Server/Input/Parser/FilterParser.php @@ -0,0 +1,98 @@ +andWithCriterion($this->processCriteriaArray($data['criteria'], $parsingDispatcher)); + } + + // limit + if (array_key_exists('limit', $data)) { + $filter->withLimit((int)$data['limit']); + } + + // offset + if (array_key_exists('offset', $data)) { + $filter->withOffset((int)$data['offset']); + } + + return $filter; + } + + /** + * @param array $criteriaArray + * @param \Ibexa\Contracts\Rest\Input\ParsingDispatcher $parsingDispatcher + * + * @return \Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion|null A criterion, or a LogicalAnd with a set of Criterion, or null if an empty array was given + */ + private function processCriteriaArray(array $criteriaArray, ParsingDispatcher $parsingDispatcher) + { + if (count($criteriaArray) === 0) { + return null; + } + + $criteria = []; + foreach ($criteriaArray as $criteriaSpec) { + $criterionName = $criteriaSpec['type']; + $criterionData = $criteriaSpec['value']; + + $criteria[] = $this->dispatchCriterion($criterionName, $criterionData, $parsingDispatcher); + } + + return (count($criteria) === 1) ? $criteria[0] : new CriterionValue\LogicalAnd($criteria); + } + + /** + * Dispatches parsing of a criterion name + data to its own parser. + * + * @param string $criterionName + * @param mixed $criterionData + * @param \Ibexa\Contracts\Rest\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \Ibexa\Contracts\Rest\Exceptions\Parser + * + * @return \Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion + */ + public function dispatchCriterion($criterionName, $criterionData, ParsingDispatcher $parsingDispatcher) + { + $mediaType = $this->getCriterionMediaType($criterionName); + try { + return $parsingDispatcher->parse([$criterionName => $criterionData], $mediaType); + } catch (Exceptions\Parser $e) { + throw new Exceptions\Parser("Invalid Criterion id <$criterionName> in ", 0, $e); + } + } + + protected function getCriterionMediaType($criterionName) + { + return 'application/vnd.ibexa.api.internal.criterion.' . $criterionName; + } +}