feat: chats list on the left of the client chat
This commit is contained in:
@@ -91,6 +91,18 @@ async def get_chat(
|
|||||||
return await ChatService(session).get_chat(request)
|
return await ChatService(session).get_chat(request)
|
||||||
|
|
||||||
|
|
||||||
|
@chat_router.get(
|
||||||
|
'/for-client/{client_id}',
|
||||||
|
operation_id='get_client_chats_list',
|
||||||
|
response_model=GetChatsListResponse,
|
||||||
|
)
|
||||||
|
async def get_client_chats_list(
|
||||||
|
session: Annotated[AsyncSession, Depends(get_session)],
|
||||||
|
client_id: int,
|
||||||
|
):
|
||||||
|
return await ChatService(session).get_client_chats_list(client_id)
|
||||||
|
|
||||||
|
|
||||||
@chat_router.post(
|
@chat_router.post(
|
||||||
'/create',
|
'/create',
|
||||||
operation_id='create_chat',
|
operation_id='create_chat',
|
||||||
|
|||||||
@@ -56,6 +56,11 @@ class ChatSchema(BaseSchema):
|
|||||||
card_id: Optional[int]
|
card_id: Optional[int]
|
||||||
tg_group: Optional[TgGroupSchema]
|
tg_group: Optional[TgGroupSchema]
|
||||||
|
|
||||||
|
|
||||||
|
class ChatsListItemSchema(ChatSchema):
|
||||||
|
name: str
|
||||||
|
|
||||||
|
|
||||||
# endregion
|
# endregion
|
||||||
|
|
||||||
# region Requests
|
# region Requests
|
||||||
@@ -91,6 +96,10 @@ class GetMessagesRequest(BaseSchema):
|
|||||||
|
|
||||||
# region Responses
|
# region Responses
|
||||||
|
|
||||||
|
class GetChatsListResponse(BaseSchema):
|
||||||
|
chats: list[ChatsListItemSchema]
|
||||||
|
|
||||||
|
|
||||||
class SendTextMessageResponse(OkMessageSchema):
|
class SendTextMessageResponse(OkMessageSchema):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import requests
|
import requests
|
||||||
from aiohttp import ClientConnectorError
|
from aiohttp import ClientConnectorError
|
||||||
from fastapi import HTTPException, UploadFile
|
from fastapi import HTTPException, UploadFile
|
||||||
from sqlalchemy import select
|
from sqlalchemy import select, or_
|
||||||
from sqlalchemy.orm import joinedload
|
from sqlalchemy.orm import joinedload
|
||||||
from starlette.responses import StreamingResponse
|
from starlette.responses import StreamingResponse
|
||||||
|
|
||||||
@@ -30,6 +30,40 @@ class ChatService(BaseService):
|
|||||||
chat = await self._get_chat(request.client_id, request.card_id)
|
chat = await self._get_chat(request.client_id, request.card_id)
|
||||||
return GetChatResponse(chat=chat)
|
return GetChatResponse(chat=chat)
|
||||||
|
|
||||||
|
async def get_client_chats_list(self, client_id: int) -> GetChatsListResponse:
|
||||||
|
stmt = (
|
||||||
|
select(Chat)
|
||||||
|
.join(TgGroup)
|
||||||
|
.where(
|
||||||
|
or_(
|
||||||
|
TgGroup.client_id == client_id,
|
||||||
|
Chat.client_id == client_id,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
chats = (await self.session.scalars(stmt)).all()
|
||||||
|
|
||||||
|
chats_list_items = []
|
||||||
|
for chat in chats:
|
||||||
|
if chat.client_id:
|
||||||
|
name = f'[{chat.client_id}] {chat.client.name}'
|
||||||
|
else:
|
||||||
|
name = f'[{chat.card_id}] {chat.card.name}'
|
||||||
|
item = ChatsListItemSchema(
|
||||||
|
id=chat.id,
|
||||||
|
name=name,
|
||||||
|
tg_group=TgGroupSchema(
|
||||||
|
tg_group_id=chat.tg_group.tg_group_id,
|
||||||
|
tg_invite_link=chat.tg_group.tg_invite_link,
|
||||||
|
),
|
||||||
|
client_id=chat.client_id,
|
||||||
|
card_id=chat.card_id,
|
||||||
|
)
|
||||||
|
chats_list_items.append(item)
|
||||||
|
|
||||||
|
return GetChatsListResponse(chats=chats_list_items)
|
||||||
|
|
||||||
async def _get_group(self, client_id: int) -> Optional[TgGroup]:
|
async def _get_group(self, client_id: int) -> Optional[TgGroup]:
|
||||||
stmt = (
|
stmt = (
|
||||||
select(TgGroup)
|
select(TgGroup)
|
||||||
@@ -193,7 +227,8 @@ class ChatService(BaseService):
|
|||||||
) -> RepeatSendingTextMessageResponse:
|
) -> RepeatSendingTextMessageResponse:
|
||||||
message: Optional[Message] = await self._get_message_by_id(request.message.id)
|
message: Optional[Message] = await self._get_message_by_id(request.message.id)
|
||||||
if not message:
|
if not message:
|
||||||
return RepeatSendingTextMessageResponse(ok=False, message=f'Сообщение с ID: {request.message.id} не найдено')
|
return RepeatSendingTextMessageResponse(ok=False,
|
||||||
|
message=f'Сообщение с ID: {request.message.id} не найдено')
|
||||||
|
|
||||||
ok, msg = await ProducerService.send_message_to_connector(
|
ok, msg = await ProducerService.send_message_to_connector(
|
||||||
request.message.text,
|
request.message.text,
|
||||||
@@ -217,7 +252,7 @@ class ChatService(BaseService):
|
|||||||
) -> LoadMessagesResponse:
|
) -> LoadMessagesResponse:
|
||||||
chat: Optional[Chat] = await self.session.get(Chat, chat_id)
|
chat: Optional[Chat] = await self.session.get(Chat, chat_id)
|
||||||
if not chat:
|
if not chat:
|
||||||
return SendTextMessageResponse(ok=False, message=f'Чат с ID: {chat_id} не найден')
|
return LoadMessagesResponse(ok=False, message=f'Чат с ID: {chat_id} не найден')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
chat_client = ChatClient(api_key=CHAT_CONNECTOR_API_KEY)
|
chat_client = ChatClient(api_key=CHAT_CONNECTOR_API_KEY)
|
||||||
|
|||||||
Reference in New Issue
Block a user