From 9010db211edd76b56f8a160e5e11138623862eb7 Mon Sep 17 00:00:00 2001 From: marcsello Date: Wed, 25 Mar 2020 21:13:45 +0100 Subject: [PATCH] Implemented the REST of the endpoints --- storage_service/views/object_view.py | 43 ++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/storage_service/views/object_view.py b/storage_service/views/object_view.py index 1a8b45f..6d54a3c 100644 --- a/storage_service/views/object_view.py +++ b/storage_service/views/object_view.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 -from flask import jsonify, request, abort, current_app +from flask import jsonify, request, abort, current_app, Response from flask_classful import FlaskView -from minio.error import BucketAlreadyExists, BucketAlreadyOwnedByYou, ResponseError +from minio.error import BucketAlreadyExists, BucketAlreadyOwnedByYou, ResponseError, NoSuchKey from marshmallow import ValidationError from utils import storage from schemas import DescriptionSchema @@ -10,6 +10,15 @@ from schemas import DescriptionSchema class ObjectView(FlaskView): description_schema = DescriptionSchema(many=False) + @staticmethod + def _check_existance(tag: str) -> bool: # ez aztán igen + try: + storage.connection.stat_object(current_app.config['MINIO_BUCKET_NAME'], tag) + except NoSuchKey: + return False + + return True + def post(self): # get important data from the request try: @@ -17,6 +26,11 @@ class ObjectView(FlaskView): except ValidationError as e: abort(400, str(e)) + # check for conflict + if self._check_existance(description['tag']): + abort(409) + + # get and validate file file = request.files['soundFile'] if file.content_type != 'audio/wave': @@ -37,8 +51,31 @@ class ObjectView(FlaskView): # poot file into bucket try: - storage.connection.put_object(current_app.config['MINIO_BUCKET_NAME'], description['tag'], file, file.content_length, content_type=file.content_type) + storage.connection.put_object(current_app.config['MINIO_BUCKET_NAME'], description['tag'], file, + file.content_length, content_type=file.content_type) except ResponseError: # TODO: Check if object already exists... somehow raise return jsonify({"status": "200"}), 200 # TODO: 200 should be OK but that would be inconsistent with the errors + + def get(self, tag: str): + + # TODO: Validate tag + + try: + data = storage.connection.get_object(current_app.config['MINIO_BUCKET_NAME'], tag) + except NoSuchKey: + abort(404) + + return Response(data.stream(), mimetype=data.headers['Content-type']) + + def delete(self, tag: str): + + # TODO: Validate tag + + if not self._check_existance(tag): + abort(404) + + storage.connection.remove_object(current_app.config['MINIO_BUCKET_NAME'], tag) + + return jsonify({"status": "200"}), 200