Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. from urllib.parse import quote
  2. from flask import Response, request
  3. from flask_restful import Resource, reqparse
  4. from werkzeug.exceptions import NotFound
  5. import services
  6. from controllers.files import api
  7. from controllers.files.error import UnsupportedFileTypeError
  8. from services.account_service import TenantService
  9. from services.file_service import FileService
  10. class ImagePreviewApi(Resource):
  11. """
  12. Deprecated
  13. """
  14. def get(self, file_id):
  15. file_id = str(file_id)
  16. timestamp = request.args.get("timestamp")
  17. nonce = request.args.get("nonce")
  18. sign = request.args.get("sign")
  19. if not timestamp or not nonce or not sign:
  20. return {"content": "Invalid request."}, 400
  21. try:
  22. generator, mimetype = FileService.get_image_preview(
  23. file_id=file_id,
  24. timestamp=timestamp,
  25. nonce=nonce,
  26. sign=sign,
  27. )
  28. except services.errors.file.UnsupportedFileTypeError:
  29. raise UnsupportedFileTypeError()
  30. return Response(generator, mimetype=mimetype)
  31. class FilePreviewApi(Resource):
  32. def get(self, file_id):
  33. file_id = str(file_id)
  34. parser = reqparse.RequestParser()
  35. parser.add_argument("timestamp", type=str, required=True, location="args")
  36. parser.add_argument("nonce", type=str, required=True, location="args")
  37. parser.add_argument("sign", type=str, required=True, location="args")
  38. parser.add_argument("as_attachment", type=bool, required=False, default=False, location="args")
  39. args = parser.parse_args()
  40. if not args["timestamp"] or not args["nonce"] or not args["sign"]:
  41. return {"content": "Invalid request."}, 400
  42. try:
  43. generator, upload_file = FileService.get_file_generator_by_file_id(
  44. file_id=file_id,
  45. timestamp=args["timestamp"],
  46. nonce=args["nonce"],
  47. sign=args["sign"],
  48. )
  49. except services.errors.file.UnsupportedFileTypeError:
  50. raise UnsupportedFileTypeError()
  51. response = Response(
  52. generator,
  53. mimetype=upload_file.mime_type,
  54. direct_passthrough=True,
  55. headers={},
  56. )
  57. # add Accept-Ranges header for audio/video files
  58. if upload_file.mime_type in [
  59. "audio/mpeg",
  60. "audio/wav",
  61. "audio/mp4",
  62. "audio/ogg",
  63. "audio/flac",
  64. "audio/aac",
  65. "video/mp4",
  66. "video/webm",
  67. "video/quicktime",
  68. "audio/x-m4a",
  69. ]:
  70. response.headers["Accept-Ranges"] = "bytes"
  71. if upload_file.size > 0:
  72. response.headers["Content-Length"] = str(upload_file.size)
  73. if args["as_attachment"]:
  74. encoded_filename = quote(upload_file.name)
  75. response.headers["Content-Disposition"] = f"attachment; filename*=UTF-8''{encoded_filename}"
  76. response.headers["Content-Type"] = "application/octet-stream"
  77. return response
  78. class WorkspaceWebappLogoApi(Resource):
  79. def get(self, workspace_id):
  80. workspace_id = str(workspace_id)
  81. custom_config = TenantService.get_custom_config(workspace_id)
  82. webapp_logo_file_id = custom_config.get("replace_webapp_logo") if custom_config is not None else None
  83. if not webapp_logo_file_id:
  84. raise NotFound("webapp logo is not found")
  85. try:
  86. generator, mimetype = FileService.get_public_image_preview(
  87. webapp_logo_file_id,
  88. )
  89. except services.errors.file.UnsupportedFileTypeError:
  90. raise UnsupportedFileTypeError()
  91. return Response(generator, mimetype=mimetype)
  92. api.add_resource(ImagePreviewApi, "/files/<uuid:file_id>/image-preview")
  93. api.add_resource(FilePreviewApi, "/files/<uuid:file_id>/file-preview")
  94. api.add_resource(WorkspaceWebappLogoApi, "/files/workspaces/<uuid:workspace_id>/webapp-logo")