fix: поиск broadcast сообщения по forwarded_message_id

- Теперь можно удалять broadcast сообщение, отвечая на его копию (не только на оригинал)
- Метод get_message_by_telegram_id ищет в forwarded_message_ids
- Админ может ответить на любую копию сообщения для удаления у всех
This commit is contained in:
2025-11-17 14:56:18 +09:00
parent 84adcce57b
commit 698c945cef
2 changed files with 32 additions and 3 deletions

View File

@@ -1 +1 @@
1014690 1025432

View File

@@ -1,6 +1,6 @@
"""Сервисы для системы чата""" """Сервисы для системы чата"""
from sqlalchemy.ext.asyncio import AsyncSession 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 sqlalchemy.orm import selectinload
from typing import Optional, List, Dict, Any from typing import Optional, List, Dict, Any
from datetime import datetime, timezone from datetime import datetime, timezone
@@ -191,7 +191,11 @@ class ChatMessageService:
telegram_message_id: int, telegram_message_id: int,
user_id: Optional[int] = None user_id: Optional[int] = None
) -> Optional[ChatMessage]: ) -> Optional[ChatMessage]:
"""Получить сообщение по telegram_message_id""" """
Получить сообщение по telegram_message_id
Ищет как по оригинальному telegram_message_id, так и в forwarded_message_ids
"""
# Сначала ищем по оригинальному telegram_message_id
query = select(ChatMessage).where( query = select(ChatMessage).where(
ChatMessage.telegram_message_id == telegram_message_id ChatMessage.telegram_message_id == telegram_message_id
) )
@@ -199,6 +203,31 @@ class ChatMessageService:
if user_id: if user_id:
query = query.where(ChatMessage.user_id == 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) result = await session.execute(query)
return result.scalar_one_or_none() return result.scalar_one_or_none()