Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
139 changes: 1 addition & 138 deletions auth_backend/auth_plugins/auth_method.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,148 +42,11 @@ class Session(Base):
AUTH_METHODS: dict[str, type[AuthMethodMeta]] = {}


class MethodMeta(metaclass=ABCMeta):
"""Параметры метода аввторизации пользователя
Args:
`__fields__: frozenset - required` - множество параметров данного метода авторизации

`__required_fields__: frozenset - required` - множество обязательных парамтеров данного метода авторизации

`__auth_method__: str - required` - __repr__ соотвествуещго метода авторизации

Пример:
```
class YourAuthParams(MethodMeta):
__auth_method__ = "your_auth" ##YourAuth.__repr__ === "your_auth"

__fields__ = frozenset(frozenset(("very_important_field", "not_important_field",))("very_important_field", "not_important_field",))

__required_fields__ = frozenset(("very_important_field",))
```
"""

__auth_method__: str = None

__fields__ = frozenset()
__required_fields__ = frozenset()
__user: User

def __init__(self, user: User, methods: list[AuthMethod] = None):
assert self.__fields__ and self.__required_fields__, "__fields__ or __required_fields__ not defined"
if methods is None:
methods = []
self.__user = user
for method in methods:
assert method.param in self.__fields__
setattr(self, method.param, method)

async def create(self, param: str, value: str) -> AuthMethod:
"""
Создает AuthMethod у данного юзера, auth_method берется из
self.__auth_method__

Args:
param: str - параметр AuthMethod

value: str - значение, которое будет задано по этому параметру

Returns:
AuthMethod - созданный метод

Raises:
AssertionError - если param не нахяодятся в __fields__

AlreadyExists - если метод по такому ключу уже существует

Пример:
```
user.auth_methods.email.create("email", value)
```
"""
assert param in self.__fields__, "You cant create auth_method which not declared in __fields__"
if (attr := getattr(self, param)) and getattr(attr, "is_deleted") is not True:
raise AlreadyExists(AuthMethod, attr.id)
_method = AuthMethod(
user_id=self.__user.id, param=param, value=value, auth_method=self.__class__.get_auth_method_name()
)
assert param in self.__fields__, "You cant create auth_method which not daclared"
db.session.add(_method)
db.session.flush()
db.session.refresh(self.__user)
setattr(self, param, _method)
return _method

async def bulk_create(self, map: dict[str, str]) -> list[AuthMethod]:
"""Создает несколько AuthMethod'ов по мапе param-value,
auth_method берется из self.__auth_method__

Args:
map: dict[str, str] - словарь, по которому будуут создаваться AuthMthods

Returns:
list[AuthMethod] - созданные методы

Raises:
AssertionError - если ключи словаря не нахяодятся в ___fields__

AlreadyExists - если метод по такому ключу уже существует

Пример:
```
user.auth_method.email.bulk_create({"email": val1, "salt": val2})
```
"""
for k in map.keys():
assert k in self.__fields__, "You cant create auth_method which not declared in __fields__"
if (attr := getattr(self, k)) and getattr(attr, "is_deleted") is not True:
raise AlreadyExists(AuthMethod, attr.id)
methods: list[AuthMethod] = []
for k, v in map.items():
methods.append(
method := AuthMethod(
user_id=self.__user.id, param=k, value=v, auth_method=self.__class__.get_auth_method_name()
)
)
db.session.add(method)
db.session.flush()
db.session.refresh(self.__user)
return methods

def __bool__(self) -> bool:
"""Определен ли для польщователя этот метод аутентификации
Args:
None
Returns:
Если у юзера удалено/не определено хотя бы одно из полей из
__required_fields__ -> False, иначе True

"""
for field in self.__required_fields__:
if not getattr(self, field):
return False
return True

@classmethod
def get_auth_method_name(cls) -> str:
"""Имя соответствующего метода аутентфикации

Args:
None

Returns:
Имя метода аутентификации, к которому
приилагается данный класс
"""
return re.sub(r"(?<!^)(?=[A-Z])", "_", cls.__auth_method__).lower()


class AuthMethodMeta(metaclass=ABCMeta):
router: APIRouter
prefix: str
tags: list[str] = []

fields: type[AuthMethodMeta] = MethodMeta

@classmethod
def get_name(cls) -> str:
return re.sub(r"(?<!^)(?=[A-Z])", "_", cls.__name__).lower()
Expand Down Expand Up @@ -225,7 +88,7 @@ def generate_kafka_key(user_id: int) -> UserLoginKey:

@staticmethod
async def _create_session(
user: User, scopes_list_names: list[TypeScope] | None, session_name: str = None, *, db_session: DbSession
user: User, scopes_list_names: list[TypeScope] | None, session_name: str | None = None, *, db_session: DbSession
) -> Session:
"""Создает сессию пользователя"""
return await create_session(user, scopes_list_names, db_session=db_session, session_name=session_name)
Expand Down
Loading