Align frontend API contracts

This commit is contained in:
2026-03-22 13:21:02 +01:00
parent 0da5b4abe2
commit e639b3c792
35 changed files with 1362 additions and 205 deletions

View File

@@ -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-групп."""