Skip to content

Commit 0e0a39b

Browse files
committed
feat: historical conversation
1 parent dca48d1 commit 0e0a39b

File tree

7 files changed

+120
-5
lines changed

7 files changed

+120
-5
lines changed

apps/chat/api/chat_api.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
from drf_spectacular.utils import OpenApiParameter
1111

1212
from chat.serializers.chat import ChatMessageSerializers
13+
from chat.serializers.chat_record import HistoryChatRecordModel
1314
from common.mixins.api_mixin import APIMixin
15+
from common.result import ResultSerializer, ResultPageSerializer
1416

1517

1618
class ChatAPI(APIMixin):
@@ -27,3 +29,33 @@ def get_parameters():
2729
@staticmethod
2830
def get_request():
2931
return ChatMessageSerializers
32+
33+
34+
class ApplicationCreateResponse(ResultSerializer):
35+
def get_data(self):
36+
return HistoryChatRecordModel(many=True)
37+
38+
39+
class PageApplicationCreateResponse(ResultPageSerializer):
40+
def get_data(self):
41+
return HistoryChatRecordModel(many=True)
42+
43+
44+
class HistoricalConversationAPI(APIMixin):
45+
@staticmethod
46+
def get_parameters():
47+
return []
48+
49+
@staticmethod
50+
def get_response():
51+
return ApplicationCreateResponse
52+
53+
54+
class PageHistoricalConversationAPI(APIMixin):
55+
@staticmethod
56+
def get_parameters():
57+
return []
58+
59+
@staticmethod
60+
def get_response():
61+
return PageApplicationCreateResponse

apps/chat/serializers/chat_authentication.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def auth(self, request, with_valid=True):
3333
try:
3434
# 校验token
3535
if token is not None:
36-
token_details = signing.loads(token)
36+
token_details = signing.loads(token[7:])
3737
except Exception as e:
3838
pass
3939
if with_valid:

apps/chat/serializers/chat_record.py

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
from django.utils.translation import gettext_lazy as _, gettext
1414
from rest_framework import serializers
1515

16-
from application.models import VoteChoices, ChatRecord
16+
from application.models import VoteChoices, ChatRecord, Chat
17+
from common.db.search import page_search
1718
from common.exception.app_exception import AppApiException
1819
from common.utils.lock import try_lock, un_lock
1920

@@ -23,6 +24,16 @@ class VoteRequest(serializers.Serializer):
2324
label=_("Bidding Status"))
2425

2526

27+
class HistoryChatRecordModel(serializers.ModelSerializer):
28+
class Meta:
29+
model = Chat
30+
fields = ['id',
31+
'application_id',
32+
'abstract',
33+
'create_time',
34+
'update_time']
35+
36+
2637
class VoteSerializer(serializers.Serializer):
2738
chat_id = serializers.UUIDField(required=True, label=_("Conversation ID"))
2839

@@ -63,3 +74,22 @@ def vote(self, instance: Dict, with_valid=True):
6374
finally:
6475
un_lock(self.data.get('chat_record_id'))
6576
return True
77+
78+
79+
class ChatRecordSerializer(serializers.Serializer):
80+
application_id = serializers.UUIDField(required=True, label=_('Application ID'))
81+
chat_user_id = serializers.UUIDField(required=True, label=_('Chat User ID'))
82+
83+
def get_queryset(self):
84+
chat_user_id = self.data.get('chat_user_id')
85+
application_id = self.data.get("application_id")
86+
return QuerySet(Chat).filter(application_id=application_id, chat_user_id=chat_user_id, is_deleted=False)
87+
88+
def list(self):
89+
self.is_valid(raise_exception=True)
90+
queryset = self.get_queryset()
91+
return [HistoryChatRecordModel(r).data for r in queryset]
92+
93+
def page(self, current_page, page_size):
94+
self.is_valid(raise_exception=True)
95+
return page_search(current_page, page_size, self.get_queryset(), lambda r: HistoryChatRecordModel(r).data)

apps/chat/urls.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,8 @@
1313
path('open', views.OpenView.as_view()),
1414
path('captcha', views.CaptchaView.as_view(), name='captcha'),
1515
path('vote/chat/<str:chat_id>/chat_record/<str:chat_record_id>', views.VoteView.as_view(), name='vote'),
16+
path('historical_conversation', views.HistoricalConversationView.as_view(), name='historical_conversation'),
17+
path('historical_conversation/<int:current_page>/<int:page_size>',
18+
views.HistoricalConversationView.PageView.as_view(),
19+
name='historical_conversation')
1620
]

