Добавлен функционал для отслеживания истории банов пользователей.

- Введена новая модель `BlacklistHistoryRecord` для хранения информации о банах и разблокировках.
- Обновлены методы `set_user_blacklist` и `delete_user_blacklist` в `AsyncBotDB` для логирования событий в историю.
- Обновлена схема базы данных для создания таблицы `blacklist_history` и соответствующих индексов.
- Обновлены тесты для проверки нового функционала и обработки ошибок при записи в историю.
This commit is contained in:
2026-01-23 16:23:27 +03:00
parent 7269130777
commit 3b841fcbfa
10 changed files with 904 additions and 20 deletions

View File

@@ -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: