| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | # -*- coding:utf-8 -*- | 
					
						
							| 
									
										
										
										
											2023-07-14 10:37:33 +08:00
										 |  |  | from flask import request | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | from flask_restful import fields, marshal_with, reqparse | 
					
						
							|  |  |  | from flask_restful.inputs import int_range | 
					
						
							|  |  |  | from werkzeug.exceptions import NotFound | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from controllers.service_api import api | 
					
						
							|  |  |  | from controllers.service_api.app import create_or_update_end_user_for_user_id | 
					
						
							|  |  |  | from controllers.service_api.app.error import NotChatAppError | 
					
						
							|  |  |  | from controllers.service_api.wraps import AppApiResource | 
					
						
							|  |  |  | from libs.helper import TimestampField, uuid_value | 
					
						
							|  |  |  | import services | 
					
						
							|  |  |  | from services.conversation_service import ConversationService | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | conversation_fields = { | 
					
						
							|  |  |  |     'id': fields.String, | 
					
						
							|  |  |  |     'name': fields.String, | 
					
						
							|  |  |  |     'inputs': fields.Raw, | 
					
						
							|  |  |  |     'status': fields.String, | 
					
						
							|  |  |  |     'introduction': fields.String, | 
					
						
							|  |  |  |     'created_at': TimestampField | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | conversation_infinite_scroll_pagination_fields = { | 
					
						
							|  |  |  |     'limit': fields.Integer, | 
					
						
							|  |  |  |     'has_more': fields.Boolean, | 
					
						
							|  |  |  |     'data': fields.List(fields.Nested(conversation_fields)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ConversationApi(AppApiResource): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @marshal_with(conversation_infinite_scroll_pagination_fields) | 
					
						
							|  |  |  |     def get(self, app_model, end_user): | 
					
						
							|  |  |  |         if app_model.mode != 'chat': | 
					
						
							|  |  |  |             raise NotChatAppError() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         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') | 
					
						
							|  |  |  |         parser.add_argument('user', type=str, location='args') | 
					
						
							|  |  |  |         args = parser.parse_args() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if end_user is None and args['user'] is not None: | 
					
						
							|  |  |  |             end_user = create_or_update_end_user_for_user_id(app_model, args['user']) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             return ConversationService.pagination_by_last_id(app_model, end_user, args['last_id'], args['limit']) | 
					
						
							|  |  |  |         except services.errors.conversation.LastConversationNotExistsError: | 
					
						
							|  |  |  |             raise NotFound("Last Conversation Not Exists.") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-28 13:31:51 +08:00
										 |  |  | class ConversationDetailApi(AppApiResource): | 
					
						
							|  |  |  |     @marshal_with(conversation_fields) | 
					
						
							|  |  |  |     def delete(self, app_model, end_user, c_id): | 
					
						
							|  |  |  |         if app_model.mode != 'chat': | 
					
						
							|  |  |  |             raise NotChatAppError() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         conversation_id = str(c_id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-14 10:37:33 +08:00
										 |  |  |         user = request.get_json().get('user') | 
					
						
							| 
									
										
										
										
											2023-06-28 13:31:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-14 10:37:33 +08:00
										 |  |  |         if end_user is None and user is not None: | 
					
						
							|  |  |  |             end_user = create_or_update_end_user_for_user_id(app_model, user) | 
					
						
							| 
									
										
										
										
											2023-06-28 13:31:51 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             ConversationService.delete(app_model, conversation_id, end_user) | 
					
						
							| 
									
										
										
										
											2023-07-14 10:37:33 +08:00
										 |  |  |             return {"result": "success"} | 
					
						
							| 
									
										
										
										
											2023-06-28 13:31:51 +08:00
										 |  |  |         except services.errors.conversation.ConversationNotExistsError: | 
					
						
							|  |  |  |             raise NotFound("Conversation Not Exists.") | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class ConversationRenameApi(AppApiResource): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @marshal_with(conversation_fields) | 
					
						
							|  |  |  |     def post(self, app_model, end_user, c_id): | 
					
						
							|  |  |  |         if app_model.mode != 'chat': | 
					
						
							|  |  |  |             raise NotChatAppError() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         conversation_id = str(c_id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         parser = reqparse.RequestParser() | 
					
						
							|  |  |  |         parser.add_argument('name', type=str, required=True, location='json') | 
					
						
							|  |  |  |         parser.add_argument('user', type=str, location='json') | 
					
						
							|  |  |  |         args = parser.parse_args() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if end_user is None and args['user'] is not None: | 
					
						
							|  |  |  |             end_user = create_or_update_end_user_for_user_id(app_model, args['user']) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             return ConversationService.rename(app_model, conversation_id, end_user, args['name']) | 
					
						
							|  |  |  |         except services.errors.conversation.ConversationNotExistsError: | 
					
						
							|  |  |  |             raise NotFound("Conversation Not Exists.") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | api.add_resource(ConversationRenameApi, '/conversations/<uuid:c_id>/name', endpoint='conversation_name') | 
					
						
							|  |  |  | api.add_resource(ConversationApi, '/conversations') | 
					
						
							| 
									
										
										
										
											2023-06-28 13:31:51 +08:00
										 |  |  | api.add_resource(ConversationApi, '/conversations/<uuid:c_id>', endpoint='conversation') | 
					
						
							| 
									
										
										
										
											2023-07-14 10:37:33 +08:00
										 |  |  | api.add_resource(ConversationDetailApi, '/conversations/<uuid:c_id>', endpoint='conversation_detail') |