image_preview.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. from flask import Response, request
  2. from flask_restful import Resource, reqparse # type: ignore
  3. from werkzeug.exceptions import NotFound
  4. import services
  5. from controllers.files import api
  6. from controllers.files.error import UnsupportedFileTypeError
  7. from services.account_service import TenantService
  8. from services.file_service import FileService
  9. class ImagePreviewApi(Resource):
  10. """
  11. Deprecated
  12. """
  13. def get(self, file_id):
  14. file_id = str(file_id)
  15. timestamp = request.args.get("timestamp")
  16. nonce = request.args.get("nonce")
  17. sign = request.args.get("sign")
  18. if not timestamp or not nonce or not sign:
  19. return {"content": "Invalid request."}, 400
  20. try:
  21. generator, mimetype = FileService.get_image_preview(
  22. file_id=file_id,
  23. timestamp=timestamp,
  24. nonce=nonce,
  25. sign=sign,
  26. )
  27. except services.errors.file.UnsupportedFileTypeError:
  28. raise UnsupportedFileTypeError()
  29. return Response(generator, mimetype=mimetype)
  30. class FilePreviewApi(Resource):
  31. def get(self, file_id):
  32. file_id = str(file_id)
  33. parser = reqparse.RequestParser()
  34. parser.add_argument("timestamp", type=str, required=True, location="args")
  35. parser.add_argument("nonce", type=str, required=True, location="args")
  36. parser.add_argument("sign", type=str, required=True, location="args")
  37. parser.add_argument("as_attachment", type=bool, required=False, default=False, location="args")
  38. args = parser.parse_args()
  39. if not args["timestamp"] or not args["nonce"] or not args["sign"]:
  40. return {"content": "Invalid request."}, 400
  41. try:
  42. generator, upload_file = FileService.get_file_generator_by_file_id(
  43. file_id=file_id,
  44. timestamp=args["timestamp"],
  45. nonce=args["nonce"],
  46. sign=args["sign"],
  47. )
  48. except services.errors.file.UnsupportedFileTypeError:
  49. raise UnsupportedFileTypeError()
  50. response = Response(
  51. generator,
  52. mimetype=upload_file.mime_type,
  53. direct_passthrough=True,
  54. headers={},
  55. )
  56. if upload_file.size > 0:
  57. response.headers["Content-Length"] = str(upload_file.size)
  58. if args["as_attachment"]:
  59. response.headers["Content-Disposition"] = f"attachment; filename={upload_file.name}"
  60. return response
  61. class WorkspaceWebappLogoApi(Resource):
  62. def get(self, workspace_id):
  63. workspace_id = str(workspace_id)
  64. custom_config = TenantService.get_custom_config(workspace_id)
  65. webapp_logo_file_id = custom_config.get("replace_webapp_logo") if custom_config is not None else None
  66. if not webapp_logo_file_id:
  67. raise NotFound("webapp logo is not found")
  68. try:
  69. generator, mimetype = FileService.get_public_image_preview(
  70. webapp_logo_file_id,
  71. )
  72. except services.errors.file.UnsupportedFileTypeError:
  73. raise UnsupportedFileTypeError()
  74. return Response(generator, mimetype=mimetype)
  75. api.add_resource(ImagePreviewApi, "/files/<uuid:file_id>/image-preview")
  76. api.add_resource(FilePreviewApi, "/files/<uuid:file_id>/file-preview")
  77. api.add_resource(WorkspaceWebappLogoApi, "/files/workspaces/<uuid:workspace_id>/webapp-logo")