From 0b734c21c68fae45fea9fd253e65b585d5766319 Mon Sep 17 00:00:00 2001 From: Sander Hagenaars Date: Mon, 15 Jul 2019 00:03:51 +0200 Subject: [PATCH] NEW Aliases can now be defined for DataObject endpoints (#80) * set endpoint_aliases on RestfulServer to specify fixed aliases for exposed dataobjects * removed wrong use statements from older project * better docblock * use correct obj ClassName in RestfulServer::updateDataObject * added findClassNameEndpoint method, replaced getEndpointAlias() * getDataFormatter() - find correct endpoint instead of request param ClassName * Better docblock Co-Authored-By: Guy Marriott * Better docblock Co-Authored-By: Guy Marriott * Return type hint in findClassNameEndpoint method Co-Authored-By: Guy Marriott * renamed endpoint method to resolveEndpoint * unsanitiseClassName in resolveEndpoint method * renamed resolveEndpoint to resolveClassName. Take $request as param instead of string * better docbloc * Remove unneccesary unsanitiseClassName call Co-Authored-By: Guy Marriott * changed docblocks to satisfy codesniffer * Drop PHP 5.6 and 7.0 from travis Co-authored-by: Guy Marriott --- .travis.yml | 8 ++++---- src/RestfulServer.php | 33 ++++++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1b8f8b9..f47ec42 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,11 +8,11 @@ env: matrix: include: - - php: 5.6 - env: DB=MYSQL RECIPE_VERSION=4.3.x-dev PHPCS_TEST=1 PHPUNIT_TEST=1 - - php: 7.0 - env: DB=MYSQL RECIPE_VERSION=4.4.x-dev PHPUNIT_TEST=1 - php: 7.1 + env: DB=MYSQL RECIPE_VERSION=4.3.x-dev PHPCS_TEST=1 PHPUNIT_TEST=1 + - php: 7.1 + env: DB=MYSQL RECIPE_VERSION=4.4.x-dev PHPUNIT_TEST=1 + - php: 7.2 env: DB=PGSQL RECIPE_VERSION=4.3.x-dev PHPUNIT_COVERAGE_TEST=1 - php: 7.2 env: DB=MYSQL RECIPE_VERSION=4.4.x-dev PHPUNIT_TEST=1 diff --git a/src/RestfulServer.php b/src/RestfulServer.php index eb142f7..716d5f6 100644 --- a/src/RestfulServer.php +++ b/src/RestfulServer.php @@ -72,6 +72,18 @@ class RestfulServer extends Controller */ private static $default_extension = "xml"; + /** + * Custom endpoints that map to a specific class. + * This is done to make the API have fixed endpoints, + * instead of using fully namespaced classnames, as the module does by default + * The fully namespaced classnames can also still be used though + * Example: + * ['mydataobject' => MyDataObject::class] + * + * @config array + */ + private static $endpoint_aliases = []; + /** * Whether or not to send an additional "Location" header for POST requests * to satisfy HTTP 1.1: https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html @@ -173,7 +185,7 @@ class RestfulServer extends Controller */ public function index(HTTPRequest $request) { - $className = $this->unsanitiseClassName($request->param('ClassName')); + $className = $this->resolveClassName($request); $id = $request->param('ID') ?: null; $relation = $request->param('Relation') ?: null; @@ -384,7 +396,7 @@ class RestfulServer extends Controller $accept = $this->request->getHeader('Accept'); $mimetypes = $this->request->getAcceptMimetypes(); if (!$className) { - $className = $this->unsanitiseClassName($this->request->param('ClassName')); + $className = $this->resolveClassName($this->request); } // get formatter @@ -654,7 +666,7 @@ class RestfulServer extends Controller $rawdata = $this->request->postVars(); } - $className = $this->unsanitiseClassName($this->request->param('ClassName')); + $className = $obj->ClassName; // update any aliased field names $data = []; foreach ($rawdata as $key => $value) { @@ -885,4 +897,19 @@ class RestfulServer extends Controller { return Security::getCurrentUser(); } + + /** + * Checks if given param ClassName maps to an object in endpoint_aliases, + * else simply return the unsanitised version of ClassName + * + * @param HTTPRequest $request + * @return string + */ + protected function resolveClassName(HTTPRequest $request): string + { + $className = $request->param('ClassName'); + $aliases = self::config()->get('endpoint_aliases'); + + return $aliases[$className] ?? $this->unsanitiseClassName($className); + } }