Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

saved_message.py 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. from flask_restx import fields, marshal_with, reqparse
  2. from flask_restx.inputs import int_range
  3. from werkzeug.exceptions import NotFound
  4. from controllers.web import web_ns
  5. from controllers.web.error import NotCompletionAppError
  6. from controllers.web.wraps import WebApiResource
  7. from fields.conversation_fields import message_file_fields
  8. from libs.helper import TimestampField, uuid_value
  9. from services.errors.message import MessageNotExistsError
  10. from services.saved_message_service import SavedMessageService
  11. feedback_fields = {"rating": fields.String}
  12. message_fields = {
  13. "id": fields.String,
  14. "inputs": fields.Raw,
  15. "query": fields.String,
  16. "answer": fields.String,
  17. "message_files": fields.List(fields.Nested(message_file_fields)),
  18. "feedback": fields.Nested(feedback_fields, attribute="user_feedback", allow_null=True),
  19. "created_at": TimestampField,
  20. }
  21. @web_ns.route("/saved-messages")
  22. class SavedMessageListApi(WebApiResource):
  23. saved_message_infinite_scroll_pagination_fields = {
  24. "limit": fields.Integer,
  25. "has_more": fields.Boolean,
  26. "data": fields.List(fields.Nested(message_fields)),
  27. }
  28. post_response_fields = {
  29. "result": fields.String,
  30. }
  31. @web_ns.doc("Get Saved Messages")
  32. @web_ns.doc(description="Retrieve paginated list of saved messages for a completion application.")
  33. @web_ns.doc(
  34. params={
  35. "last_id": {"description": "Last message ID for pagination", "type": "string", "required": False},
  36. "limit": {
  37. "description": "Number of messages to return (1-100)",
  38. "type": "integer",
  39. "required": False,
  40. "default": 20,
  41. },
  42. }
  43. )
  44. @web_ns.doc(
  45. responses={
  46. 200: "Success",
  47. 400: "Bad Request - Not a completion app",
  48. 401: "Unauthorized",
  49. 403: "Forbidden",
  50. 404: "App Not Found",
  51. 500: "Internal Server Error",
  52. }
  53. )
  54. @marshal_with(saved_message_infinite_scroll_pagination_fields)
  55. def get(self, app_model, end_user):
  56. if app_model.mode != "completion":
  57. raise NotCompletionAppError()
  58. parser = reqparse.RequestParser()
  59. parser.add_argument("last_id", type=uuid_value, location="args")
  60. parser.add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args")
  61. args = parser.parse_args()
  62. return SavedMessageService.pagination_by_last_id(app_model, end_user, args["last_id"], args["limit"])
  63. @web_ns.doc("Save Message")
  64. @web_ns.doc(description="Save a specific message for later reference.")
  65. @web_ns.doc(
  66. params={
  67. "message_id": {"description": "Message UUID to save", "type": "string", "required": True},
  68. }
  69. )
  70. @web_ns.doc(
  71. responses={
  72. 200: "Message saved successfully",
  73. 400: "Bad Request - Not a completion app",
  74. 401: "Unauthorized",
  75. 403: "Forbidden",
  76. 404: "Message Not Found",
  77. 500: "Internal Server Error",
  78. }
  79. )
  80. @marshal_with(post_response_fields)
  81. def post(self, app_model, end_user):
  82. if app_model.mode != "completion":
  83. raise NotCompletionAppError()
  84. parser = reqparse.RequestParser()
  85. parser.add_argument("message_id", type=uuid_value, required=True, location="json")
  86. args = parser.parse_args()
  87. try:
  88. SavedMessageService.save(app_model, end_user, args["message_id"])
  89. except MessageNotExistsError:
  90. raise NotFound("Message Not Exists.")
  91. return {"result": "success"}
  92. @web_ns.route("/saved-messages/<uuid:message_id>")
  93. class SavedMessageApi(WebApiResource):
  94. delete_response_fields = {
  95. "result": fields.String,
  96. }
  97. @web_ns.doc("Delete Saved Message")
  98. @web_ns.doc(description="Remove a message from saved messages.")
  99. @web_ns.doc(params={"message_id": {"description": "Message UUID to delete", "type": "string", "required": True}})
  100. @web_ns.doc(
  101. responses={
  102. 204: "Message removed successfully",
  103. 400: "Bad Request - Not a completion app",
  104. 401: "Unauthorized",
  105. 403: "Forbidden",
  106. 404: "Message Not Found",
  107. 500: "Internal Server Error",
  108. }
  109. )
  110. @marshal_with(delete_response_fields)
  111. def delete(self, app_model, end_user, message_id):
  112. message_id = str(message_id)
  113. if app_model.mode != "completion":
  114. raise NotCompletionAppError()
  115. SavedMessageService.delete(app_model, end_user, message_id)
  116. return {"result": "success"}, 204