from flask import Response, request from flask_restful import Resource, reqparse 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"]: response.headers["Content-Disposition"] = f"attachment; filename={upload_file.name}" 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//image-preview") api.add_resource(FilePreviewApi, "/files//file-preview") api.add_resource(WorkspaceWebappLogoApi, "/files/workspaces//webapp-logo")