Files
core/auth/rbac_interface.py
Untone e78e12eeee
Some checks failed
Deploy on push / deploy (push) Failing after 17s
circular-fix
2025-08-17 16:33:54 +03:00

81 lines
3.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Интерфейс для RBAC операций, исключающий циркулярные импорты.
Этот модуль содержит только типы и абстрактные интерфейсы,
не импортирует ORM модели и не создает циклических зависимостей.
"""
from abc import ABC, abstractmethod
from typing import Any, Protocol
class RBACOperations(Protocol):
"""
Протокол для RBAC операций, позволяющий ORM моделям
выполнять операции с правами без прямого импорта services.rbac
"""
async def get_permissions_for_role(self, role: str, community_id: int) -> list[str]:
"""Получает разрешения для роли в сообществе"""
...
async def initialize_community_permissions(self, community_id: int) -> None:
"""Инициализирует права для нового сообщества"""
...
async def user_has_permission(
self, author_id: int, permission: str, community_id: int, session: Any = None
) -> bool:
"""Проверяет разрешение пользователя в сообществе"""
...
async def _roles_have_permission(
self, role_slugs: list[str], permission: str, community_id: int
) -> bool:
"""Проверяет, есть ли у набора ролей конкретное разрешение в сообществе"""
...
class CommunityAuthorQueries(Protocol):
"""
Протокол для запросов CommunityAuthor, позволяющий RBAC
выполнять запросы без прямого импорта ORM моделей
"""
def get_user_roles_in_community(
self, author_id: int, community_id: int, session: Any = None
) -> list[str]:
"""Получает роли пользователя в сообществе"""
...
# Глобальные переменные для dependency injection
_rbac_operations: RBACOperations | None = None
_community_queries: CommunityAuthorQueries | None = None
def set_rbac_operations(ops: RBACOperations) -> None:
"""Устанавливает реализацию RBAC операций"""
global _rbac_operations
_rbac_operations = ops
def set_community_queries(queries: CommunityAuthorQueries) -> None:
"""Устанавливает реализацию запросов сообщества"""
global _community_queries
_community_queries = queries
def get_rbac_operations() -> RBACOperations:
"""Получает реализацию RBAC операций"""
if _rbac_operations is None:
raise RuntimeError("RBAC operations не инициализированы. Вызовите set_rbac_operations()")
return _rbac_operations
def get_community_queries() -> CommunityAuthorQueries:
"""Получает реализацию запросов сообщества"""
if _community_queries is None:
raise RuntimeError("Community queries не инициализированы. Вызовите set_community_queries()")
return _community_queries