apps/chat/views/chat_record.py

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@
66
@date:2025/6/23 10:42
77
@desc:
88
"""
9+
from django.utils.translation import gettext_lazy as _
910
from drf_spectacular.utils import extend_schema
1011
from rest_framework.request import Request
1112
from rest_framework.views import APIView
12-
from django.utils.translation import gettext_lazy as _
1313

14+
from chat.api.chat_api import HistoricalConversationAPI, PageHistoricalConversationAPI
1415
from chat.api.vote_api import VoteAPI
15-
from chat.serializers.chat_record import VoteSerializer
16+
from chat.serializers.chat_record import VoteSerializer, ChatRecordSerializer
1617
from common import result
1718
from common.auth import TokenAuth
1819

@@ -35,3 +36,42 @@ def put(self, request: Request, chat_id: str, chat_record_id: str):
3536
data={'chat_id': chat_id,
3637
'chat_record_id': chat_record_id
3738
}).vote(request.data))
39+
40+
41+
class HistoricalConversationView(APIView):
42+
authentication_classes = [TokenAuth]
43+
44+
@extend_schema(
45+
methods=['GET'],
46+
description=_("Get historical conversation"),
47+
summary=_("Get historical conversation"),
48+
operation_id=_("Get historical conversation"), # type: ignore
49+
parameters=HistoricalConversationAPI.get_parameters(),
50+
responses=HistoricalConversationAPI.get_response(),
51+
tags=[_('Chat')] # type: ignore
52+
)
53+
def get(self, request: Request):
54+
return result.success(ChatRecordSerializer(
55+
data={
56+
'application_id': request.auth.application_id,
57+
'chat_user_id': request.auth.chat_user_id,
58+
}).list())
59+
60+
class PageView(APIView):
61+
authentication_classes = [TokenAuth]
62+
63+
@extend_schema(
64+
methods=['GET'],
65+
description=_("Get historical conversation by page"),
66+
summary=_("Get historical conversation by page"),
67+
operation_id=_("Get historical conversation by page"), # type: ignore
68+
parameters=PageHistoricalConversationAPI.get_parameters(),
69+
responses=PageHistoricalConversationAPI.get_response(),
70+
tags=[_('Chat')] # type: ignore
71+
)
72+
def get(self, request: Request, current_page: int, page_size: int):
73+
return result.success(ChatRecordSerializer(
74+
data={
75+
'application_id': request.auth.application_id,
76+
'chat_user_id': request.auth.chat_user_id,
77+
}).page(current_page, page_size))

ui/src/api/chat/chat.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,13 @@ const vote: (
182182
loading,
183183
)
184184
}
185+
const pageChat: (
186+
current_page: number,
187+
page_size: number,
188+
loading?: Ref<boolean>,
189+
) => Promise<Result<boolean>> = (current_page, page_size, loading) => {
190+
return get(`/historical_conversation/${current_page}/${page_size}`, undefined, loading)
191+
}
185192
export default {
186193
open,
187194
chat,
@@ -200,4 +207,5 @@ export default {
200207
getAuthSetting,
201208
passwordAuthentication,
202209
vote,
210+
pageChat,
203211
}

ui/src/views/chat/pc/index.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@
153153
import { ref, onMounted, nextTick, computed } from 'vue'
154154
import { marked } from 'marked'
155155
import { saveAs } from 'file-saver'
156+
import chatAPI from '@/api/chat/chat'
156157
import { isAppIcon } from '@/utils/common'
157158
import useStore from '@/stores'
158159
import useResize from '@/layout/hooks/useResize'
@@ -278,7 +279,7 @@ function getChatLog(id: string, refresh?: boolean) {
278279
page_size: 20,
279280
}
280281
281-
chatLog.asyncGetChatLogClient(id, page, left_loading).then((res: any) => {
282+
chatAPI.pageChat(page.current_page, page.page_size, left_loading).then((res: any) => {
282283
chatLogData.value = res.data.records
283284
if (refresh) {
284285
currentChatName.value = chatLogData.value?.[0]?.abstract

0 commit comments

Comments
 (0)