feat(api): полное API для всех парсеров с документацией
This commit is contained in:
@@ -20,14 +20,26 @@ from .serializers import (
|
||||
)
|
||||
from .services import ProfileService, UserService
|
||||
|
||||
# Swagger теги для группировки
|
||||
AUTH_TAG = "Аутентификация"
|
||||
USER_TAG = "Пользователь"
|
||||
|
||||
|
||||
class RegisterView(APIView):
|
||||
"""Регистрация нового пользователя"""
|
||||
"""
|
||||
Регистрация нового пользователя.
|
||||
|
||||
Создаёт учётную запись и возвращает JWT токены.
|
||||
"""
|
||||
|
||||
permission_classes = [AllowAny]
|
||||
|
||||
@swagger_auto_schema(
|
||||
request_body=UserRegistrationSerializer, responses={201: UserSerializer}
|
||||
tags=[AUTH_TAG],
|
||||
operation_summary="Регистрация",
|
||||
operation_description="Создание новой учётной записи пользователя.",
|
||||
request_body=UserRegistrationSerializer,
|
||||
responses={201: UserSerializer},
|
||||
)
|
||||
def post(self, request):
|
||||
serializer = UserRegistrationSerializer(data=request.data)
|
||||
@@ -49,11 +61,21 @@ class RegisterView(APIView):
|
||||
|
||||
|
||||
class LoginView(APIView):
|
||||
"""Вход пользователя"""
|
||||
"""
|
||||
Вход пользователя.
|
||||
|
||||
Возвращает access и refresh токены для авторизации.
|
||||
"""
|
||||
|
||||
permission_classes = [AllowAny]
|
||||
|
||||
@swagger_auto_schema(request_body=LoginSerializer, responses={200: TokenSerializer})
|
||||
@swagger_auto_schema(
|
||||
tags=[AUTH_TAG],
|
||||
operation_summary="Вход",
|
||||
operation_description="Аутентификация по email и паролю. Возвращает JWT токены.",
|
||||
request_body=LoginSerializer,
|
||||
responses={200: TokenSerializer},
|
||||
)
|
||||
def post(self, request):
|
||||
serializer = LoginSerializer(data=request.data)
|
||||
if serializer.is_valid():
|
||||
@@ -74,20 +96,18 @@ class LoginView(APIView):
|
||||
|
||||
|
||||
class LogoutView(APIView):
|
||||
"""Выход пользователя"""
|
||||
"""
|
||||
Выход пользователя.
|
||||
|
||||
Добавляет refresh токен в черный список (при наличии).
|
||||
"""
|
||||
|
||||
permission_classes = [IsAuthenticated]
|
||||
|
||||
@swagger_auto_schema(
|
||||
manual_parameters=[
|
||||
openapi.Parameter(
|
||||
"Authorization",
|
||||
openapi.IN_HEADER,
|
||||
description="Bearer <token>",
|
||||
type=openapi.TYPE_STRING,
|
||||
required=True,
|
||||
)
|
||||
],
|
||||
tags=[AUTH_TAG],
|
||||
operation_summary="Выход",
|
||||
operation_description="Инвалидация refresh токена.",
|
||||
responses={200: "Успешный выход"},
|
||||
)
|
||||
def post(self, request):
|
||||
@@ -104,20 +124,14 @@ class LogoutView(APIView):
|
||||
|
||||
|
||||
class CurrentUserView(APIView):
|
||||
"""Получение данных текущего пользователя"""
|
||||
"""Получение данных текущего пользователя."""
|
||||
|
||||
permission_classes = [IsAuthenticated]
|
||||
|
||||
@swagger_auto_schema(
|
||||
manual_parameters=[
|
||||
openapi.Parameter(
|
||||
"Authorization",
|
||||
openapi.IN_HEADER,
|
||||
description="Bearer <token>",
|
||||
type=openapi.TYPE_STRING,
|
||||
required=True,
|
||||
)
|
||||
],
|
||||
tags=[USER_TAG],
|
||||
operation_summary="Текущий пользователь",
|
||||
operation_description="Возвращает данные авторизованного пользователя.",
|
||||
responses={200: UserSerializer},
|
||||
)
|
||||
def get(self, request):
|
||||
@@ -126,21 +140,15 @@ class CurrentUserView(APIView):
|
||||
|
||||
|
||||
class UserUpdateView(APIView):
|
||||
"""Обновление данных пользователя"""
|
||||
"""Обновление данных пользователя."""
|
||||
|
||||
permission_classes = [IsAuthenticated]
|
||||
|
||||
@swagger_auto_schema(
|
||||
tags=[USER_TAG],
|
||||
operation_summary="Обновить данные",
|
||||
operation_description="Частичное обновление данных пользователя.",
|
||||
request_body=UserUpdateSerializer,
|
||||
manual_parameters=[
|
||||
openapi.Parameter(
|
||||
"Authorization",
|
||||
openapi.IN_HEADER,
|
||||
description="Bearer <token>",
|
||||
type=openapi.TYPE_STRING,
|
||||
required=True,
|
||||
)
|
||||
],
|
||||
responses={200: UserSerializer},
|
||||
)
|
||||
def patch(self, request):
|
||||
@@ -153,7 +161,7 @@ class UserUpdateView(APIView):
|
||||
|
||||
|
||||
class ProfileDetailView(generics.RetrieveUpdateAPIView):
|
||||
"""Получение и обновление профиля пользователя"""
|
||||
"""Получение и обновление профиля пользователя."""
|
||||
|
||||
permission_classes = [IsAuthenticated]
|
||||
serializer_class = ProfileUpdateSerializer
|
||||
@@ -168,15 +176,9 @@ class ProfileDetailView(generics.RetrieveUpdateAPIView):
|
||||
return profile
|
||||
|
||||
@swagger_auto_schema(
|
||||
manual_parameters=[
|
||||
openapi.Parameter(
|
||||
"Authorization",
|
||||
openapi.IN_HEADER,
|
||||
description="Bearer <token>",
|
||||
type=openapi.TYPE_STRING,
|
||||
required=True,
|
||||
)
|
||||
]
|
||||
tags=[USER_TAG],
|
||||
operation_summary="Получить профиль",
|
||||
operation_description="Возвращает профиль текущего пользователя.",
|
||||
)
|
||||
def get(self, request, *args, **kwargs):
|
||||
profile = self.get_object()
|
||||
@@ -184,16 +186,10 @@ class ProfileDetailView(generics.RetrieveUpdateAPIView):
|
||||
return Response(serializer.data)
|
||||
|
||||
@swagger_auto_schema(
|
||||
tags=[USER_TAG],
|
||||
operation_summary="Обновить профиль",
|
||||
operation_description="Частичное обновление профиля пользователя.",
|
||||
request_body=ProfileUpdateSerializer,
|
||||
manual_parameters=[
|
||||
openapi.Parameter(
|
||||
"Authorization",
|
||||
openapi.IN_HEADER,
|
||||
description="Bearer <token>",
|
||||
type=openapi.TYPE_STRING,
|
||||
required=True,
|
||||
)
|
||||
],
|
||||
)
|
||||
def patch(self, request, *args, **kwargs):
|
||||
profile = self.get_object()
|
||||
@@ -207,21 +203,15 @@ class ProfileDetailView(generics.RetrieveUpdateAPIView):
|
||||
|
||||
|
||||
class PasswordChangeView(APIView):
|
||||
"""Смена пароля"""
|
||||
"""Смена пароля пользователя."""
|
||||
|
||||
permission_classes = [IsAuthenticated]
|
||||
|
||||
@swagger_auto_schema(
|
||||
tags=[USER_TAG],
|
||||
operation_summary="Сменить пароль",
|
||||
operation_description="Смена пароля. Требуется текущий пароль для подтверждения.",
|
||||
request_body=PasswordChangeSerializer,
|
||||
manual_parameters=[
|
||||
openapi.Parameter(
|
||||
"Authorization",
|
||||
openapi.IN_HEADER,
|
||||
description="Bearer <token>",
|
||||
type=openapi.TYPE_STRING,
|
||||
required=True,
|
||||
)
|
||||
],
|
||||
responses={200: "Пароль успешно изменен"},
|
||||
)
|
||||
def post(self, request):
|
||||
@@ -246,20 +236,29 @@ class PasswordChangeView(APIView):
|
||||
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
@swagger_auto_schema(
|
||||
method="get",
|
||||
tags=[USER_TAG],
|
||||
operation_summary="Полный профиль",
|
||||
operation_description="Расширенная информация о пользователе и профиле.",
|
||||
)
|
||||
@api_view(["GET"])
|
||||
@permission_classes([IsAuthenticated])
|
||||
def user_profile_detail(request):
|
||||
"""Получение полных данных профиля пользователя"""
|
||||
"""Получение полных данных профиля пользователя."""
|
||||
profile_data = ProfileService.get_full_profile_data(request.user.id)
|
||||
return Response(profile_data)
|
||||
|
||||
|
||||
class TokenRefreshView(APIView):
|
||||
"""Обновление access токена через refresh токен"""
|
||||
"""Обновление access токена через refresh токен."""
|
||||
|
||||
permission_classes = [AllowAny]
|
||||
|
||||
@swagger_auto_schema(
|
||||
tags=[AUTH_TAG],
|
||||
operation_summary="Обновить токен",
|
||||
operation_description="Получение нового access токена по refresh токену.",
|
||||
request_body=openapi.Schema(
|
||||
type=openapi.TYPE_OBJECT,
|
||||
properties={
|
||||
|
||||
Reference in New Issue
Block a user