fix: поиск broadcast сообщения по forwarded_message_id
- Теперь можно удалять broadcast сообщение, отвечая на его копию (не только на оригинал) - Метод get_message_by_telegram_id ищет в forwarded_message_ids - Админ может ответить на любую копию сообщения для удаления у всех
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
"""Сервисы для системы чата"""
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from sqlalchemy import select, and_, or_, update, delete
|
||||
from sqlalchemy import select, and_, or_, update, delete, text
|
||||
from sqlalchemy.orm import selectinload
|
||||
from typing import Optional, List, Dict, Any
|
||||
from datetime import datetime, timezone
|
||||
@@ -191,7 +191,11 @@ class ChatMessageService:
|
||||
telegram_message_id: int,
|
||||
user_id: Optional[int] = None
|
||||
) -> Optional[ChatMessage]:
|
||||
"""Получить сообщение по telegram_message_id"""
|
||||
"""
|
||||
Получить сообщение по telegram_message_id
|
||||
Ищет как по оригинальному telegram_message_id, так и в forwarded_message_ids
|
||||
"""
|
||||
# Сначала ищем по оригинальному telegram_message_id
|
||||
query = select(ChatMessage).where(
|
||||
ChatMessage.telegram_message_id == telegram_message_id
|
||||
)
|
||||
@@ -199,6 +203,31 @@ class ChatMessageService:
|
||||
if user_id:
|
||||
query = query.where(ChatMessage.user_id == user_id)
|
||||
|
||||
result = await session.execute(query)
|
||||
message = result.scalar_one_or_none()
|
||||
|
||||
# Если нашли - возвращаем
|
||||
if message:
|
||||
return message
|
||||
|
||||
# Если не нашли - ищем в forwarded_message_ids
|
||||
# Загружаем все недавние сообщения и ищем в них
|
||||
query = select(ChatMessage).where(
|
||||
ChatMessage.forwarded_message_ids.isnot(None)
|
||||
).order_by(ChatMessage.created_at.desc()).limit(100)
|
||||
|
||||
result = await session.execute(query)
|
||||
messages = result.scalars().all()
|
||||
|
||||
# Ищем сообщение, где telegram_message_id есть в forwarded_message_ids
|
||||
for msg in messages:
|
||||
if msg.forwarded_message_ids:
|
||||
for user_tid, fwd_msg_id in msg.forwarded_message_ids.items():
|
||||
if fwd_msg_id == telegram_message_id:
|
||||
return msg
|
||||
|
||||
return None
|
||||
|
||||
result = await session.execute(query)
|
||||
return result.scalar_one_or_none()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user