From 668451751411b0d43ecc0791c6524e7e9a0cd21e Mon Sep 17 00:00:00 2001 From: Jan Friedli Date: Fri, 21 Aug 2020 09:09:19 +0200 Subject: added endpoint to clean file and return it directly for automated clients --- matweb/oas/remove_metadata.yml | 41 +++++++++++++++++++++++++++++++++++++++++ matweb/rest_api.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 matweb/oas/remove_metadata.yml (limited to 'matweb') diff --git a/matweb/oas/remove_metadata.yml b/matweb/oas/remove_metadata.yml new file mode 100644 index 0000000..ad5a7da --- /dev/null +++ b/matweb/oas/remove_metadata.yml @@ -0,0 +1,41 @@ +--- +tags: + - "Metadata removal cleaning in one request (automated clients)" +summary: 'Upload a single file which will be cleaned from metadata and returned directly' +requestBody: + description: "The file that will be cleaned from metadata and the cleaned file is returned directly" + required: true + content: + multipart/form-data: + schema: + type: object + properties: + file: + type: string + format: binary +responses: + '200': + description: "The cleaned file" + content: + "*/*": + schema: + type: string + format: binary + 400: + description: "Invalid input" + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + 415: + description: "Unsupported file type" + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + 500: + description: "Unable to clean the file" + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' \ No newline at end of file diff --git a/matweb/rest_api.py b/matweb/rest_api.py index 2909cf6..50b7c37 100644 --- a/matweb/rest_api.py +++ b/matweb/rest_api.py @@ -84,6 +84,38 @@ class APIDownload(Resource): return send_from_directory(current_app.config['UPLOAD_FOLDER'], filepath, as_attachment=True) +class APIClean(Resource): + @swag_from('./oas/remove_metadata.yml') + def post(self): + if 'file' not in request.files: + abort(400, message='No file part') + + uploaded_file = request.files['file'] + if not uploaded_file.filename: + abort(400, message='No selected `file`') + try: + filename, filepath = utils.save_file(uploaded_file, current_app.config['UPLOAD_FOLDER']) + except ValueError: + abort(400, message='Invalid Filename') + + parser, mime = utils.get_file_parser(filepath) + + if parser is None: + abort(415, message='The type %s is not supported' % mime) + + if parser.remove_all() is not True: + abort(500, message='Unable to clean %s' % mime) + + _, _, _, output_filename = utils.cleanup(parser, filepath, current_app.config['UPLOAD_FOLDER']) + + @after_this_request + def remove_file(response): + os.remove(os.path.join(current_app.config['UPLOAD_FOLDER'], output_filename)) + return response + + return send_from_directory(current_app.config['UPLOAD_FOLDER'], output_filename, as_attachment=True) + + class APIBulkDownloadCreator(Resource): schema = { 'download_list': { @@ -168,6 +200,10 @@ api.add_resource( APIDownload, '/download///' ) +api.add_resource( + APIClean, + '/remove_metadata' +) api.add_resource( APIBulkDownloadCreator, '/download/bulk' -- cgit v1.3