@@ -404,6 +404,55 @@ private function replaceUuidsInArray(array $data, array $uuidToUrlMap, ?bool $is
404
404
return $ data ;
405
405
}
406
406
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
+
407
456
/**
408
457
* Fetch objects for the endpoint.
409
458
*
@@ -421,12 +470,10 @@ private function getObjects(
421
470
int &$ status = 200
422
471
): Entity |array
423
472
{
424
- $ extend = $ requestParams ['extend ' ] ?? $ requestParams ['_extend ' ] ?? null ;
425
-
426
473
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 ),
430
477
);
431
478
432
479
@@ -442,7 +489,7 @@ private function getObjects(
442
489
$ id = pos ($ pathParams );
443
490
}
444
491
445
- $ main = $ this ->objectService ->getOpenRegisters ()->renderEntity ($ mapper ->findByUuid ($ pathParams ['id ' ])->jsonSerialize ());
492
+ $ main = $ this ->objectService ->getOpenRegisters ()->renderEntity ($ mapper ->findByUuid ($ pathParams ['id ' ])->getObject ());
446
493
$ ids = $ main [$ property ];
447
494
448
495
if (isset ($ main [$ property ]) === false ) {
@@ -481,12 +528,12 @@ private function getObjects(
481
528
return $ returnArray ;
482
529
}
483
530
531
+ $ parameters = $ this ->rewriteExternalReferences ($ parameters , $ mapper );
532
+
484
533
$ result = $ mapper ->findAllPaginated (requestParams: $ parameters );
485
534
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 ()));
490
537
}, $ result ['results ' ]);
491
538
492
539
$ returnArray = [
0 commit comments