Underground-Digital/Workflow-Engine
0
1from flask_restful import marshal_with, reqparse2from flask_restful.inputs import int_range3from werkzeug.exceptions import NotFound4 5from controllers.web import api6from controllers.web.error import NotChatAppError7from controllers.web.wraps import WebApiResource8from core.app.entities.app_invoke_entities import InvokeFrom9from fields.conversation_fields import conversation_infinite_scroll_pagination_fields, simple_conversation_fields10from libs.helper import uuid_value11from models.model import AppMode12from services.conversation_service import ConversationService13from services.errors.conversation import ConversationNotExistsError, LastConversationNotExistsError14from services.web_conversation_service import WebConversationService15 16 17class ConversationListApi(WebApiResource):18 @marshal_with(conversation_infinite_scroll_pagination_fields)19 def get(self, app_model, end_user):20 app_mode = AppMode.value_of(app_model.mode)21 if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}:22 raise NotChatAppError()23 24 parser = reqparse.RequestParser()25 parser.add_argument("last_id", type=uuid_value, location="args")26 parser.add_argument("limit", type=int_range(1, 100), required=False, default=20, location="args")27 parser.add_argument("pinned", type=str, choices=["true", "false", None], location="args")28 parser.add_argument(29 "sort_by",30 type=str,31 choices=["created_at", "-created_at", "updated_at", "-updated_at"],32 required=False,33 default="-updated_at",34 location="args",35 )36 args = parser.parse_args()37 38 pinned = None39 if "pinned" in args and args["pinned"] is not None:40 pinned = True if args["pinned"] == "true" else False41 42 try:43 return WebConversationService.pagination_by_last_id(44 app_model=app_model,45 user=end_user,46 last_id=args["last_id"],47 limit=args["limit"],48 invoke_from=InvokeFrom.WEB_APP,49 pinned=pinned,50 sort_by=args["sort_by"],51 )52 except LastConversationNotExistsError:53 raise NotFound("Last Conversation Not Exists.")54 55 56class ConversationApi(WebApiResource):57 def delete(self, app_model, end_user, c_id):58 app_mode = AppMode.value_of(app_model.mode)59 if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}:60 raise NotChatAppError()61 62 conversation_id = str(c_id)63 try:64 ConversationService.delete(app_model, conversation_id, end_user)65 except ConversationNotExistsError:66 raise NotFound("Conversation Not Exists.")67 WebConversationService.unpin(app_model, conversation_id, end_user)68 69 return {"result": "success"}, 20470 71 72class ConversationRenameApi(WebApiResource):73 @marshal_with(simple_conversation_fields)74 def post(self, app_model, end_user, c_id):75 app_mode = AppMode.value_of(app_model.mode)76 if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}:77 raise NotChatAppError()78 79 conversation_id = str(c_id)80 81 parser = reqparse.RequestParser()82 parser.add_argument("name", type=str, required=False, location="json")83 parser.add_argument("auto_generate", type=bool, required=False, default=False, location="json")84 args = parser.parse_args()85 86 try:87 return ConversationService.rename(app_model, conversation_id, end_user, args["name"], args["auto_generate"])88 except ConversationNotExistsError:89 raise NotFound("Conversation Not Exists.")90 91 92class ConversationPinApi(WebApiResource):93 def patch(self, app_model, end_user, c_id):94 app_mode = AppMode.value_of(app_model.mode)95 if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}:96 raise NotChatAppError()97 98 conversation_id = str(c_id)99 100 try:101 WebConversationService.pin(app_model, conversation_id, end_user)102 except ConversationNotExistsError:103 raise NotFound("Conversation Not Exists.")104 105 return {"result": "success"}106 107 108class ConversationUnPinApi(WebApiResource):109 def patch(self, app_model, end_user, c_id):110 app_mode = AppMode.value_of(app_model.mode)111 if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}:112 raise NotChatAppError()113 114 conversation_id = str(c_id)115 WebConversationService.unpin(app_model, conversation_id, end_user)116 117 return {"result": "success"}118 119 120api.add_resource(ConversationRenameApi, "/conversations/<uuid:c_id>/name", endpoint="web_conversation_name")121api.add_resource(ConversationListApi, "/conversations")122api.add_resource(ConversationApi, "/conversations/<uuid:c_id>")123api.add_resource(ConversationPinApi, "/conversations/<uuid:c_id>/pin")124api.add_resource(ConversationUnPinApi, "/conversations/<uuid:c_id>/unpin")125 