Добавлено поле ban_author в модель BlacklistUser и соответствующие изменения в базе данных для отслеживания автора блокировки пользователя. Обновлены методы работы с черным списком в AsyncBotDB и BlacklistRepository, а также обработка блокировок в AdminService и BanService. Обновлены тесты для проверки новых функциональностей.

This commit is contained in:
2026-01-23 13:38:48 +03:00
parent 89022aedaf
commit 477e2666a3
10 changed files with 150 additions and 42 deletions

View File

@@ -188,13 +188,20 @@ class AsyncBotDB:
)
# Методы для работы с черным списком
async def set_user_blacklist(self, user_id: int, user_name: str = None,
message_for_user: str = None, date_to_unban: int = None):
async def set_user_blacklist(
self,
user_id: int,
user_name: str = None,
message_for_user: str = None,
date_to_unban: int = None,
ban_author: Optional[int] = None,
):
"""Добавляет пользователя в черный список."""
blacklist_user = BlacklistUser(
user_id=user_id,
message_for_user=message_for_user,
date_to_unban=date_to_unban
date_to_unban=date_to_unban,
ban_author=ban_author,
)
await self.factory.blacklist.add_user(blacklist_user)

View File

@@ -26,6 +26,7 @@ class BlacklistUser:
message_for_user: Optional[str] = None
date_to_unban: Optional[int] = None
created_at: Optional[int] = None
ban_author: Optional[int] = None
@dataclass

View File

@@ -14,7 +14,9 @@ class BlacklistRepository(DatabaseConnection):
message_for_user TEXT,
date_to_unban INTEGER,
created_at INTEGER DEFAULT (strftime('%s', 'now')),
FOREIGN KEY (user_id) REFERENCES our_users (user_id) ON DELETE CASCADE
ban_author INTEGER,
FOREIGN KEY (user_id) REFERENCES our_users (user_id) ON DELETE CASCADE,
FOREIGN KEY (ban_author) REFERENCES our_users (user_id) ON DELETE SET NULL
)
'''
await self._execute_query(query)
@@ -23,10 +25,15 @@ class BlacklistRepository(DatabaseConnection):
async def add_user(self, blacklist_user: BlacklistUser) -> None:
"""Добавляет пользователя в черный список."""
query = """
INSERT INTO blacklist (user_id, message_for_user, date_to_unban)
VALUES (?, ?, ?)
INSERT INTO blacklist (user_id, message_for_user, date_to_unban, ban_author)
VALUES (?, ?, ?, ?)
"""
params = (blacklist_user.user_id, blacklist_user.message_for_user, blacklist_user.date_to_unban)
params = (
blacklist_user.user_id,
blacklist_user.message_for_user,
blacklist_user.date_to_unban,
blacklist_user.ban_author,
)
await self._execute_query(query, params)
self.logger.info(f"Пользователь добавлен в черный список: user_id={blacklist_user.user_id}")
@@ -52,7 +59,11 @@ class BlacklistRepository(DatabaseConnection):
async def get_user(self, user_id: int) -> Optional[BlacklistUser]:
"""Возвращает информацию о пользователе в черном списке по user_id."""
query = "SELECT user_id, message_for_user, date_to_unban, created_at FROM blacklist WHERE user_id = ?"
query = """
SELECT user_id, message_for_user, date_to_unban, created_at, ban_author
FROM blacklist
WHERE user_id = ?
"""
rows = await self._execute_query_with_result(query, (user_id,))
row = rows[0] if rows else None
@@ -61,40 +72,54 @@ class BlacklistRepository(DatabaseConnection):
user_id=row[0],
message_for_user=row[1],
date_to_unban=row[2],
created_at=row[3]
created_at=row[3],
ban_author=row[4] if len(row) > 4 else None,
)
return None
async def get_all_users(self, offset: int = 0, limit: int = 10) -> List[BlacklistUser]:
"""Возвращает список пользователей в черном списке."""
query = "SELECT user_id, message_for_user, date_to_unban, created_at FROM blacklist LIMIT ?, ?"
query = """
SELECT user_id, message_for_user, date_to_unban, created_at, ban_author
FROM blacklist
LIMIT ?, ?
"""
rows = await self._execute_query_with_result(query, (offset, limit))
users = []
for row in rows:
users.append(BlacklistUser(
user_id=row[0],
message_for_user=row[1],
date_to_unban=row[2],
created_at=row[3]
))
users.append(
BlacklistUser(
user_id=row[0],
message_for_user=row[1],
date_to_unban=row[2],
created_at=row[3],
ban_author=row[4] if len(row) > 4 else None,
)
)
self.logger.info(f"Получен список пользователей в черном списке (offset={offset}, limit={limit}): {len(users)}")
return users
async def get_all_users_no_limit(self) -> List[BlacklistUser]:
"""Возвращает список всех пользователей в черном списке без лимитов."""
query = "SELECT user_id, message_for_user, date_to_unban, created_at FROM blacklist"
query = """
SELECT user_id, message_for_user, date_to_unban, created_at, ban_author
FROM blacklist
"""
rows = await self._execute_query_with_result(query)
users = []
for row in rows:
users.append(BlacklistUser(
user_id=row[0],
message_for_user=row[1],
date_to_unban=row[2],
created_at=row[3]
))
users.append(
BlacklistUser(
user_id=row[0],
message_for_user=row[1],
date_to_unban=row[2],
created_at=row[3],
ban_author=row[4] if len(row) > 4 else None,
)
)
self.logger.info(f"Получен список всех пользователей в черном списке: {len(users)}")
return users