From 26574429bc183a930561f3d63bd7d397ef8ee7ae Mon Sep 17 00:00:00 2001 From: Awilum Date: Mon, 29 Jun 2020 08:58:58 +0300 Subject: [PATCH] feat(media): improvements and updates for apis #428 --- src/flextype/endpoints/files.php | 173 ++++++++++++++++++++++++++++++- 1 file changed, 170 insertions(+), 3 deletions(-) diff --git a/src/flextype/endpoints/files.php b/src/flextype/endpoints/files.php index 1833be6c..b0d6571e 100644 --- a/src/flextype/endpoints/files.php +++ b/src/flextype/endpoints/files.php @@ -32,7 +32,7 @@ function validate_files_token($token) : bool * token - [REQUIRED] - Valid Files token. * * Returns: - * An array of entry item objects. + * An array of file item objects. */ $app->get('/api/files', function (Request $request, Response $response) use ($flextype, $api_sys_messages) { @@ -111,7 +111,7 @@ $app->get('/api/files', function (Request $request, Response $response) use ($fl * file - [REQUIRED] - Raw file data (multipart/form-data). * * Returns: - * Returns the entry item object for the entry item that was just created. + * Returns the file object for the file that was just created. */ $app->post('/api/files', function (Request $request, Response $response) use ($flextype, $api_sys_messages) { @@ -145,7 +145,7 @@ $app->post('/api/files', function (Request $request, Response $response) use ($f return $response->withJson($api_sys_messages['AccessTokenInvalid'], 401); } - // Create entry + // Create file $create_file = $flextype['media_files']->upload($file, $folder); if ($create_file) { @@ -187,3 +187,170 @@ $app->post('/api/files', function (Request $request, Response $response) use ($f return $response ->withJson($api_sys_messages['AccessTokenInvalid'], 401); }); + + +/** + * Rename media file + * + * endpoint: PUT /api/files + * + * Body: + * id - [REQUIRED] - Unique identifier of the file. + * new_id - [REQUIRED] - New Unique identifier of the file. + * token - [REQUIRED] - Valid Entries token. + * access_token - [REQUIRED] - Valid Access token. + * + * Returns: + * Returns the file object for the file that was just created. + */ +$app->put('/api/files', function (Request $request, Response $response) use ($flextype, $api_sys_messages) { + + // Get Post Data + $post_data = $request->getParsedBody(); + + // Set variables + $token = $post_data['token']; + $access_token = $post_data['access_token']; + $id = $post_data['id']; + $new_id = $post_data['new_id']; + + if ($flextype['registry']->get('flextype.settings.api.files.enabled')) { + + // Validate files and access token + if (validate_files_token($token) && validate_access_token($access_token)) { + $files_token_file_path = PATH['project'] . '/tokens/files/' . $token . '/token.yaml'; + $access_token_file_path = PATH['project'] . '/tokens/access/' . $access_token . '/token.yaml'; + + // Set files and access token file + if (($files_token_file_data = $flextype['serializer']->decode(Filesystem::read($files_token_file_path), 'yaml')) && + ($access_token_file_data = $flextype['serializer']->decode(Filesystem::read($access_token_file_path), 'yaml'))) { + + if ($files_token_file_data['state'] === 'disabled' || + ($files_token_file_data['limit_calls'] !== 0 && $files_token_file_data['calls'] >= $files_token_file_data['limit_calls'])) { + return $response->withJson($api_sys_messages['AccessTokenInvalid'], 401); + } + + if ($access_token_file_data['state'] === 'disabled' || + ($access_token_file_data['limit_calls'] !== 0 && $access_token_file_data['calls'] >= $access_token_file_data['limit_calls'])) { + return $response->withJson($api_sys_messages['AccessTokenInvalid'], 401); + } + + // Rename file + $rename_file = $flextype['media_files']->rename($id, $new_id); + + if ($rename_file) { + $response_data['data'] = $flextype['media_files']->fetch($folder . '/' . basename($rename_file)); + } else { + $response_data['data'] = []; + } + + // Set response code + $response_code = (Filesystem::has($rename_file)) ? 200 : 404; + + // Return response + return $response + ->withJson($response_data, $response_code); + + // Update calls counter + Filesystem::write($files_token_file_path, $flextype['serializer']->encode(array_replace_recursive($files_token_file_data, ['calls' => $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); +}); + +/** + * Delete file + * + * endpoint: DELETE /api/entries + * + * Body: + * id - [REQUIRED] - Unique identifier of the file. + * token - [REQUIRED] - Valid Entries token. + * access_token - [REQUIRED] - Valid Authentication token. + * + * Returns: + * Returns an empty body with HTTP status 204 + */ +$app->delete('/api/entries', function (Request $request, Response $response) use ($flextype) { + + // Get Post Data + $post_data = $request->getParsedBody(); + + // Set variables + $token = $post_data['token']; + $access_token = $post_data['access_token']; + $id = $post_data['id']; + + if ($flextype['registry']->get('flextype.settings.api.entries.enabled')) { + + // Validate entries and access token + if (validate_entries_token($token) && validate_access_token($access_token)) { + $files_token_file_path = PATH['project'] . '/tokens/entries/' . $token . '/token.yaml'; + $access_token_file_path = PATH['project'] . '/tokens/access/' . $access_token . '/token.yaml'; + + // Set entries and access token file + if (($files_token_file_data = $flextype['serializer']->decode(Filesystem::read($files_token_file_path), 'yaml')) && + ($access_token_file_data = $flextype['serializer']->decode(Filesystem::read($access_token_file_path), 'yaml'))) { + + if ($files_token_file_data['state'] === 'disabled' || + ($files_token_file_data['limit_calls'] !== 0 && $files_token_file_data['calls'] >= $files_token_file_data['limit_calls'])) { + return $response->withJson($api_sys_messages['AccessTokenInvalid'], 401); + } + + if ($access_token_file_data['state'] === 'disabled' || + ($access_token_file_data['limit_calls'] !== 0 && $access_token_file_data['calls'] >= $access_token_file_data['limit_calls'])) { + return $response->withJson($api_sys_messages['AccessTokenInvalid'], 401); + } + + // Delete file + $delete_file = $flextype['media_files']->delete($id); + + // Set response code + $response_code = ($delete_file) ? 204 : 404; + + // Update calls counter + Filesystem::write($files_token_file_path, $flextype['serializer']->encode(array_replace_recursive($files_token_file_data, ['calls' => $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($delete_file, $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); +});