feat: logging on sending file error, refactoring
This commit is contained in:
		
							
								
								
									
										7
									
								
								external/chat/schemas.py
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								external/chat/schemas.py
									
									
									
									
										vendored
									
									
								
							@@ -6,18 +6,13 @@ from schemas.base import BaseSchema, OkMessageSchema
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# region Entities
 | 
					# region Entities
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ExternalSendFileSchema(BaseSchema):
 | 
					 | 
				
			||||||
    buffer: bytes
 | 
					 | 
				
			||||||
    file_name: str
 | 
					 | 
				
			||||||
    file_size: int
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class ExternalMessageFileSchema(BaseSchema):
 | 
					class ExternalMessageFileSchema(BaseSchema):
 | 
				
			||||||
    file_path: str
 | 
					    file_path: str
 | 
				
			||||||
    type: str
 | 
					    type: str
 | 
				
			||||||
    file_name: str
 | 
					    file_name: str
 | 
				
			||||||
    file_size: int
 | 
					    file_size: int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# endregion
 | 
					# endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# region Requests
 | 
					# region Requests
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								external/kafka/consumer.py
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								external/kafka/consumer.py
									
									
									
									
										vendored
									
									
								
							@@ -20,11 +20,9 @@ async def consume_messages():
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    async with session_maker() as session:
 | 
					    async with session_maker() as session:
 | 
				
			||||||
        consumer_service = ConsumerService(session)
 | 
					        consumer_service = ConsumerService(session)
 | 
				
			||||||
        print("started consuming messages")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            async for message in consumer:
 | 
					            async for message in consumer:
 | 
				
			||||||
                print("consume")
 | 
					 | 
				
			||||||
                await consumer_service.consume_message(message)
 | 
					                await consumer_service.consume_message(message)
 | 
				
			||||||
        finally:
 | 
					        finally:
 | 
				
			||||||
            await consumer.stop()
 | 
					            await consumer.stop()
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										7
									
								
								external/kafka/schemas/consumer.py
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								external/kafka/schemas/consumer.py
									
									
									
									
										vendored
									
									
								
							@@ -41,19 +41,18 @@ class MessageFromTelegramRequest(BaseSchema):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class BaseConnectorResponse(OkMessageSchema):
 | 
					class BaseConnectorResponse(OkMessageSchema):
 | 
				
			||||||
    message_type: int
 | 
					    message_type: int
 | 
				
			||||||
 | 
					    message_id: int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class SendMessageToConnectorResponse(BaseConnectorResponse):
 | 
					class SendMessageToConnectorResponse(BaseConnectorResponse):
 | 
				
			||||||
    message_id: int
 | 
					    tg_message_id: Optional[int] = None
 | 
				
			||||||
    tg_message_id: int
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class DeleteMessageResponse(BaseConnectorResponse):
 | 
					class DeleteMessageResponse(BaseConnectorResponse):
 | 
				
			||||||
    message_id: int
 | 
					    pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class EditMessageResponse(BaseConnectorResponse):
 | 
					class EditMessageResponse(BaseConnectorResponse):
 | 
				
			||||||
    message_id: int
 | 
					 | 
				
			||||||
    text: str
 | 
					    text: str
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# endregion
 | 
					# endregion
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								external/kafka/services/consumer_service.py
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								external/kafka/services/consumer_service.py
									
									
									
									
										vendored
									
									
								
							@@ -14,7 +14,6 @@ from services.base import BaseService
 | 
				
			|||||||
class ConsumerService(BaseService):
 | 
					class ConsumerService(BaseService):
 | 
				
			||||||
    async def consume_message(self, message: ConsumerRecord):
 | 
					    async def consume_message(self, message: ConsumerRecord):
 | 
				
			||||||
        value = pickle.loads(message.value)
 | 
					        value = pickle.loads(message.value)
 | 
				
			||||||
        print("Consumer: received message: ", value)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            if 'ok' in value:
 | 
					            if 'ok' in value:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								external/kafka/services/producer_service.py
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								external/kafka/services/producer_service.py
									
									
									
									
										vendored
									
									
								
							@@ -16,7 +16,7 @@ class ProducerService(BaseService):
 | 
				
			|||||||
        try:
 | 
					        try:
 | 
				
			||||||
            await producer.send(KAFKA_PRODUCER_TOPIC, value=pickle.dumps(request.model_dump()))
 | 
					            await producer.send(KAFKA_PRODUCER_TOPIC, value=pickle.dumps(request.model_dump()))
 | 
				
			||||||
        except ClientConnectorError:
 | 
					        except ClientConnectorError:
 | 
				
			||||||
            return False, 'Ошибка подключения к коннектору'
 | 
					            return False, 'Ошибка подключения к сервису'
 | 
				
			||||||
        except Exception as e:
 | 
					        except Exception as e:
 | 
				
			||||||
            return False, str(e)
 | 
					            return False, str(e)
 | 
				
			||||||
        return True, 'Сообщение отправлено'
 | 
					        return True, 'Сообщение отправлено'
 | 
				
			||||||
