Добавлен функционал для отслеживания истории банов пользователей.
- Введена новая модель `BlacklistHistoryRecord` для хранения информации о банах и разблокировках. - Обновлены методы `set_user_blacklist` и `delete_user_blacklist` в `AsyncBotDB` для логирования событий в историю. - Обновлена схема базы данных для создания таблицы `blacklist_history` и соответствующих индексов. - Обновлены тесты для проверки нового функционала и обработки ошибок при записи в историю.
This commit is contained in:
@@ -3,7 +3,7 @@ from datetime import datetime
|
||||
from typing import Optional, List, Dict, Any, Tuple
|
||||
from database.repository_factory import RepositoryFactory
|
||||
from database.models import (
|
||||
User, BlacklistUser, UserMessage, TelegramPost, PostContent,
|
||||
User, BlacklistUser, BlacklistHistoryRecord, UserMessage, TelegramPost, PostContent,
|
||||
Admin, AudioMessage
|
||||
)
|
||||
|
||||
@@ -196,7 +196,10 @@ class AsyncBotDB:
|
||||
date_to_unban: int = None,
|
||||
ban_author: Optional[int] = None,
|
||||
):
|
||||
"""Добавляет пользователя в черный список."""
|
||||
"""
|
||||
Добавляет пользователя в черный список.
|
||||
Также создает запись в истории банов для отслеживания.
|
||||
"""
|
||||
blacklist_user = BlacklistUser(
|
||||
user_id=user_id,
|
||||
message_for_user=message_for_user,
|
||||
@@ -204,9 +207,40 @@ class AsyncBotDB:
|
||||
ban_author=ban_author,
|
||||
)
|
||||
await self.factory.blacklist.add_user(blacklist_user)
|
||||
|
||||
# Логируем в историю банов
|
||||
try:
|
||||
date_ban = int(datetime.now().timestamp())
|
||||
history_record = BlacklistHistoryRecord(
|
||||
user_id=user_id,
|
||||
message_for_user=message_for_user,
|
||||
date_ban=date_ban,
|
||||
date_unban=None, # Будет установлено при разбане
|
||||
ban_author=ban_author,
|
||||
)
|
||||
await self.factory.blacklist_history.add_record_on_ban(history_record)
|
||||
except Exception as e:
|
||||
# Ошибка записи в историю не должна ломать процесс бана
|
||||
self.logger.error(
|
||||
f"Ошибка записи в историю банов для user_id={user_id}: {e}"
|
||||
)
|
||||
|
||||
async def delete_user_blacklist(self, user_id: int) -> bool:
|
||||
"""Удаляет пользователя из черного списка."""
|
||||
"""
|
||||
Удаляет пользователя из черного списка.
|
||||
Также обновляет запись в истории банов, устанавливая date_unban.
|
||||
"""
|
||||
# Сначала обновляем историю (если есть открытая запись)
|
||||
try:
|
||||
date_unban = int(datetime.now().timestamp())
|
||||
await self.factory.blacklist_history.set_unban_date(user_id, date_unban)
|
||||
except Exception as e:
|
||||
# Ошибка записи в историю не должна ломать критический путь разбана
|
||||
self.logger.error(
|
||||
f"Ошибка обновления истории при разбане для user_id={user_id}: {e}"
|
||||
)
|
||||
|
||||
# Удаляем из черного списка (критический путь)
|
||||
return await self.factory.blacklist.remove_user(user_id)
|
||||
|
||||
async def check_user_in_blacklist(self, user_id: int) -> bool:
|
||||
|
||||
Reference in New Issue
Block a user