storage-service/storage_service/views/object_view.py

45 lines
1.6 KiB
Python

#!/usr/bin/env python3
from flask import jsonify, request, abort, current_app
from flask_classful import FlaskView
from minio.error import BucketAlreadyExists, BucketAlreadyOwnedByYou, ResponseError
from marshmallow import ValidationError
from utils import storage
from schemas import DescriptionSchema
class ObjectView(FlaskView):
description_schema = DescriptionSchema(many=False)
def post(self):
# get important data from the request
try:
description = self.description_schema.loads(request.form.get('description'))
except ValidationError as e:
abort(400, str(e))
file = request.files['soundFile']
if file.content_type != 'audio/wave':
abort(400, f"{file.content_type} is not audio/wave")
if file.content_length <= 0:
abort(411, f"Content length for soundFile is not a positive integer or missing.")
# create bucket if necessary
try:
storage.connection.make_bucket(current_app.config['MINIO_BUCKET_NAME'])
except BucketAlreadyOwnedByYou as err:
pass
except BucketAlreadyExists as err:
pass
# Everything else should be raised
# 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)
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