@@ -72,6 +72,6 @@ class ProducerService(BaseService):
 | 
				
			|||||||
                tg_message_id=tg_message_id,
 | 
					                tg_message_id=tg_message_id,
 | 
				
			||||||
                group_id=str(group_id),
 | 
					                group_id=str(group_id),
 | 
				
			||||||
                text=text,
 | 
					                text=text,
 | 
				
			||||||
            )
 | 
					            ),
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        return await ProducerService._send_message(request)
 | 
					        return await ProducerService._send_message(request)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,9 @@ from fastapi import APIRouter, Depends, UploadFile
 | 
				
			|||||||
from sqlalchemy.ext.asyncio import AsyncSession
 | 
					from sqlalchemy.ext.asyncio import AsyncSession
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from backend.session import get_session
 | 
					from backend.session import get_session
 | 
				
			||||||
 | 
					from models import User
 | 
				
			||||||
from schemas.chat import *
 | 
					from schemas.chat import *
 | 
				
			||||||
 | 
					from services.auth import get_current_user
 | 
				
			||||||
from services.chat import ChatService
 | 
					from services.chat import ChatService
 | 
				
			||||||
 | 
					
 | 
				
			||||||
chat_router = APIRouter(
 | 
					chat_router = APIRouter(
 | 
				
			||||||
@@ -20,9 +22,10 @@ chat_router = APIRouter(
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
async def send_text_message(
 | 
					async def send_text_message(
 | 
				
			||||||
        session: Annotated[AsyncSession, Depends(get_session)],
 | 
					        session: Annotated[AsyncSession, Depends(get_session)],
 | 
				
			||||||
 | 
					        user: Annotated[User, Depends(get_current_user)],
 | 
				
			||||||
        request: SendTextMessageRequest,
 | 
					        request: SendTextMessageRequest,
 | 
				
			||||||
):
 | 
					):
 | 
				
			||||||
    return await ChatService(session).send_message(request)
 | 
					    return await ChatService(session).send_message(request, user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@chat_router.post(
 | 
					@chat_router.post(
 | 
				
			||||||
@@ -44,11 +47,12 @@ async def repeat_sending_text_message(
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
async def send_messages_with_files(
 | 
					async def send_messages_with_files(
 | 
				
			||||||
        session: Annotated[AsyncSession, Depends(get_session)],
 | 
					        session: Annotated[AsyncSession, Depends(get_session)],
 | 
				
			||||||
 | 
					        user: Annotated[User, Depends(get_current_user)],
 | 
				
			||||||
        files: list[UploadFile],
 | 
					        files: list[UploadFile],
 | 
				
			||||||
        chat_id: int,
 | 
					        chat_id: int,
 | 
				
			||||||
        caption: str,
 | 
					        caption: str,
 | 
				
			||||||
):
 | 
					):
 | 
				
			||||||
    return await ChatService(session).send_messages_with_files(files, chat_id, caption)
 | 
					    return await ChatService(session).send_messages_with_files(files, chat_id, caption, user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@chat_router.delete(
 | 
					@chat_router.delete(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,8 @@
 | 
				
			|||||||
from datetime import datetime
 | 
					from datetime import datetime
 | 
				
			||||||
from typing import Optional, List
 | 
					from typing import Optional
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from schemas.base import BaseSchema, OkMessageSchema
 | 
					from schemas.base import BaseSchema, OkMessageSchema
 | 
				
			||||||
 | 
					from schemas.user import UserSchema
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# region Entities
 | 
					# region Entities
 | 
				
			||||||
@@ -33,6 +34,7 @@ class EditMessageSchema(BaseMessageSchema):
 | 
				
			|||||||
class MessageSchema(EditMessageSchema):
 | 
					class MessageSchema(EditMessageSchema):
 | 
				
			||||||
    created_at: datetime
 | 
					    created_at: datetime
 | 
				
			||||||
    tg_sender: Optional[TgUserSchema]
 | 
					    tg_sender: Optional[TgUserSchema]
 | 
				
			||||||
 | 
					    crm_sender: Optional[UserSchema]
 | 
				
			||||||
    status: str
 | 
					    status: str
 | 
				
			||||||
    is_edited: bool
 | 
					    is_edited: bool
 | 
				
			||||||
    file: Optional[MessageFileSchema] = None
 | 
					    file: Optional[MessageFileSchema] = None
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@ from backend.config import CHAT_CONNECTOR_API_KEY, CHAT_TELEGRAM_BOT_TOKEN
 | 
				
			|||||||
from external.chat.chat_client import ChatClient
 | 
					from external.chat.chat_client import ChatClient
 | 
				
			||||||
from external.chat.schemas import *
 | 
					from external.chat.schemas import *
 | 
				
			||||||
from external.kafka.services.producer_service import ProducerService
 | 
					from external.kafka.services.producer_service import ProducerService
 | 
				
			||||||
from models import Message, Chat, MessageStatus, TgGroup, Client, Card, MessageFile
 | 
					from models import Message, Chat, MessageStatus, TgGroup, Client, Card, MessageFile, User
 | 
				
			||||||
from schemas.chat import *
 | 
					from schemas.chat import *
 | 
				
			||||||
from services.base import BaseService
 | 
					from services.base import BaseService
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -162,7 +162,7 @@ class ChatService(BaseService):
 | 
				
			|||||||
        messages = (await self.session.scalars(stmt)).all()
 | 
					        messages = (await self.session.scalars(stmt)).all()
 | 
				
			||||||
        return GetMessagesResponse(messages=messages)
 | 
					        return GetMessagesResponse(messages=messages)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async def send_message(self, request: SendTextMessageRequest) -> SendTextMessageResponse:
 | 
					    async def send_message(self, request: SendTextMessageRequest, user: User) -> SendTextMessageResponse:
 | 
				
			||||||
        chat: Optional[Chat] = await self.session.get(Chat, request.message.chat_id)
 | 
					        chat: Optional[Chat] = await self.session.get(Chat, request.message.chat_id)
 | 
				
			||||||
        if not chat:
 | 
					        if not chat:
 | 
				
			||||||
            return SendTextMessageResponse(ok=False, message=f'Чат с ID: {request.message.chat_id} не найден')
 | 
					            return SendTextMessageResponse(ok=False, message=f'Чат с ID: {request.message.chat_id} не найден')
 | 
				
			||||||
@@ -172,6 +172,7 @@ class ChatService(BaseService):
 | 
				
			|||||||
            created_at=datetime.now(),
 | 
					            created_at=datetime.now(),
 | 
				
			||||||
            chat_id=request.message.chat_id,
 | 
					            chat_id=request.message.chat_id,
 | 
				
			||||||
            status=MessageStatus.sending,
 | 
					            status=MessageStatus.sending,
 | 
				
			||||||
 | 
					            crm_sender_id=user.id,
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        self.session.add(message)
 | 
					        self.session.add(message)
 | 
				
			||||||
        await self.session.commit()
 | 
					        await self.session.commit()
 | 
				
			||||||
@@ -211,11 +212,13 @@ class ChatService(BaseService):
 | 
				
			|||||||
            files: list[UploadFile],
 | 
					            files: list[UploadFile],
 | 
				
			||||||
            chat_id: int,
 | 
					            chat_id: int,
 | 
				
			||||||
            caption: str,
 | 
					            caption: str,
 | 
				
			||||||
 | 
					            user: User,
 | 
				
			||||||
    ) -> 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 SendTextMessageResponse(ok=False, message=f'Чат с ID: {chat_id} не найден')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
            chat_client = ChatClient(api_key=CHAT_CONNECTOR_API_KEY)
 | 
					            chat_client = ChatClient(api_key=CHAT_CONNECTOR_API_KEY)
 | 
				
			||||||
            response = await chat_client.send_messages_with_files(
 | 
					            response = await chat_client.send_messages_with_files(
 | 
				
			||||||
                str(chat.tg_group_id),
 | 
					                str(chat.tg_group_id),
 | 
				
			||||||
@@ -235,6 +238,7 @@ class ChatService(BaseService):
 | 
				
			|||||||
                    chat_id=chat_id,
 | 
					                    chat_id=chat_id,
 | 
				
			||||||
                    status=MessageStatus.success,
 | 
					                    status=MessageStatus.success,
 | 
				
			||||||
                    file=file,
 | 
					                    file=file,
 | 
				
			||||||
 | 
					                    crm_sender_id=user.id,
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
                last_message = message
 | 
					                last_message = message
 | 
				
			||||||
                self.session.add(message)
 | 
					                self.session.add(message)
 | 
				
			||||||
@@ -244,6 +248,10 @@ class ChatService(BaseService):
 | 
				
			|||||||
            await self.session.commit()
 | 
					            await self.session.commit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return LoadMessagesResponse(ok=response.ok, message=response.message)
 | 
					            return LoadMessagesResponse(ok=response.ok, message=response.message)
 | 
				
			||||||
 | 
					        except ClientConnectorError:
 | 
				
			||||||
 | 
					            return LoadMessagesResponse(ok=False, message='Ошибка подключения к сервису')
 | 
				
			||||||
 | 
					        except Exception as e:
 | 
				
			||||||
 | 
					            return LoadMessagesResponse(ok=False, message=str(e))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async def _get_message_by_id(self, message_id: int) -> Optional[Message]:
 | 
					    async def _get_message_by_id(self, message_id: int) -> Optional[Message]:
 | 
				
			||||||
        stmt = (
 | 
					        stmt = (
 | 
				
			||||||
@@ -286,7 +294,6 @@ class ChatService(BaseService):
 | 
				
			|||||||
            raise HTTPException(status_code=404, detail=f'Файл с ID {file_id} не найден')
 | 
					            raise HTTPException(status_code=404, detail=f'Файл с ID {file_id} не найден')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        url: str = f'https://api.telegram.org/file/bot{CHAT_TELEGRAM_BOT_TOKEN}/{file.file_path}'
 | 
					        url: str = f'https://api.telegram.org/file/bot{CHAT_TELEGRAM_BOT_TOKEN}/{file.file_path}'
 | 
				
			||||||
        print(f'URL = {url}')
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        response = requests.get(url, stream=True)
 | 
					        response = requests.get(url, stream=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user