123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- from urllib.parse import quote
- from flask import Response, request
- from flask_restful import Resource, reqparse # type: ignore
- from werkzeug.exceptions import NotFound
- import services
- from controllers.files import api
- from controllers.files.error import UnsupportedFileTypeError
- from services.account_service import TenantService
- from services.file_service import FileService
- class ImagePreviewApi(Resource):
- """
- Deprecated
- """
- def get(self, file_id):
- file_id = str(file_id)
- timestamp = request.args.get("timestamp")
- nonce = request.args.get("nonce")
- sign = request.args.get("sign")
- if not timestamp or not nonce or not sign:
- return {"content": "Invalid request."}, 400
- try:
- generator, mimetype = FileService.get_image_preview(
- file_id=file_id,
- timestamp=timestamp,
- nonce=nonce,
- sign=sign,
- )
- except services.errors.file.UnsupportedFileTypeError:
- raise UnsupportedFileTypeError()
- return Response(generator, mimetype=mimetype)
- class FilePreviewApi(Resource):
- def get(self, file_id):
- file_id = str(file_id)
- parser = reqparse.RequestParser()
- parser.add_argument("timestamp", type=str, required=True, location="args")
- parser.add_argument("nonce", type=str, required=True, location="args")
- parser.add_argument("sign", type=str, required=True, location="args")
- parser.add_argument("as_attachment", type=bool, required=False, default=False, location="args")
- args = parser.parse_args()
- if not args["timestamp"] or not args["nonce"] or not args["sign"]:
- return {"content": "Invalid request."}, 400
- try:
- generator, upload_file = FileService.get_file_generator_by_file_id(
- file_id=file_id,
- timestamp=args["timestamp"],
- nonce=args["nonce"],
- sign=args["sign"],
- )
- except services.errors.file.UnsupportedFileTypeError:
- raise UnsupportedFileTypeError()
- response = Response(
- generator,
- mimetype=upload_file.mime_type,
- direct_passthrough=True,
- headers={},
- )
- if upload_file.size > 0:
- response.headers["Content-Length"] = str(upload_file.size)
- if args["as_attachment"]:
- encoded_filename = quote(upload_file.name)
- response.headers["Content-Disposition"] = f"attachment; filename*=UTF-8''{encoded_filename}"
- response.headers["Content-Type"] = "application/octet-stream"
- return response
- class WorkspaceWebappLogoApi(Resource):
- def get(self, workspace_id):
- workspace_id = str(workspace_id)
- custom_config = TenantService.get_custom_config(workspace_id)
- webapp_logo_file_id = custom_config.get("replace_webapp_logo") if custom_config is not None else None
- if not webapp_logo_file_id:
- raise NotFound("webapp logo is not found")
- try:
- generator, mimetype = FileService.get_public_image_preview(
- webapp_logo_file_id,
- )
- except services.errors.file.UnsupportedFileTypeError:
- raise UnsupportedFileTypeError()
- return Response(generator, mimetype=mimetype)
- api.add_resource(ImagePreviewApi, "/files/<uuid:file_id>/image-preview")
- api.add_resource(FilePreviewApi, "/files/<uuid:file_id>/file-preview")
- api.add_resource(WorkspaceWebappLogoApi, "/files/workspaces/<uuid:workspace_id>/webapp-logo")
|