Skip to content

Commit 1b5cdf7

Browse files
authored
Merge pull request #451 from ConductionNL/feature/connector-185/write-files
Fix rewriting urls of inversed objects and filtering on urls
2 parents a9efac6 + 1268ec4 commit 1b5cdf7

File tree

1 file changed

+57
-10
lines changed

1 file changed

+57
-10
lines changed

lib/Service/EndpointService.php

Lines changed: 57 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,55 @@ private function replaceUuidsInArray(array $data, array $uuidToUrlMap, ?bool $is
404404
return $data;
405405
}
406406

407+
/**
408+
* Inverse of replaceInternalReferences, rewriting external references to internal references for query parameters.
409+
*
410+
* @param array $parameters The incoming request parameters.
411+
* @param \OCA\OpenRegister\Service\ObjectService|QBMapper $mapper The ObjectService containing the request schema.
412+
*
413+
* @return array The updated request parameters.
414+
*
415+
* @throws ContainerExceptionInterface|NotFoundExceptionInterface
416+
*/
417+
private function rewriteExternalReferences(array $parameters, \OCA\OpenRegister\Service\ObjectService|QBMapper $mapper): array
418+
{
419+
$schemaMapper = $this->containerInterface->get('OCA\OpenRegister\Db\SchemaMapper');
420+
$schema = $schemaMapper->find($mapper->getSchema());
421+
422+
$rewriteParameters = array_intersect(array_keys($parameters), array_keys($schema->getProperties()));
423+
424+
foreach($rewriteParameters as $rewriteParameter) {
425+
if (
426+
((isset($schema->getProperties()[$rewriteParameter]['$ref']) === false
427+
|| empty($schema->getProperties()[$rewriteParameter]['$ref']) === true)
428+
&& (isset($schema->getProperties()[$rewriteParameter]['items']['$ref']) === false
429+
|| empty($schema->getProperties()[$rewriteParameter]['items']['$ref']) === true))
430+
|| filter_var($parameters[$rewriteParameter], FILTER_VALIDATE_URL) === false
431+
) {
432+
continue;
433+
}
434+
435+
$parsedPath = parse_url($parameters[$rewriteParameter], PHP_URL_PATH);
436+
$parsedPath = substr($parsedPath, 33);
437+
$endpoints = $this->endpointMapper->findByPathRegex(
438+
path: $parsedPath,
439+
method: 'GET'
440+
);
441+
442+
if(count($endpoints) < 1) {
443+
continue;
444+
}
445+
446+
$endpoint = array_shift($endpoints);
447+
448+
$pathArray = $this->getPathParameters(endpointArray: $endpoint->getEndpointArray(), path: $parsedPath);
449+
$parameters[$rewriteParameter] = end($pathArray);
450+
451+
}
452+
453+
return $parameters;
454+
}
455+
407456
/**
408457
* Fetch objects for the endpoint.
409458
*
@@ -421,12 +470,10 @@ private function getObjects(
421470
int &$status = 200
422471
): Entity|array
423472
{
424-
$extend = $requestParams['extend'] ?? $requestParams['_extend'] ?? null;
425-
426473
if (isset($pathParams['id']) === true && $pathParams['id'] === end($pathParams)) {
427-
return $this->objectService->getOpenRegisters()->renderEntity(
428-
entity: $this->replaceInternalReferences(mapper: $mapper, object: $mapper->find($pathParams['id'])),
429-
extend: $parameters['_extend'] ?? $parameters['extend'] ?? null
474+
return $this->replaceInternalReferences(mapper: $mapper, serializedObject: $this->objectService->getOpenRegisters()->renderEntity(
475+
entity: $mapper->find($pathParams['id'])->jsonSerialize(),
476+
extend: $parameters['_extend'] ?? $parameters['extend'] ?? null),
430477
);
431478

432479

@@ -442,7 +489,7 @@ private function getObjects(
442489
$id = pos($pathParams);
443490
}
444491

445-
$main = $this->objectService->getOpenRegisters()->renderEntity($mapper->findByUuid($pathParams['id'])->jsonSerialize());
492+
$main = $this->objectService->getOpenRegisters()->renderEntity($mapper->findByUuid($pathParams['id'])->getObject());
446493
$ids = $main[$property];
447494

448495
if(isset($main[$property]) === false) {
@@ -481,12 +528,12 @@ private function getObjects(
481528
return $returnArray;
482529
}
483530

531+
$parameters = $this->rewriteExternalReferences($parameters, $mapper);
532+
484533
$result = $mapper->findAllPaginated(requestParams: $parameters);
485534

486-
$result['results'] = array_map(function ($object) use ($mapper, $extend) {
487-
$object = is_array($object) ? $object : $object->jsonSerialize();
488-
$object = $mapper->renderEntity(entity: $object, extend: $extend);
489-
return $this->replaceInternalReferences(mapper: $mapper, serializedObject: $object);
535+
$result['results'] = array_map(function ($object) use ($mapper) {
536+
return $this->replaceInternalReferences(mapper: $mapper, serializedObject: $this->objectService->getOpenRegisters()->renderEntity(entity: $object->jsonSerialize()));
490537
}, $result['results']);
491538

492539
$returnArray = [

0 commit comments

Comments
 (0)