From 5cea32dc579c5c94d16953e950433594a11dce34 Mon Sep 17 00:00:00 2001 From: Awilum Date: Fri, 26 Jun 2020 22:13:10 +0300 Subject: [PATCH] feat(media): Media API implementation #428 --- .../endpoints/delivery/media/files.php | 30 ++--- .../endpoints/delivery/media/folders.php | 1 - .../endpoints/management/media/files.php | 106 ++++++++++++++++++ .../endpoints/management/media/folders.php | 0 4 files changed, 123 insertions(+), 14 deletions(-) delete mode 100644 src/flextype/endpoints/delivery/media/folders.php create mode 100644 src/flextype/endpoints/management/media/files.php create mode 100644 src/flextype/endpoints/management/media/folders.php diff --git a/src/flextype/endpoints/delivery/media/files.php b/src/flextype/endpoints/delivery/media/files.php index ccdba7a2..d2dfb32a 100644 --- a/src/flextype/endpoints/delivery/media/files.php +++ b/src/flextype/endpoints/delivery/media/files.php @@ -21,20 +21,20 @@ $api_sys_messages['AccessTokenInvalid'] = ['sys' => ['type' => 'Error', 'id' => $api_sys_messages['NotFound'] = ['sys' => ['type' => 'Error', 'id' => 'NotFound'], 'message' => 'The resource could not be found.']; /** - * Validate delivery files token + * Validate delivery media files token */ -function validate_delivery_media_token($token) : bool +function validate_delivery_media_files_token($token) : bool { - return Filesystem::has(PATH['project'] . '/tokens/delivery/media/' . $token . '/token.yaml'); + return Filesystem::has(PATH['project'] . '/tokens/delivery/media/files/' . $token . '/token.yaml'); } /** - * Fetch media files collection + * Fetch media file(s) * - * endpoint: GET /api/delivery/media + * endpoint: GET /api/delivery/media/files * * Query: - * folder - [REQUIRED] - Unique identifier of the files folder. + * path - [REQUIRED] - Unique identifier of the file path. * token - [REQUIRED] - Valid Content Delivery API token for Entries. * * Returns: @@ -46,14 +46,14 @@ $app->get('/api/delivery/media/files', function (Request $request, Response $res $query = $request->getQueryParams(); // Set variables - $folder = $query['folder']; - $token = $query['token']; + $path = $query['path']; + $token = $query['token']; - if ($flextype['registry']->get('flextype.settings.api.delivery.files.enabled')) { + if ($flextype['registry']->get('flextype.settings.api.delivery.media.files.enabled')) { // Validate delivery token - if (validate_delivery_files_token($token)) { - $delivery_files_token_file_path = PATH['project'] . '/tokens/delivery/files/' . $token. '/token.yaml'; + if (validate_delivery_media_files_token($token)) { + $delivery_files_token_file_path = PATH['project'] . '/tokens/delivery/media/files/' . $token. '/token.yaml'; // Set delivery token file if ($delivery_files_token_file_data = $flextype['serializer']->decode(Filesystem::read($delivery_files_token_file_path), 'yaml')) { @@ -65,8 +65,12 @@ $app->get('/api/delivery/media/files', function (Request $request, Response $res // Create files array $files = []; - // Get list if files for specific folder - $files = $flextype['media_files']->fetchCollection($folder); + // Get list if file or files for specific folder + if (is_dir($path)) { + $files = $flextype['media_files']->fetchCollection($path); + } else { + $files = $flextype['media_files']->fetchSingle($path); + } // Write response data $response_data['data'] = $files; diff --git a/src/flextype/endpoints/delivery/media/folders.php b/src/flextype/endpoints/delivery/media/folders.php deleted file mode 100644 index b3d9bbc7..00000000 --- a/src/flextype/endpoints/delivery/media/folders.php +++ /dev/null @@ -1 +0,0 @@ - ['type' => 'Error', 'id' => 'AccessTokenInvalid'], 'message' => 'The access token you sent could not be found or is invalid.']; +$api_sys_messages['NotFound'] = ['sys' => ['type' => 'Error', 'id' => 'NotFound'], 'message' => 'The resource could not be found.']; + +/** + * Validate delivery media files token + */ +function validate_delivery_media_files_token($token) : bool +{ + return Filesystem::has(PATH['project'] . '/tokens/delivery/media/files/' . $token . '/token.yaml'); +} + +/** + * Fetch media file(s) + * + * endpoint: GET /api/delivery/media/files + * + * Query: + * path - [REQUIRED] - Unique identifier of the file path. + * token - [REQUIRED] - Valid Content Delivery API token for Entries. + * + * Returns: + * An array of entry item objects. + */ +$app->get('/api/delivery/media/files', function (Request $request, Response $response) use ($flextype, $api_sys_messages) { + + // Get Query Params + $query = $request->getQueryParams(); + + // Set variables + $path = $query['path']; + $token = $query['token']; + + if ($flextype['registry']->get('flextype.settings.api.delivery.media.files.enabled')) { + + // Validate delivery token + if (validate_delivery_media_files_token($token)) { + $delivery_files_token_file_path = PATH['project'] . '/tokens/delivery/media/files/' . $token. '/token.yaml'; + + // Set delivery token file + if ($delivery_files_token_file_data = $flextype['serializer']->decode(Filesystem::read($delivery_files_token_file_path), 'yaml')) { + if ($delivery_files_token_file_data['state'] === 'disabled' || + ($delivery_files_token_file_data['limit_calls'] !== 0 && $delivery_files_token_file_data['calls'] >= $delivery_files_token_file_data['limit_calls'])) { + return $response->withJson($api_sys_messages['AccessTokenInvalid'], 401); + } + + // Create files array + $files = []; + + // Get list if file or files for specific folder + if (is_dir($path)) { + $files = $flextype['media_files']->fetchCollection($path); + } else { + $files = $flextype['media_files']->fetchSingle($path); + } + + // Write response data + $response_data['data'] = $files; + + // Set response code + $response_code = count($response_data['data']) > 0 ? 200 : 404; + + // Update calls counter + Filesystem::write($delivery_files_token_file_path, $flextype['serializer']->encode(array_replace_recursive($delivery_files_token_file_data, ['calls' => $delivery_files_token_file_data['calls'] + 1]), 'yaml')); + + if ($response_code == 404) { + + // Return response + return $response + ->withJson($api_sys_messages['NotFound'], $response_code); + } + + // Return response + return $response + ->withJson($response_data, $response_code); + } + + return $response + ->withJson($api_sys_messages['AccessTokenInvalid'], 401); + } + + return $response + ->withJson($api_sys_messages['AccessTokenInvalid'], 401); + } + + return $response + ->withJson($api_sys_messages['AccessTokenInvalid'], 401); +}); diff --git a/src/flextype/endpoints/management/media/folders.php b/src/flextype/endpoints/management/media/folders.php new file mode 100644 index 00000000..e69de29b