Implement user-specific question numbering and update database schema. Added triggers for automatic question numbering and adjustments upon deletion. Enhanced CRUD operations to manage user_question_number effectively.

This commit is contained in:
2025-09-06 18:35:12 +03:00
parent 50be010026
commit 596a2fa813
111 changed files with 16847 additions and 65 deletions

146
services/auth/auth_new.py Normal file
View File

@@ -0,0 +1,146 @@
"""
Новый сервис авторизации с использованием системы разрешений
Соблюдает принцип открытости/закрытости (OCP)
"""
from typing import Optional
from services.infrastructure.database import DatabaseService
from services.permissions import get_permission_checker
from services.infrastructure.logger import get_logger
logger = get_logger(__name__)
class AuthService:
"""
Сервис авторизации, использующий систему разрешений.
Соблюдает принцип открытости/закрытости (OCP).
"""
def __init__(self, database: DatabaseService, config_provider):
self.database = database
self.config = config_provider
def is_admin(self, user_id: int) -> bool:
"""
Проверка, является ли пользователь администратором
Args:
user_id: ID пользователя в Telegram
Returns:
True если пользователь администратор, False иначе
"""
return user_id in self.config.ADMINS
async def is_superuser(self, user_id: int) -> bool:
"""
Проверка, является ли пользователь суперпользователем
Args:
user_id: ID пользователя в Telegram
Returns:
True если пользователь суперпользователь, False иначе
"""
try:
user = await self.database.get_user(user_id)
return user.is_superuser if user else False
except Exception:
return False
async def get_user_role(self, user_id: int) -> str:
"""
Получение роли пользователя
Args:
user_id: ID пользователя в Telegram
Returns:
Роль пользователя: 'admin', 'superuser' или 'user'
"""
if self.is_admin(user_id):
return 'admin'
elif await self.is_superuser(user_id):
return 'superuser'
else:
return 'user'
async def has_permission(self, user_id: int, permission: str) -> bool:
"""
Проверка наличия разрешения у пользователя через систему разрешений
Args:
user_id: ID пользователя в Telegram
permission: Название разрешения
Returns:
True если у пользователя есть разрешение, False иначе
"""
checker = get_permission_checker()
if not checker:
logger.error("Проверщик разрешений не инициализирован")
return False
return await checker.has_permission(user_id, permission)
async def has_any_permission(self, user_id: int, permissions: list[str]) -> bool:
"""
Проверка наличия хотя бы одного из разрешений у пользователя
Args:
user_id: ID пользователя в Telegram
permissions: Список названий разрешений
Returns:
True если у пользователя есть хотя бы одно разрешение, False иначе
"""
checker = get_permission_checker()
if not checker:
logger.error("Проверщик разрешений не инициализирован")
return False
return await checker.has_any_permission(user_id, permissions)
async def has_all_permissions(self, user_id: int, permissions: list[str]) -> bool:
"""
Проверка наличия всех разрешений у пользователя
Args:
user_id: ID пользователя в Telegram
permissions: Список названий разрешений
Returns:
True если у пользователя есть все разрешения, False иначе
"""
checker = get_permission_checker()
if not checker:
logger.error("Проверщик разрешений не инициализирован")
return False
return await checker.has_all_permissions(user_id, permissions)
async def get_user_permissions(self, user_id: int) -> list[str]:
"""
Получение списка всех разрешений пользователя
Args:
user_id: ID пользователя в Telegram
Returns:
Список названий разрешений пользователя
"""
checker = get_permission_checker()
if not checker:
logger.error("Проверщик разрешений не инициализирован")
return []
# Получаем все доступные разрешения
registry = checker.registry
all_permissions = registry.get_all()
user_permissions = []
for permission_name in all_permissions.keys():
if await checker.has_permission(user_id, permission_name):
user_permissions.append(permission_name)
return user_permissions