Align frontend API contracts
This commit is contained in:
@@ -5,6 +5,7 @@ from django.contrib.auth import get_user_model
|
||||
from django.contrib.auth.models import Group
|
||||
from django.db import transaction
|
||||
from django.db.models import F, Q
|
||||
from rest_framework_simplejwt.token_blacklist.models import BlacklistedToken, OutstandingToken
|
||||
from rest_framework_simplejwt.tokens import RefreshToken
|
||||
|
||||
from .models import Profile
|
||||
@@ -53,12 +54,21 @@ class UserService:
|
||||
ValidationError: При некорректных данных
|
||||
"""
|
||||
role = role or cls.ROLE_USER
|
||||
first_name = extra_fields.pop("first_name", None)
|
||||
middle_name = extra_fields.pop("middle_name", None)
|
||||
last_name = extra_fields.pop("last_name", None)
|
||||
with transaction.atomic():
|
||||
user = User.objects.create_user(
|
||||
email=email, username=username, password=password, **extra_fields
|
||||
)
|
||||
cls.assign_role(user, role)
|
||||
return user
|
||||
cls._update_or_create_profile(
|
||||
user=user,
|
||||
first_name=first_name or user.username,
|
||||
middle_name=middle_name or "",
|
||||
last_name=last_name or user.username,
|
||||
)
|
||||
return cls.get_users_queryset().get(id=user.id)
|
||||
|
||||
@classmethod
|
||||
def get_users_queryset(cls):
|
||||
@@ -218,13 +228,10 @@ class UserService:
|
||||
username=username,
|
||||
password=password,
|
||||
role=role,
|
||||
**extra_fields,
|
||||
)
|
||||
cls._update_or_create_profile(
|
||||
user=user,
|
||||
first_name=first_name,
|
||||
middle_name=middle_name,
|
||||
last_name=last_name,
|
||||
**extra_fields,
|
||||
)
|
||||
return cls.get_users_queryset().get(id=user.id)
|
||||
|
||||
@@ -304,6 +311,16 @@ class UserService:
|
||||
"access": str(refresh.access_token),
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def logout_user(cls, user: User) -> int:
|
||||
"""Отзывает все активные refresh-токены пользователя."""
|
||||
outstanding_tokens = OutstandingToken.objects.filter(user=user)
|
||||
revoked_count = 0
|
||||
for token in outstanding_tokens:
|
||||
_, created = BlacklistedToken.objects.get_or_create(token=token)
|
||||
revoked_count += int(created)
|
||||
return revoked_count
|
||||
|
||||
@classmethod
|
||||
def ensure_role_groups(cls) -> dict[str, Group]:
|
||||
"""Гарантирует существование системных role-групп."""
|
||||
|
||||
Reference in New Issue
Block a user