image_preview.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from flask import Response, request
  2. from flask_restful import Resource
  3. from werkzeug.exceptions import NotFound
  4. import services
  5. from controllers.files import api
  6. from libs.exception import BaseHTTPException
  7. from services.account_service import TenantService
  8. from services.file_service import FileService
  9. class ImagePreviewApi(Resource):
  10. def get(self, file_id):
  11. file_id = str(file_id)
  12. timestamp = request.args.get("timestamp")
  13. nonce = request.args.get("nonce")
  14. sign = request.args.get("sign")
  15. if not timestamp or not nonce or not sign:
  16. return {"content": "Invalid request."}, 400
  17. try:
  18. generator, mimetype = FileService.get_image_preview(file_id, timestamp, nonce, sign)
  19. except services.errors.file.UnsupportedFileTypeError:
  20. raise UnsupportedFileTypeError()
  21. return Response(generator, mimetype=mimetype)
  22. class WorkspaceWebappLogoApi(Resource):
  23. def get(self, workspace_id):
  24. workspace_id = str(workspace_id)
  25. custom_config = TenantService.get_custom_config(workspace_id)
  26. webapp_logo_file_id = custom_config.get("replace_webapp_logo") if custom_config is not None else None
  27. if not webapp_logo_file_id:
  28. raise NotFound("webapp logo is not found")
  29. try:
  30. generator, mimetype = FileService.get_public_image_preview(
  31. webapp_logo_file_id,
  32. )
  33. except services.errors.file.UnsupportedFileTypeError:
  34. raise UnsupportedFileTypeError()
  35. return Response(generator, mimetype=mimetype)
  36. api.add_resource(ImagePreviewApi, "/files/<uuid:file_id>/image-preview")
  37. api.add_resource(WorkspaceWebappLogoApi, "/files/workspaces/<uuid:workspace_id>/webapp-logo")
  38. class UnsupportedFileTypeError(BaseHTTPException):
  39. error_code = "unsupported_file_type"
  40. description = "File type not allowed."
  41. code = 415