- from flask import request
- from flask_restx import Resource
- from flask_restx.api import HTTPStatus
-
- import services
- from controllers.common.errors import (
- FilenameNotExistsError,
- FileTooLargeError,
- NoFileUploadedError,
- TooManyFilesError,
- UnsupportedFileTypeError,
- )
- from controllers.service_api import service_api_ns
- from controllers.service_api.wraps import FetchUserArg, WhereisUserArg, validate_app_token
- from extensions.ext_database import db
- from fields.file_fields import build_file_model
- from models import App, EndUser
- from services.file_service import FileService
-
-
- @service_api_ns.route("/files/upload")
- class FileApi(Resource):
- @service_api_ns.doc("upload_file")
- @service_api_ns.doc(description="Upload a file for use in conversations")
- @service_api_ns.doc(
- responses={
- 201: "File uploaded successfully",
- 400: "Bad request - no file or invalid file",
- 401: "Unauthorized - invalid API token",
- 413: "File too large",
- 415: "Unsupported file type",
- }
- )
- @validate_app_token(fetch_user_arg=FetchUserArg(fetch_from=WhereisUserArg.FORM))
- @service_api_ns.marshal_with(build_file_model(service_api_ns), code=HTTPStatus.CREATED)
- def post(self, app_model: App, end_user: EndUser):
- """Upload a file for use in conversations.
-
- Accepts a single file upload via multipart/form-data.
- """
- # check file
- if "file" not in request.files:
- raise NoFileUploadedError()
-
- if len(request.files) > 1:
- raise TooManyFilesError()
-
- file = request.files["file"]
- if not file.mimetype:
- raise UnsupportedFileTypeError()
-
- if not file.filename:
- raise FilenameNotExistsError
-
- try:
- upload_file = FileService(db.engine).upload_file(
- filename=file.filename,
- content=file.read(),
- mimetype=file.mimetype,
- user=end_user,
- )
- except services.errors.file.FileTooLargeError as file_too_large_error:
- raise FileTooLargeError(file_too_large_error.description)
- except services.errors.file.UnsupportedFileTypeError:
- raise UnsupportedFileTypeError()
-
- return upload_file, 201
|