auth and rbac improves

This commit is contained in:
2025-08-20 18:33:58 +03:00
parent fe76eef273
commit fb45178396
10 changed files with 426 additions and 225 deletions

View File

@@ -26,6 +26,8 @@ from orm.community import (
Community,
CommunityAuthor,
CommunityFollower,
)
from rbac.api import (
assign_role_to_user,
get_user_roles_in_community,
)
@@ -639,31 +641,42 @@ class AuthService:
logger.error(f"Ошибка отмены смены email: {e}")
return {"success": False, "error": str(e), "author": None}
async def ensure_user_has_reader_role(self, user_id: int) -> bool:
async def ensure_user_has_reader_role(self, user_id: int, session=None) -> bool:
"""
Убеждается, что у пользователя есть роль 'reader'.
Если её нет - добавляет автоматически.
Args:
user_id: ID пользователя
session: Сессия БД (опционально)
Returns:
True если роль была добавлена или уже существует
"""
try:
logger.debug(f"[ensure_user_has_reader_role] Проверяем роли для пользователя {user_id}")
existing_roles = get_user_roles_in_community(user_id, community_id=1)
# Используем переданную сессию или создаем новую
existing_roles = get_user_roles_in_community(user_id, community_id=1, session=session)
logger.debug(f"[ensure_user_has_reader_role] Существующие роли: {existing_roles}")
if "reader" not in existing_roles:
logger.warning(f"У пользователя {user_id} нет роли 'reader'. Добавляем автоматически.")
success = assign_role_to_user(user_id, "reader", community_id=1)
if success:
logger.info(f"Роль 'reader' добавлена пользователю {user_id}")
return True
logger.error(f"Не удалось добавить роль 'reader' пользователю {user_id}")
if "reader" not in existing_roles:
logger.warning(f"У пользователя {user_id} нет роли 'reader'. Добавляем автоматически.")
success = assign_role_to_user(user_id, "reader", community_id=1, session=session)
logger.debug(f"[ensure_user_has_reader_role] Результат assign_role_to_user: {success}")
if success:
logger.info(f"Роль 'reader' добавлена пользователю {user_id}")
return True
logger.error(f"Не удалось добавить роль 'reader' пользователю {user_id}")
return False
logger.debug(f"[ensure_user_has_reader_role] Роль 'reader' уже есть у пользователя {user_id}")
return True
except Exception as e:
logger.error(f"Ошибка при проверке/добавлении роли reader для пользователя {user_id}: {e}")
# В случае ошибки возвращаем False, чтобы тест мог обработать это
return False
return True
async def fix_all_users_reader_role(self) -> dict[str, int]:
"""
Проверяет всех пользователей и добавляет роль 'reader' тем, у кого её нет.