114 lines
4.4 KiB
Python
114 lines
4.4 KiB
Python
from typing import Any, Optional
|
||
from rest_framework import serializers
|
||
from django.conf import settings
|
||
from api.types import User
|
||
|
||
class UserResponseSerializer(serializers.Serializer):
|
||
id = serializers.IntegerField(read_only=True)
|
||
email = serializers.EmailField(read_only=True)
|
||
account_type = serializers.CharField(
|
||
source='userprofile.account_type',
|
||
read_only=True
|
||
)
|
||
name = serializers.CharField(source='first_name', read_only=True)
|
||
surname = serializers.CharField(source='last_name', read_only=True)
|
||
imageURL = serializers.SerializerMethodField()
|
||
uuid = serializers.SerializerMethodField()
|
||
|
||
class Meta:
|
||
ref_name = "UserResponse" # для OpenAPI
|
||
|
||
def get_uuid(self, obj: User) -> Optional[str]:
|
||
"""Получает короткий UUID (первые 6 символов) из профиля пользователя"""
|
||
return obj.userprofile.short_uuid if hasattr(obj, 'userprofile') else None
|
||
|
||
def get_imageURL(self, obj: User) -> Optional[str]:
|
||
"""Получает полный URL для изображения профиля пользователя"""
|
||
try:
|
||
if not hasattr(obj, 'userprofile') or not obj.userprofile.imageURL:
|
||
return None
|
||
|
||
relative_url = obj.userprofile.imageURL.lstrip('/')
|
||
base_url = settings.BASE_URL.rstrip('/')
|
||
return f"{base_url}/{relative_url}"
|
||
except Exception:
|
||
return None
|
||
|
||
def to_representation(self, instance: User) -> dict[str, Any]:
|
||
"""Переопределяется для добавления проверки типа для вывода"""
|
||
data = super().to_representation(instance)
|
||
return {
|
||
'id': data['id'], # int
|
||
'email': data['email'], # str
|
||
'account_type': data['account_type'], # AccountTypeLiteral
|
||
'name': data['name'], # str
|
||
'surname': data['surname'], # str
|
||
'imageURL': data['imageURL'], # Optional[str]
|
||
'uuid': data['uuid'], # Optional[str]
|
||
}
|
||
|
||
|
||
class LoginRequestSerializer(serializers.Serializer):
|
||
"""Сериализатор для запроса авторизации"""
|
||
login = serializers.CharField(
|
||
help_text="Логин пользователя",
|
||
required=True
|
||
)
|
||
password = serializers.CharField(
|
||
help_text="Пароль пользователя",
|
||
write_only=True,
|
||
required=True,
|
||
style={'input_type': 'password'}
|
||
)
|
||
|
||
|
||
class LoginResponseSerializer(serializers.Serializer):
|
||
"""Сериализатор для ответа при успешной авторизации"""
|
||
message = serializers.CharField(
|
||
help_text="Сообщение о успешной авторизации",
|
||
read_only=True
|
||
)
|
||
access = serializers.CharField(
|
||
help_text="JWT access token для авторизации запросов",
|
||
read_only=True
|
||
)
|
||
refresh = serializers.CharField(
|
||
help_text="JWT refresh token для обновления access token",
|
||
read_only=True
|
||
)
|
||
user = UserResponseSerializer(
|
||
help_text="Данные авторизованного пользователя",
|
||
read_only=True
|
||
)
|
||
|
||
|
||
class LogoutResponseSerializer(serializers.Serializer):
|
||
"""Сериализатор для ответа при выходе из системы"""
|
||
message = serializers.CharField(
|
||
help_text="Сообщение о успешном выходе",
|
||
read_only=True
|
||
)
|
||
|
||
|
||
class RefreshTokenRequestSerializer(serializers.Serializer):
|
||
"""Сериализатор для запроса обновления токена"""
|
||
refresh = serializers.CharField(
|
||
help_text="Refresh token для обновления",
|
||
required=True
|
||
)
|
||
|
||
|
||
class RefreshTokenResponseSerializer(serializers.Serializer):
|
||
"""Сериализатор для ответа с обновленными токенами"""
|
||
access = serializers.CharField(
|
||
help_text="Новый JWT access token",
|
||
read_only=True
|
||
)
|
||
refresh = serializers.CharField(
|
||
help_text="Новый JWT refresh token",
|
||
read_only=True
|
||
)
|
||
expires_at = serializers.FloatField(
|
||
help_text="Timestamp времени истечения access token",
|
||
read_only=True
|
||
) |