1
0
mirror of https://github.com/flextype/flextype.git synced 2025-08-13 16:44:36 +02:00

feat(core): Content Management API (CMA) #421

This commit is contained in:
Awilum
2020-04-11 17:41:17 +03:00
parent 18650c9db7
commit 6103d54c94
2 changed files with 517 additions and 15 deletions

View File

@@ -99,18 +99,18 @@ $registry->set('flextype', $flextype_settings);
*/
$app = new App([
'settings' => [
'debug' => $registry->get('flextype.errors.display'),
'whoops.editor' => $registry->get('flextype.whoops.editor'),
'whoops.page_title' => $registry->get('flextype.whoops.page_title'),
'displayErrorDetails' => $registry->get('flextype.display_error_details'),
'addContentLengthHeader' => $registry->get('flextype.add_content_length_header'),
'routerCacheFile' => $registry->get('flextype.router_cache_file'),
'determineRouteBeforeAppMiddleware' => $registry->get('flextype.determine_route_before_app_middleware'),
'outputBuffering' => $registry->get('flextype.output_buffering'),
'responseChunkSize' => $registry->get('flextype.response_chunk_size'),
'httpVersion' => $registry->get('flextype.http_version'),
'debug' => $registry->get('flextype.settings.errors.display'),
'whoops.editor' => $registry->get('flextype.settings.whoops.editor'),
'whoops.page_title' => $registry->get('flextype.settings.whoops.page_title'),
'displayErrorDetails' => $registry->get('flextype.settings.display_error_details'),
'addContentLengthHeader' => $registry->get('flextype.settings.add_content_length_header'),
'routerCacheFile' => $registry->get('flextype.settings.router_cache_file'),
'determineRouteBeforeAppMiddleware' => $registry->get('flextype.settings.determine_route_before_app_middleware'),
'outputBuffering' => $registry->get('flextype.settings.output_buffering'),
'responseChunkSize' => $registry->get('flextype.settings.response_chunk_size'),
'httpVersion' => $registry->get('flextype.settings.http_version'),
'images' => [
'driver' => $registry->get('flextype.image.driver'),
'driver' => $registry->get('flextype.settings.image.driver'),
],
],
]);
@@ -131,18 +131,19 @@ include_once 'dependencies.php';
include_once 'endpoints/delivery/images.php';
include_once 'endpoints/delivery/entries.php';
include_once 'endpoints/delivery/registry.php';
include_once 'endpoints/management/entries.php';
/**
* Set internal encoding
*/
function_exists('mb_language') and mb_language('uni');
function_exists('mb_regex_encoding') and mb_regex_encoding($flextype['registry']->get('flextype.charset'));
function_exists('mb_internal_encoding') and mb_internal_encoding($flextype['registry']->get('flextype.charset'));
function_exists('mb_regex_encoding') and mb_regex_encoding($flextype['registry']->get('flextype.settings.charset'));
function_exists('mb_internal_encoding') and mb_internal_encoding($flextype['registry']->get('flextype.settings.charset'));
/**
* Display Errors
*/
if ($flextype['registry']->get('flextype.errors.display')) {
if ($flextype['registry']->get('flextype.settings.errors.display')) {
/**
* Add WhoopsMiddleware
@@ -155,7 +156,7 @@ if ($flextype['registry']->get('flextype.errors.display')) {
/**
* Set default timezone
*/
date_default_timezone_set($flextype['registry']->get('flextype.timezone'));
date_default_timezone_set($flextype['registry']->get('flextype.settings.timezone'));
/**
* Init plugins

View File

@@ -0,0 +1,501 @@
<?php
declare(strict_types=1);
/**
* Flextype (http://flextype.org)
* Founded by Sergey Romanenko and maintained by Flextype Community.
*/
namespace Flextype;
use Flextype\Component\Filesystem\Filesystem;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use function array_replace_recursive;
use function count;
/**
* Validate management entries token
*/
function validate_management_entries_token($token) : bool
{
return Filesystem::has(PATH['site'] . '/tokens/management/entries/' . $token . '/token.yaml');
}
/**
* Validate auth token
*/
function validate_auth_token($token) : bool
{
return Filesystem::has(PATH['site'] . '/tokens/auth/' . $token . '/token.yaml');
}
/**
* Fetch entry(entries)
*
* endpoint: GET /api/management/entries
*
* Query:
* id - [REQUIRED] - Unique identifier of the entry(entries).
* token - [REQUIRED] - Valid Content Management API token for Entries.
* filter - [OPTIONAL] - Select items in collection by given conditions.
*
* Returns:
* An array of entry item objects.
*/
$app->get('/api/management/entries', function (Request $request, Response $response) use ($flextype) {
// Get Query Params
$query = $request->getQueryParams();
// Set variables
$id = $query['id'];
$token = $query['token'];
$filter = $query['filter'] ?? null;
if ($flextype['registry']->get('flextype.settings.api.entries.enabled')) {
// Validate management token
if (validate_management_entries_token($token)) {
$management_entries_token_file_path = PATH['site'] . '/tokens/management/entries/' . $token. '/token.yaml';
// Set management token file
if ($management_entries_token_file_data = $flextype['parser']->decode(Filesystem::read($management_entries_token_file_path), 'yaml')) {
if ($management_entries_token_file_data['state'] === 'disabled' ||
($management_entries_token_file_data['limit_calls'] !== 0 && $management_entries_token_file_data['calls'] >= $management_entries_token_file_data['limit_calls'])) {
return $response->withJson(['detail' => 'Incorrect authentication credentials.'], 401);
}
// Fetch entry
$data['data'] = $flextype['entries']->fetch($id, $filter);
// Set response code
$response_code = count($data['data']) > 0 ? 200 : 404;
// Update calls counter
Filesystem::write($management_entries_token_file_path, $flextype['parser']->encode(array_replace_recursive($management_entries_token_file_data, ['calls' => $management_entries_token_file_data['calls'] + 1]), 'yaml'));
// Return response
return $response
->withJson($data, $response_code)
->withHeader('Access-Control-Allow-Origin', '*');
}
return $response
->withJson(['detail' => 'Incorrect authentication credentials.'], 401)
->withHeader('Access-Control-Allow-Origin', '*');
}
return $response
->withJson(['detail' => 'Incorrect authentication credentials.'], 401)
->withHeader('Access-Control-Allow-Origin', '*');
}
return $response
->withJson(['detail' => 'Incorrect authentication credentials.'], 401)
->withHeader('Access-Control-Allow-Origin', '*');
});
/**
* Create entry
*
* endpoint: POST /api/management/entries
*
* Body:
* id - [REQUIRED] - Unique identifier of the entry.
* token - [REQUIRED] - Valid Content Management API token for Entries.
* auth_token - [REQUIRED] - Valid Authentication token.
* data - [REQUIRED] - Data to store for the entry.
*
* Returns:
* Returns the entry item object for the entry item that was just created.
*/
$app->post('/api/management/entries', function (Request $request, Response $response) use ($flextype) {
// Get Post Data
$post_data = $request->getParsedBody();
// Set variables
$token = $post_data['token'];
$auth_token = $post_data['auth_token'];
$id = $post_data['id'];
$data = $post_data['data'];
if ($flextype['registry']->get('flextype.settings.api.entries.enabled')) {
// Validate management and auth token
if (validate_management_entries_token($token) && validate_auth_token($auth_token)) {
$management_entries_token_file_path = PATH['site'] . '/tokens/management/entries/' . $token . '/token.yaml';
$auth_token_file_path = PATH['site'] . '/tokens/auth/' . $auth_token . '/token.yaml';
// Set management and auth token file
if (($management_entries_token_file_data = $flextype['parser']->decode(Filesystem::read($management_entries_token_file_path), 'yaml')) &&
($auth_token_file_data = $flextype['parser']->decode(Filesystem::read($auth_token_file_path), 'yaml'))) {
if ($management_entries_token_file_data['state'] === 'disabled' ||
($management_entries_token_file_data['limit_calls'] !== 0 && $management_entries_token_file_data['calls'] >= $management_entries_token_file_data['limit_calls'])) {
return $response->withJson(['detail' => 'Incorrect authentication credentials.0'], 401);
}
if ($auth_token_file_data['state'] === 'disabled' ||
($auth_token_file_data['limit_calls'] !== 0 && $auth_token_file_data['calls'] >= $auth_token_file_data['limit_calls'])) {
return $response->withJson(['detail' => 'Incorrect authentication credentials.00'], 401);
}
// Create entry
$create_entry = $flextype['entries']->create($id, $data);
if ($create_entry) {
$data = $flextype['entries']->fetch($id);
} else {
$data = [];
}
// Set response code
$response_code = ($create_entry) ? 200 : 404;
// Update calls counter
Filesystem::write($management_entries_token_file_path, $flextype['parser']->encode(array_replace_recursive($management_entries_token_file_data, ['calls' => $management_entries_token_file_data['calls'] + 1]), 'yaml'));
// Return response
return $response
->withJson($data, $response_code)
->withHeader('Access-Control-Allow-Origin', '*');
}
return $response
->withJson(['detail' => 'Incorrect authentication credentials.1'], 401)
->withHeader('Access-Control-Allow-Origin', '*');
}
return $response
->withJson(['detail' => 'Incorrect authentication credentials.2'], 401)
->withHeader('Access-Control-Allow-Origin', '*');
}
return $response
->withJson(['detail' => 'Incorrect authentication credentials.3'], 401)
->withHeader('Access-Control-Allow-Origin', '*');
});
/**
* Update entry
*
* endpoint: PATCH /api/management/entries
*
* Body:
* id - [REQUIRED] - Unique identifier of the entry.
* token - [REQUIRED] - Valid Content Management API token for Entries.
* auth_token - [REQUIRED] - Valid Authentication token.
* data - [REQUIRED] - Data to update for the entry.
*
* Returns:
* Returns the entry item object for the entry item that was just created.
*/
$app->patch('/api/management/entries', function (Request $request, Response $response) use ($flextype) {
// Get Post Data
$post_data = $request->getParsedBody();
// Set variables
$token = $post_data['token'];
$auth_token = $post_data['auth_token'];
$id = $post_data['id'];
$data = $post_data['data'];
if ($flextype['registry']->get('flextype.settings.api.entries.enabled')) {
// Validate management and auth token
if (validate_management_entries_token($token) && validate_auth_token($auth_token)) {
$management_entries_token_file_path = PATH['site'] . '/tokens/management/entries/' . $token . '/token.yaml';
$auth_token_file_path = PATH['site'] . '/tokens/auth/' . $auth_token . '/token.yaml';
// Set management and auth token file
if (($management_entries_token_file_data = $flextype['parser']->decode(Filesystem::read($management_entries_token_file_path), 'yaml')) &&
($auth_token_file_data = $flextype['parser']->decode(Filesystem::read($auth_token_file_path), 'yaml'))) {
if ($management_entries_token_file_data['state'] === 'disabled' ||
($management_entries_token_file_data['limit_calls'] !== 0 && $management_entries_token_file_data['calls'] >= $management_entries_token_file_data['limit_calls'])) {
return $response->withJson(['detail' => 'Incorrect authentication credentials.0'], 401);
}
if ($auth_token_file_data['state'] === 'disabled' ||
($auth_token_file_data['limit_calls'] !== 0 && $auth_token_file_data['calls'] >= $auth_token_file_data['limit_calls'])) {
return $response->withJson(['detail' => 'Incorrect authentication credentials.00'], 401);
}
// Update entry
$update_entry = $flextype['entries']->update($id, $data);
if ($update_entry) {
$data = $flextype['entries']->fetch($id);
} else {
$data = [];
}
// Set response code
$response_code = ($update_entry) ? 200 : 404;
// Update calls counter
Filesystem::write($management_entries_token_file_path, $flextype['parser']->encode(array_replace_recursive($management_entries_token_file_data, ['calls' => $management_entries_token_file_data['calls'] + 1]), 'yaml'));
// Return response
return $response
->withJson($data, $response_code)
->withHeader('Access-Control-Allow-Origin', '*');
}
return $response
->withJson(['detail' => 'Incorrect authentication credentials.1'], 401)
->withHeader('Access-Control-Allow-Origin', '*');
}
return $response
->withJson(['detail' => 'Incorrect authentication credentials.2'], 401)
->withHeader('Access-Control-Allow-Origin', '*');
}
return $response
->withJson(['detail' => 'Incorrect authentication credentials.3'], 401)
->withHeader('Access-Control-Allow-Origin', '*');
});
/**
* Rename entry
*
* endpoint: PUT /api/management/entries
*
* Body:
* id - [REQUIRED] - Unique identifier of the entry.
* new_id - [REQUIRED] - New Unique identifier of the entry.
* token - [REQUIRED] - Valid Content Management API token for Entries.
* auth_token - [REQUIRED] - Valid Authentication token.
*
* Returns:
* Returns the entry item object for the entry item that was just renamed.
*/
$app->put('/api/management/entries', function (Request $request, Response $response) use ($flextype) {
// Get Post Data
$post_data = $request->getParsedBody();
// Set variables
$token = $post_data['token'];
$auth_token = $post_data['auth_token'];
$id = $post_data['id'];
$new_id = $post_data['new_id'];
if ($flextype['registry']->get('flextype.settings.api.entries.enabled')) {
// Validate management and auth token
if (validate_management_entries_token($token) && validate_auth_token($auth_token)) {
$management_entries_token_file_path = PATH['site'] . '/tokens/management/entries/' . $token . '/token.yaml';
$auth_token_file_path = PATH['site'] . '/tokens/auth/' . $auth_token . '/token.yaml';
// Set management and auth token file
if (($management_entries_token_file_data = $flextype['parser']->decode(Filesystem::read($management_entries_token_file_path), 'yaml')) &&
($auth_token_file_data = $flextype['parser']->decode(Filesystem::read($auth_token_file_path), 'yaml'))) {
if ($management_entries_token_file_data['state'] === 'disabled' ||
($management_entries_token_file_data['limit_calls'] !== 0 && $management_entries_token_file_data['calls'] >= $management_entries_token_file_data['limit_calls'])) {
return $response->withJson(['detail' => 'Incorrect authentication credentials.0'], 401);
}
if ($auth_token_file_data['state'] === 'disabled' ||
($auth_token_file_data['limit_calls'] !== 0 && $auth_token_file_data['calls'] >= $auth_token_file_data['limit_calls'])) {
return $response->withJson(['detail' => 'Incorrect authentication credentials.00'], 401);
}
// Rename entry
$rename_entry = $flextype['entries']->rename($id, $new_id);
// Get entry data
if ($rename_entry) {
$data = $flextype['entries']->fetch($new_id);
} else {
$data = [];
}
// Set response code
$response_code = ($data) ? 200 : 404;
// Update calls counter
Filesystem::write($management_entries_token_file_path, $flextype['parser']->encode(array_replace_recursive($management_entries_token_file_data, ['calls' => $management_entries_token_file_data['calls'] + 1]), 'yaml'));
// Return response
return $response
->withJson($data, $response_code)
->withHeader('Access-Control-Allow-Origin', '*');
}
return $response
->withJson(['detail' => 'Incorrect authentication credentials.1'], 401)
->withHeader('Access-Control-Allow-Origin', '*');
}
return $response
->withJson(['detail' => 'Incorrect authentication credentials.2'], 401)
->withHeader('Access-Control-Allow-Origin', '*');
}
return $response
->withJson(['detail' => 'Incorrect authentication credentials.3'], 401)
->withHeader('Access-Control-Allow-Origin', '*');
});
/**
* Copy entry(entries)
*
* endpoint: PUT /api/management/entries/copy
*
* Body:
* id - [REQUIRED] - Unique identifier of the entry.
* new_id - [REQUIRED] - New Unique identifier of the entry.
* token - [REQUIRED] - Valid Content Management API token for Entries.
* auth_token - [REQUIRED] - Valid Authentication token.
*
* Returns:
* Returns the entry item object for the entry item that was just copied.
*/
$app->put('/api/management/entries/copy', function (Request $request, Response $response) use ($flextype) {
// Get Post Data
$data = $request->getParsedBody();
// Set variables
$token = $post_data['token'];
$auth_token = $post_data['auth_token'];
$id = $post_data['id'];
$new_id = $post_data['new_id'];
if ($flextype['registry']->get('flextype.settings.api.entries.enabled')) {
// Validate management and auth token
if (validate_management_entries_token($token) && validate_auth_token($auth_token)) {
$management_entries_token_file_path = PATH['site'] . '/tokens/management/entries/' . $token . '/token.yaml';
$auth_token_file_path = PATH['site'] . '/tokens/auth/' . $auth_token . '/token.yaml';
// Set management and auth token file
if (($management_entries_token_file_data = $flextype['parser']->decode(Filesystem::read($management_entries_token_file_path), 'yaml')) &&
($auth_token_file_data = $flextype['parser']->decode(Filesystem::read($auth_token_file_path), 'yaml'))) {
if ($management_entries_token_file_data['state'] === 'disabled' ||
($management_entries_token_file_data['limit_calls'] !== 0 && $management_entries_token_file_data['calls'] >= $management_entries_token_file_data['limit_calls'])) {
return $response->withJson(['detail' => 'Incorrect authentication credentials.0'], 401);
}
if ($auth_token_file_data['state'] === 'disabled' ||
($auth_token_file_data['limit_calls'] !== 0 && $auth_token_file_data['calls'] >= $auth_token_file_data['limit_calls'])) {
return $response->withJson(['detail' => 'Incorrect authentication credentials.00'], 401);
}
// Rename entry
$rename_entry = $flextype['entries']->copy($id, $new_id);
// Get entry data
if ($rename_entry) {
$data = $flextype['entries']->fetch($new_id);
} else {
$data = [];
}
// Set response code
$response_code = ($data) ? 200 : 404;
// Update calls counter
Filesystem::write($management_entries_token_file_path, $flextype['parser']->encode(array_replace_recursive($management_entries_token_file_data, ['calls' => $management_entries_token_file_data['calls'] + 1]), 'yaml'));
// Return response
return $response
->withJson($data, $response_code)
->withHeader('Access-Control-Allow-Origin', '*');
}
return $response
->withJson(['detail' => 'Incorrect authentication credentials.1'], 401)
->withHeader('Access-Control-Allow-Origin', '*');
}
return $response
->withJson(['detail' => 'Incorrect authentication credentials.2'], 401)
->withHeader('Access-Control-Allow-Origin', '*');
}
return $response
->withJson(['detail' => 'Incorrect authentication credentials.3'], 401)
->withHeader('Access-Control-Allow-Origin', '*');
});
/**
* Delete entry
*
* endpoint: DELETE /api/management/entries
*
* Body:
* id - [REQUIRED] - Unique identifier of the entry.
* token - [REQUIRED] - Valid Content Management API token for Entries.
* auth_token - [REQUIRED] - Valid Authentication token.
*
* Returns:
* Returns an empty body with HTTP status 204
*/
$app->delete('/api/management/entries', function (Request $request, Response $response) use ($flextype) {
// Get Post Data
$post_data = $request->getParsedBody();
// Set variables
$token = $post_data['token'];
$auth_token = $post_data['auth_token'];
$id = $post_data['id'];
if ($flextype['registry']->get('flextype.settings.api.entries.enabled')) {
// Validate management and auth token
if (validate_management_entries_token($token) && validate_auth_token($auth_token)) {
$management_entries_token_file_path = PATH['site'] . '/tokens/management/entries/' . $token . '/token.yaml';
$auth_token_file_path = PATH['site'] . '/tokens/auth/' . $auth_token . '/token.yaml';
// Set management and auth token file
if (($management_entries_token_file_data = $flextype['parser']->decode(Filesystem::read($management_entries_token_file_path), 'yaml')) &&
($auth_token_file_data = $flextype['parser']->decode(Filesystem::read($auth_token_file_path), 'yaml'))) {
if ($management_entries_token_file_data['state'] === 'disabled' ||
($management_entries_token_file_data['limit_calls'] !== 0 && $management_entries_token_file_data['calls'] >= $management_entries_token_file_data['limit_calls'])) {
return $response->withJson(['detail' => 'Incorrect authentication credentials.0'], 401);
}
if ($auth_token_file_data['state'] === 'disabled' ||
($auth_token_file_data['limit_calls'] !== 0 && $auth_token_file_data['calls'] >= $auth_token_file_data['limit_calls'])) {
return $response->withJson(['detail' => 'Incorrect authentication credentials.00'], 401);
}
// Delete entry
$data = $flextype['entries']->delete($id);
// Set response code
$response_code = ($data) ? 204 : 404;
// Update calls counter
Filesystem::write($management_entries_token_file_path, $flextype['parser']->encode(array_replace_recursive($management_entries_token_file_data, ['calls' => $management_entries_token_file_data['calls'] + 1]), 'yaml'));
// Return response
return $response
->withJson($data, $response_code)
->withHeader('Access-Control-Allow-Origin', '*');
}
return $response
->withJson(['detail' => 'Incorrect authentication credentials.1'], 401)
->withHeader('Access-Control-Allow-Origin', '*');
}
return $response
->withJson(['detail' => 'Incorrect authentication credentials.2'], 401)
->withHeader('Access-Control-Allow-Origin', '*');
}
return $response
->withJson(['detail' => 'Incorrect authentication credentials.3'], 401)
->withHeader('Access-Control-Allow-Origin', '*');
});