| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- from flask_restx import fields, marshal_with, reqparse
- from flask_restx.inputs import int_range
- from werkzeug.exceptions import NotFound
-
- from controllers.web import web_ns
- from controllers.web.error import NotCompletionAppError
- from controllers.web.wraps import WebApiResource
- from fields.conversation_fields import message_file_fields
- from libs.helper import TimestampField, uuid_value
- from services.errors.message import MessageNotExistsError
- from services.saved_message_service import SavedMessageService
-
- feedback_fields = {"rating": fields.String}
-
- message_fields = {
- "id": fields.String,
- "inputs": fields.Raw,
- "query": fields.String,
- "answer": fields.String,
- "message_files": fields.List(fields.Nested(message_file_fields)),
- "feedback": fields.Nested(feedback_fields, attribute="user_feedback", allow_null=True),
- "created_at": TimestampField,
- }
-
-
- @web_ns.route("/saved-messages")
- class SavedMessageListApi(WebApiResource):
- saved_message_infinite_scroll_pagination_fields = {
- "limit": fields.Integer,
- "has_more": fields.Boolean,
- "data": fields.List(fields.Nested(message_fields)),
- }
-
- post_response_fields = {
- "result": fields.String,
- }
-
- @web_ns.doc("Get Saved Messages")
- @web_ns.doc(description="Retrieve paginated list of saved messages for a completion application.")
- @web_ns.doc(
- params={
- "last_id": {"description": "Last message ID for pagination", "type": "string", "required": False},
- "limit": {
- "description": "Number of messages to return (1-100)",
- "type": "integer",
- "required": False,
- "default": 20,
- },
- }
- )
- @web_ns.doc(
- responses={
- 200: "Success",
- 400: "Bad Request - Not a completion app",
- 401: "Unauthorized",
- 403: "Forbidden",
- 404: "App Not Found",
- 500: "Internal Server Error",
- }
- )
- @marshal_with(saved_message_infinite_scroll_pagination_fields)
- def get(self, app_model, end_user):
- if app_model.mode != "completion":
- raise NotCompletionAppError()
-
- parser = reqparse.RequestParser()
- parser.add_argument("last_id", type=uuid_value, location="args")
- parser.add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args")
- args = parser.parse_args()
-
- return SavedMessageService.pagination_by_last_id(app_model, end_user, args["last_id"], args["limit"])
-
- @web_ns.doc("Save Message")
- @web_ns.doc(description="Save a specific message for later reference.")
- @web_ns.doc(
- params={
- "message_id": {"description": "Message UUID to save", "type": "string", "required": True},
- }
- )
- @web_ns.doc(
- responses={
- 200: "Message saved successfully",
- 400: "Bad Request - Not a completion app",
- 401: "Unauthorized",
- 403: "Forbidden",
- 404: "Message Not Found",
- 500: "Internal Server Error",
- }
- )
- @marshal_with(post_response_fields)
- def post(self, app_model, end_user):
- if app_model.mode != "completion":
- raise NotCompletionAppError()
-
- parser = reqparse.RequestParser()
- parser.add_argument("message_id", type=uuid_value, required=True, location="json")
- args = parser.parse_args()
-
- try:
- SavedMessageService.save(app_model, end_user, args["message_id"])
- except MessageNotExistsError:
- raise NotFound("Message Not Exists.")
-
- return {"result": "success"}
-
-
- @web_ns.route("/saved-messages/<uuid:message_id>")
- class SavedMessageApi(WebApiResource):
- delete_response_fields = {
- "result": fields.String,
- }
-
- @web_ns.doc("Delete Saved Message")
- @web_ns.doc(description="Remove a message from saved messages.")
- @web_ns.doc(params={"message_id": {"description": "Message UUID to delete", "type": "string", "required": True}})
- @web_ns.doc(
- responses={
- 204: "Message removed successfully",
- 400: "Bad Request - Not a completion app",
- 401: "Unauthorized",
- 403: "Forbidden",
- 404: "Message Not Found",
- 500: "Internal Server Error",
- }
- )
- @marshal_with(delete_response_fields)
- def delete(self, app_model, end_user, message_id):
- message_id = str(message_id)
-
- if app_model.mode != "completion":
- raise NotCompletionAppError()
-
- SavedMessageService.delete(app_model, end_user, message_id)
-
- return {"result": "success"}, 204
|