Skip to content

Commit 275ec80

Browse files
authored
feat: chat record (#3374)
1 parent d51ef49 commit 275ec80

File tree

9 files changed

+210
-51
lines changed

9 files changed

+210
-51
lines changed

apps/chat/api/chat_api.py

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@
99
from drf_spectacular.types import OpenApiTypes
1010
from drf_spectacular.utils import OpenApiParameter
1111

12+
from application.serializers.application_chat_record import ChatRecordSerializerModel
1213
from chat.serializers.chat import ChatMessageSerializers
13-
from chat.serializers.chat_record import HistoryChatRecordModel
14+
from chat.serializers.chat_record import HistoryChatModel
1415
from common.mixins.api_mixin import APIMixin
1516
from common.result import ResultSerializer, ResultPageSerializer
1617

@@ -33,12 +34,22 @@ def get_request():
3334

3435
class ApplicationCreateResponse(ResultSerializer):
3536
def get_data(self):
36-
return HistoryChatRecordModel(many=True)
37+
return HistoryChatModel(many=True)
3738

3839

3940
class PageApplicationCreateResponse(ResultPageSerializer):
4041
def get_data(self):
41-
return HistoryChatRecordModel(many=True)
42+
return HistoryChatModel(many=True)
43+
44+
45+
class ApplicationRecordResponse(ResultSerializer):
46+
def get_data(self):
47+
return ChatRecordSerializerModel(many=True)
48+
49+
50+
class PageApplicationRecordResponse(ResultPageSerializer):
51+
def get_data(self):
52+
return ChatRecordSerializerModel(many=True)
4253

4354

4455
class HistoricalConversationAPI(APIMixin):
@@ -59,3 +70,35 @@ def get_parameters():
5970
@staticmethod
6071
def get_response():
6172
return PageApplicationCreateResponse
73+
74+
75+
class HistoricalConversationRecordAPI(APIMixin):
76+
@staticmethod
77+
def get_parameters():
78+
return [OpenApiParameter(
79+
name="chat_id",
80+
description="对话id",
81+
type=OpenApiTypes.STR,
82+
location='path',
83+
required=True,
84+
)]
85+
86+
@staticmethod
87+
def get_response():
88+
return ApplicationRecordResponse
89+
90+
91+
class PageHistoricalConversationRecordAPI(APIMixin):
92+
@staticmethod
93+
def get_parameters():
94+
return [OpenApiParameter(
95+
name="chat_id",
96+
description="对话id",
97+
type=OpenApiTypes.STR,
98+
location='path',
99+
required=True,
100+
)]
101+
102+
@staticmethod
103+
def get_response():
104+
return PageApplicationRecordResponse

apps/chat/serializers/chat_record.py

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from rest_framework import serializers
1515

1616
from application.models import VoteChoices, ChatRecord, Chat
17+
from application.serializers.application_chat_record import ChatRecordSerializerModel
1718
from common.db.search import page_search
1819
from common.exception.app_exception import AppApiException
1920
from common.utils.lock import try_lock, un_lock
@@ -24,7 +25,7 @@ class VoteRequest(serializers.Serializer):
2425
label=_("Bidding Status"))
2526

2627

27-
class HistoryChatRecordModel(serializers.ModelSerializer):
28+
class HistoryChatModel(serializers.ModelSerializer):
2829
class Meta:
2930
model = Chat
3031
fields = ['id',
@@ -76,7 +77,7 @@ def vote(self, instance: Dict, with_valid=True):
7677
return True
7778

7879

79-
class ChatRecordSerializer(serializers.Serializer):
80+
class HistoricalConversationSerializer(serializers.Serializer):
8081
application_id = serializers.UUIDField(required=True, label=_('Application ID'))
8182
chat_user_id = serializers.UUIDField(required=True, label=_('Chat User ID'))
8283

@@ -88,8 +89,37 @@ def get_queryset(self):
8889
def list(self):
8990
self.is_valid(raise_exception=True)
9091
queryset = self.get_queryset()
91-
return [HistoryChatRecordModel(r).data for r in queryset]
92+
return [HistoryChatModel(r).data for r in queryset]
9293

9394
def page(self, current_page, page_size):
9495
self.is_valid(raise_exception=True)
95-
return page_search(current_page, page_size, self.get_queryset(), lambda r: HistoryChatRecordModel(r).data)
96+
return page_search(current_page, page_size, self.get_queryset(), lambda r: HistoryChatModel(r).data)
97+
98+
99+
class HistoricalConversationRecordSerializer(serializers.Serializer):
100+
application_id = serializers.UUIDField(required=True, label=_('Application ID'))
101+
chat_id = serializers.UUIDField(required=True, label=_('Chat ID'))
102+
chat_user_id = serializers.UUIDField(required=True, label=_('Chat User ID'))
103+
104+
def is_valid(self, *, raise_exception=False):
105+
super().is_valid(raise_exception=True)
106+
chat_user_id = self.data.get('chat_user_id')
107+
application_id = self.data.get("application_id")
108+
chat_id = self.data.get('chat_id')
109+
chat_exist = QuerySet(Chat).filter(application_id=application_id, chat_user_id=chat_user_id,
110+
id=chat_id).exists()
111+
if not chat_exist:
112+
raise AppApiException(500, _('Non-existent chatID'))
113+
114+
def get_queryset(self):
115+
chat_id = self.data.get('chat_id')
116+
return QuerySet(ChatRecord).filter(chat_id=chat_id).order_by('-create_time')
117+
118+
def list(self):
119+
self.is_valid(raise_exception=True)
120+
queryset = self.get_queryset()
121+
return [ChatRecordSerializerModel(r).data for r in queryset]
122+
123+
def page(self, current_page, page_size):
124+
self.is_valid(raise_exception=True)
125+
return page_search(current_page, page_size, self.get_queryset(), lambda r: ChatRecordSerializerModel(r).data)

apps/chat/urls.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,10 @@
1616
path('historical_conversation', views.HistoricalConversationView.as_view(), name='historical_conversation'),
1717
path('historical_conversation/<int:current_page>/<int:page_size>',
1818
views.HistoricalConversationView.PageView.as_view(),
19-
name='historical_conversation')
19+
name='historical_conversation'),
20+
path('historical_conversation_record/<str:chat_id>', views.HistoricalConversationRecordView.as_view(),
21+
name='historical_conversation_record'),
22+
path('historical_conversation_record/<str:chat_id>/<int:current_page>/<int:page_size>',
23+
views.HistoricalConversationRecordView.PageView.as_view(),
24+
name='historical_conversation_record')
2025
]

