""" Конкретные реализации разрешений Каждое разрешение - отдельный класс, что позволяет легко добавлять новые без изменения существующего кода """ from .base import Permission from services.infrastructure.database import DatabaseService from services.infrastructure.logger import get_logger logger = get_logger(__name__) class AdminPermission(Permission): """Разрешение для администраторов""" def __init__(self): super().__init__( name="admin", description="Права администратора" ) async def check(self, user_id: int, database: DatabaseService, config) -> bool: """Проверка, является ли пользователь администратором""" return user_id in config.ADMINS class SuperuserPermission(Permission): """Разрешение для суперпользователей""" def __init__(self): super().__init__( name="superuser", description="Права суперпользователя" ) async def check(self, user_id: int, database: DatabaseService, config) -> bool: """Проверка, является ли пользователь суперпользователем""" try: user = await database.get_user(user_id) return user.is_superuser if user else False except Exception as e: logger.error(f"Ошибка при проверке суперпользователя {user_id}: {e}") return False class ViewStatsPermission(Permission): """Разрешение на просмотр статистики""" def __init__(self): super().__init__( name="view_stats", description="Просмотр статистики" ) async def check(self, user_id: int, database: DatabaseService, config) -> bool: """Проверка права на просмотр статистики""" # Администраторы и суперпользователи могут просматривать статистику admin_permission = AdminPermission() superuser_permission = SuperuserPermission() is_admin = await admin_permission.check(user_id, database, config) is_superuser = await superuser_permission.check(user_id, database, config) return is_admin or is_superuser class AdminPanelPermission(Permission): """Разрешение на доступ к админ панели""" def __init__(self): super().__init__( name="admin_panel", description="Доступ к админ панели" ) async def check(self, user_id: int, database: DatabaseService, config) -> bool: """Проверка права на доступ к админ панели""" # Администраторы и суперпользователи могут использовать админ панель admin_permission = AdminPermission() superuser_permission = SuperuserPermission() is_admin = await admin_permission.check(user_id, database, config) is_superuser = await superuser_permission.check(user_id, database, config) return is_admin or is_superuser class ManageUsersPermission(Permission): """Разрешение на управление пользователями""" def __init__(self): super().__init__( name="manage_users", description="Управление пользователями" ) async def check(self, user_id: int, database: DatabaseService, config) -> bool: """Проверка права на управление пользователями""" # Администраторы и суперпользователи могут управлять пользователями admin_permission = AdminPermission() superuser_permission = SuperuserPermission() is_admin = await admin_permission.check(user_id, database, config) is_superuser = await superuser_permission.check(user_id, database, config) return is_admin or is_superuser class BroadcastPermission(Permission): """Разрешение на рассылку сообщений""" def __init__(self): super().__init__( name="broadcast", description="Рассылка сообщений" ) async def check(self, user_id: int, database: DatabaseService, config) -> bool: """Проверка права на рассылку""" # Только администраторы могут делать рассылку admin_permission = AdminPermission() return await admin_permission.check(user_id, database, config) class SuperuserOnlyPermission(Permission): """Разрешение только для суперпользователей""" def __init__(self): super().__init__( name="superuser_only", description="Только для суперпользователей" ) async def check(self, user_id: int, database: DatabaseService, config) -> bool: """Проверка права только для суперпользователей""" superuser_permission = SuperuserPermission() return await superuser_permission.check(user_id, database, config) class ViewQuestionsPermission(Permission): """Разрешение на просмотр вопросов""" def __init__(self): super().__init__( name="view_questions", description="Просмотр вопросов" ) async def check(self, user_id: int, database: DatabaseService, config) -> bool: """Проверка права на просмотр вопросов""" # Все активные пользователи могут просматривать вопросы try: user = await database.get_user(user_id) return user.is_active if user else False except Exception as e: logger.error(f"Ошибка при проверке активности пользователя {user_id}: {e}") return False class AskQuestionsPermission(Permission): """Разрешение на задавание вопросов""" def __init__(self): super().__init__( name="ask_questions", description="Задавание вопросов" ) async def check(self, user_id: int, database: DatabaseService, config) -> bool: """Проверка права на задавание вопросов""" # Все активные пользователи могут задавать вопросы try: user = await database.get_user(user_id) return user.is_active and not user.is_banned if user else False except Exception as e: logger.error(f"Ошибка при проверке права задавать вопросы для пользователя {user_id}: {e}") return False class AnswerQuestionsPermission(Permission): """Разрешение на ответы на вопросы""" def __init__(self): super().__init__( name="answer_questions", description="Ответы на вопросы" ) async def check(self, user_id: int, database: DatabaseService, config) -> bool: """Проверка права на ответы на вопросы""" # Все активные пользователи могут отвечать на вопросы try: user = await database.get_user(user_id) return user.is_active and not user.is_banned if user else False except Exception as e: logger.error(f"Ошибка при проверке права отвечать на вопросы для пользователя {user_id}: {e}") return False