feat: sending and receiving messages with files, editing text messages
This commit is contained in:
24
external/kafka/services/consumer_service.py
vendored
24
external/kafka/services/consumer_service.py
vendored
@@ -1,6 +1,5 @@
|
||||
import pickle
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
from uuid import UUID
|
||||
|
||||
from aiokafka import ConsumerRecord
|
||||
@@ -8,13 +7,14 @@ from sqlalchemy import select
|
||||
|
||||
from external.kafka.enums import KafkaMessageType
|
||||
from external.kafka.schemas.consumer import *
|
||||
from models import Message, MessageStatus, TgUser, Chat, TgGroup
|
||||
from models import Message, MessageStatus, TgUser, Chat, TgGroup, MessageFile
|
||||
from services.base import BaseService
|
||||
|
||||
|
||||
class ConsumerService(BaseService):
|
||||
async def consume_message(self, message: ConsumerRecord):
|
||||
value = pickle.loads(message.value)
|
||||
print("Consumer: received message: ", value)
|
||||
|
||||
try:
|
||||
if 'ok' in value:
|
||||
@@ -36,7 +36,8 @@ class ConsumerService(BaseService):
|
||||
response = SendMessageToConnectorResponse.model_validate(value)
|
||||
await self._process_connector_send_response(response)
|
||||
case KafkaMessageType.EDIT:
|
||||
pass
|
||||
response = EditMessageResponse.model_validate(value)
|
||||
await self._process_connector_edit_response(response)
|
||||
case KafkaMessageType.DELETE:
|
||||
response = DeleteMessageResponse.model_validate(value)
|
||||
await self._process_connector_delete_response(response)
|
||||
@@ -59,6 +60,16 @@ class ConsumerService(BaseService):
|
||||
|
||||
message = await self.session.get(Message, response.message_id)
|
||||
message.is_deleted = True
|
||||
await self.session.commit()
|
||||
|
||||
async def _process_connector_edit_response(self, response: EditMessageResponse):
|
||||
if not response.ok:
|
||||
return
|
||||
|
||||
message = await self.session.get(Message, response.message_id)
|
||||
message.text = response.text
|
||||
message.is_edited = True
|
||||
await self.session.commit()
|
||||
|
||||
async def _get_chat(self, group_id: str, tg_topic_id: int) -> Optional[Chat]:
|
||||
stmt = (
|
||||
@@ -81,12 +92,17 @@ class ConsumerService(BaseService):
|
||||
if not chat:
|
||||
return
|
||||
|
||||
file = None
|
||||
if request.message.file:
|
||||
file = MessageFile(**request.message.file.model_dump())
|
||||
|
||||
message = Message(
|
||||
text=request.message.text,
|
||||
text=request.message.text if request.message.text else "",
|
||||
created_at=datetime.now(),
|
||||
tg_sender_id=tg_sender.id,
|
||||
chat_id=chat.id,
|
||||
status=MessageStatus.success,
|
||||
file=file,
|
||||
)
|
||||
self.session.add(message)
|
||||
await self.session.commit()
|
||||
|
||||
93
external/kafka/services/producer_service.py
vendored
93
external/kafka/services/producer_service.py
vendored
@@ -6,12 +6,21 @@ from aiohttp import ClientConnectorError
|
||||
from backend.config import KAFKA_PRODUCER_TOPIC, CHAT_CONNECTOR_API_KEY
|
||||
from external.kafka import producer
|
||||
from external.kafka.enums import KafkaMessageType
|
||||
from external.kafka.schemas.producer import MessageSchema, SendMessageToConnectorRequest, \
|
||||
SendMessageDeletingToConnectorRequest, BaseMessageSchema
|
||||
from external.kafka.schemas.producer import *
|
||||
from services.base import BaseService
|
||||
|
||||
|
||||
class ProducerService(BaseService):
|
||||
@staticmethod
|
||||
async def _send_message(request: BaseConnectorRequest):
|
||||
try:
|
||||
await producer.send(KAFKA_PRODUCER_TOPIC, value=pickle.dumps(request.model_dump()))
|
||||
except ClientConnectorError:
|
||||
return False, 'Ошибка подключения к коннектору'
|
||||
except Exception as e:
|
||||
return False, str(e)
|
||||
return True, 'Сообщение отправлено'
|
||||
|
||||
@staticmethod
|
||||
async def send_message_to_connector(
|
||||
message_text: str,
|
||||
@@ -19,42 +28,50 @@ class ProducerService(BaseService):
|
||||
topic_id: int,
|
||||
message_id: int,
|
||||
) -> tuple[bool, str]:
|
||||
try:
|
||||
request = SendMessageToConnectorRequest(
|
||||
message=MessageSchema(
|
||||
message_id=message_id,
|
||||
text=message_text,
|
||||
group_id=str(group_id),
|
||||
topic_id=topic_id,
|
||||
),
|
||||
message_type=KafkaMessageType.SEND,
|
||||
app_auth_key=CHAT_CONNECTOR_API_KEY,
|
||||
)
|
||||
await producer.send(KAFKA_PRODUCER_TOPIC, value=pickle.dumps(request.model_dump()))
|
||||
except ClientConnectorError:
|
||||
return False, 'Ошибка подключения к коннектору'
|
||||
except Exception as e:
|
||||
return False, str(e)
|
||||
|
||||
return True, 'Сообщение отправлено'
|
||||
request = SendMessageToConnectorRequest(
|
||||
message_type=KafkaMessageType.SEND,
|
||||
app_auth_key=CHAT_CONNECTOR_API_KEY,
|
||||
message=MessageSchema(
|
||||
message_id=message_id,
|
||||
text=message_text,
|
||||
group_id=str(group_id),
|
||||
topic_id=topic_id,
|
||||
),
|
||||
)
|
||||
return await ProducerService._send_message(request)
|
||||
|
||||
@staticmethod
|
||||
async def send_message_deleting_to_connector(message_id: int, tg_message_id: int, group_id: UUID) -> tuple[bool, str]:
|
||||
try:
|
||||
request = SendMessageDeletingToConnectorRequest(
|
||||
message_type=KafkaMessageType.DELETE,
|
||||
app_auth_key=CHAT_CONNECTOR_API_KEY,
|
||||
message=BaseMessageSchema(
|
||||
message_id=message_id,
|
||||
tg_message_id=tg_message_id,
|
||||
group_id=str(group_id),
|
||||
),
|
||||
async def send_message_deleting_to_connector(
|
||||
message_id: int,
|
||||
tg_message_id: int,
|
||||
group_id: UUID,
|
||||
) -> tuple[bool, str]:
|
||||
request = SendMessageDeletingToConnectorRequest(
|
||||
message_type=KafkaMessageType.DELETE,
|
||||
app_auth_key=CHAT_CONNECTOR_API_KEY,
|
||||
message=BaseMessageSchema(
|
||||
message_id=message_id,
|
||||
tg_message_id=tg_message_id,
|
||||
group_id=str(group_id),
|
||||
),
|
||||
)
|
||||
return await ProducerService._send_message(request)
|
||||
|
||||
@staticmethod
|
||||
async def send_message_editing_to_connector(
|
||||
message_id: int,
|
||||
tg_message_id: int,
|
||||
group_id: UUID,
|
||||
text: str,
|
||||
) -> tuple[bool, str]:
|
||||
request = SendMessageEditingToConnectorRequest(
|
||||
message_type=KafkaMessageType.EDIT,
|
||||
app_auth_key=CHAT_CONNECTOR_API_KEY,
|
||||
message=EditMessageSchema(
|
||||
message_id=message_id,
|
||||
tg_message_id=tg_message_id,
|
||||
group_id=str(group_id),
|
||||
text=text,
|
||||
)
|
||||
await producer.send(KAFKA_PRODUCER_TOPIC, value=pickle.dumps(request.model_dump()))
|
||||
except ClientConnectorError:
|
||||
return False, 'Ошибка подключения к коннектору'
|
||||
except Exception as e:
|
||||
return False, str(e)
|
||||
|
||||
return True, 'Сообщение отправлено'
|
||||
|
||||
)
|
||||
return await ProducerService._send_message(request)
|
||||
|
||||
Reference in New Issue
Block a user