apps/chat/views/chat_record.py

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@
1111
from rest_framework.request import Request
1212
from rest_framework.views import APIView
1313

14-
from chat.api.chat_api import HistoricalConversationAPI, PageHistoricalConversationAPI
14+
from chat.api.chat_api import HistoricalConversationAPI, PageHistoricalConversationAPI, \
15+
PageHistoricalConversationRecordAPI, HistoricalConversationRecordAPI
1516
from chat.api.vote_api import VoteAPI
16-
from chat.serializers.chat_record import VoteSerializer, ChatRecordSerializer
17+
from chat.serializers.chat_record import VoteSerializer, HistoricalConversationSerializer, \
18+
HistoricalConversationRecordSerializer
1719
from common import result
1820
from common.auth import TokenAuth
1921

@@ -51,7 +53,7 @@ class HistoricalConversationView(APIView):
5153
tags=[_('Chat')] # type: ignore
5254
)
5355
def get(self, request: Request):
54-
return result.success(ChatRecordSerializer(
56+
return result.success(HistoricalConversationSerializer(
5557
data={
5658
'application_id': request.auth.application_id,
5759
'chat_user_id': request.auth.chat_user_id,
@@ -70,8 +72,49 @@ class PageView(APIView):
7072
tags=[_('Chat')] # type: ignore
7173
)
7274
def get(self, request: Request, current_page: int, page_size: int):
73-
return result.success(ChatRecordSerializer(
75+
return result.success(HistoricalConversationSerializer(
7476
data={
7577
'application_id': request.auth.application_id,
7678
'chat_user_id': request.auth.chat_user_id,
7779
}).page(current_page, page_size))
80+
81+
82+
class HistoricalConversationRecordView(APIView):
83+
authentication_classes = [TokenAuth]
84+
85+
@extend_schema(
86+
methods=['GET'],
87+
description=_("Get historical conversation records"),
88+
summary=_("Get historical conversation records"),
89+
operation_id=_("Get historical conversation records"), # type: ignore
90+
parameters=HistoricalConversationRecordAPI.get_parameters(),
91+
responses=HistoricalConversationRecordAPI.get_response(),
92+
tags=[_('Chat')] # type: ignore
93+
)
94+
def get(self, request: Request, chat_id: str):
95+
return result.success(HistoricalConversationRecordSerializer(
96+
data={
97+
'chat_id': chat_id,
98+
'application_id': request.auth.application_id,
99+
'chat_user_id': request.auth.chat_user_id,
100+
}).list())
101+
102+
class PageView(APIView):
103+
authentication_classes = [TokenAuth]
104+
105+
@extend_schema(
106+
methods=['GET'],
107+
description=_("Get historical conversation records by page "),
108+
summary=_("Get historical conversation records by page"),
109+
operation_id=_("Get historical conversation records by page"), # type: ignore
110+
parameters=PageHistoricalConversationRecordAPI.get_parameters(),
111+
responses=PageHistoricalConversationRecordAPI.get_response(),
112+
tags=[_('Chat')] # type: ignore
113+
)
114+
def get(self, request: Request, chat_id: str, current_page: int, page_size: int):
115+
return result.success(HistoricalConversationRecordSerializer(
116+
data={
117+
'chat_id': chat_id,
118+
'application_id': request.auth.application_id,
119+
'chat_user_id': request.auth.chat_user_id,
120+
}).page(current_page, page_size))

apps/common/auth/handle/impl/user_token.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ def get_permission_list(user,
216216

217217

218218
def reset_workspace_role(role, workspace_id):
219-
if role == RoleConstants.ADMIN.value.__str__():
219+
if role == RoleConstants.ADMIN.value.__str__() or workspace_id is None:
220220
return role
221221
return f"{role}:/WORKSPACE/{workspace_id}"
222222

ui/src/api/chat/chat.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,18 @@ const pageChat: (
189189
) => Promise<Result<boolean>> = (current_page, page_size, loading) => {
190190
return get(`/historical_conversation/${current_page}/${page_size}`, undefined, loading)
191191
}
192+
const pageChatRecord: (
193+
chat_id: string,
194+
current_page: number,
195+
page_size: number,
196+
loading?: Ref<boolean>,
197+
) => Promise<Result<boolean>> = (chat_id, current_page, page_size, loading) => {
198+
return get(
199+
`/historical_conversation_record/${chat_id}/${current_page}/${page_size}`,
200+
undefined,
201+
loading,
202+
)
203+
}
192204
export default {
193205
open,
194206
chat,
@@ -208,4 +220,5 @@ export default {
208220
passwordAuthentication,
209221
vote,
210222
pageChat,
223+
pageChatRecord,
211224
}

0 commit comments

Comments
 (0)