From 9ccce2ed36fde8b4d220c0c31894a271d05a1ffa Mon Sep 17 00:00:00 2001 From: Awilum Date: Sat, 10 Sep 2022 12:36:14 +0300 Subject: [PATCH] feat(query-api): Implement Flextype Query API #587 --- src/flextype/core/Endpoints/Query.php | 89 +++++++++++++++++++++++++ src/flextype/routes/endpoints/query.php | 34 ++++++++++ src/flextype/routes/routes.php | 1 + src/flextype/settings.yaml | 6 ++ 4 files changed, 130 insertions(+) create mode 100644 src/flextype/core/Endpoints/Query.php create mode 100644 src/flextype/routes/endpoints/query.php diff --git a/src/flextype/core/Endpoints/Query.php b/src/flextype/core/Endpoints/Query.php new file mode 100644 index 00000000..8d4d33af --- /dev/null +++ b/src/flextype/core/Endpoints/Query.php @@ -0,0 +1,89 @@ +getParsedBody(); + + // Validate Api Request + if ( + count($result = $this->validateApiRequest([ + 'request' => $request, + 'api' => 'query', + 'params' => ['query', 'access_token', 'token'], + ])) > 0 + ) { + return $this->getApiResponse($response, $this->getStatusCodeMessage($result['http_status_code']), $result['http_status_code']); + } + + $data = []; + + // Evaluate the queries + foreach ($requestParsedBody['query'] as $key => $value) { + $evaluatedValue = parsers()->expressions()->eval($value); + + if ($evaluatedValue instanceof \Glowy\Arrays\Arrays) { + $evaluatedValue = $evaluatedValue->toArray(); + } + + if ($evaluatedValue instanceof \Glowy\Strings\Strings) { + $evaluatedValue = $evaluatedValue->toString(); + } + + $data[$key] = $evaluatedValue; + } + + $result = []; + + // Clean up data + foreach ($data as $key => $value) { + + // Replace private fields + if (strings($key)->startsWith('_')) { + continue; + } + + $result[$key] = $value; + } + + // Return response + if (count($result) > 0) { + return $this->getApiResponse($response, $result, 200); + } + + return $this->getApiResponse($response, [], 404); + } +} diff --git a/src/flextype/routes/endpoints/query.php b/src/flextype/routes/endpoints/query.php new file mode 100644 index 00000000..27cebe8b --- /dev/null +++ b/src/flextype/routes/endpoints/query.php @@ -0,0 +1,34 @@ +post('/api/v1/query', [Query::class, 'evaluate'])->setName('query.evaluate'); \ No newline at end of file diff --git a/src/flextype/routes/routes.php b/src/flextype/routes/routes.php index a1743e3f..1ec5747d 100644 --- a/src/flextype/routes/routes.php +++ b/src/flextype/routes/routes.php @@ -23,6 +23,7 @@ require_once __DIR__ . '/endpoints/tokens.php'; require_once __DIR__ . '/endpoints/cache.php'; require_once __DIR__ . '/endpoints/entries.php'; require_once __DIR__ . '/endpoints/registry.php'; +require_once __DIR__ . '/endpoints/query.php'; // Add project routes if (filesystem()->file(FLEXTYPE_PATH_PROJECT . '/routes/routes.php')->exists()) { diff --git a/src/flextype/settings.yaml b/src/flextype/settings.yaml index c49ffc5c..defef310 100644 --- a/src/flextype/settings.yaml +++ b/src/flextype/settings.yaml @@ -858,4 +858,10 @@ api: cache: # Set to true to enable Cache API + enabled: true + + # Query API + query: + + # Set to true to enable Query API enabled: true \ No newline at end of file