feat(api): полное API для всех парсеров с документацией

This commit is contained in:
2026-02-01 15:19:21 +01:00
parent eacb1527c4
commit efa5c3ae34
8 changed files with 840 additions and 141 deletions

View File

@@ -13,6 +13,7 @@ from typing import Any
from django.conf import settings
from django.db import connection
from drf_yasg.utils import swagger_auto_schema
from rest_framework import status
from rest_framework.permissions import AllowAny
from rest_framework.request import Request
@@ -21,29 +22,29 @@ from rest_framework.views import APIView
logger = logging.getLogger(__name__)
# Swagger теги
HEALTH_TAG = "Мониторинг"
JOBS_TAG = "Фоновые задачи"
class HealthCheckView(APIView):
"""
Comprehensive health check endpoint.
Комплексная проверка состояния системы.
GET /api/health/
Returns detailed status of all dependencies.
Response:
{
"status": "healthy" | "degraded" | "unhealthy",
"version": "1.0.0",
"checks": {
"database": {"status": "up", "latency_ms": 5},
"redis": {"status": "up", "latency_ms": 2},
"celery": {"status": "up"}
}
}
Возвращает статус всех зависимостей (БД, Redis, Celery).
"""
permission_classes = [AllowAny]
authentication_classes = [] # No auth required
@swagger_auto_schema(
tags=[HEALTH_TAG],
operation_summary="Проверка состояния",
operation_description=(
"Комплексная проверка всех зависимостей системы.\n"
"Возвращает статус: healthy, degraded или unhealthy."
),
)
def get(self, request: Request) -> Response:
"""Run all health checks and return status."""
checks = {}
@@ -131,15 +132,19 @@ class HealthCheckView(APIView):
class LivenessView(APIView):
"""
Kubernetes liveness probe endpoint.
Kubernetes liveness probe.
GET /api/health/live/
Returns 200 if the application is running.
Проверяет, запущено ли приложение.
"""
permission_classes = [AllowAny]
authentication_classes = []
@swagger_auto_schema(
tags=[HEALTH_TAG],
operation_summary="Liveness probe",
operation_description="Возвращает 200 если приложение запущено.",
)
def get(self, request: Request) -> Response:
"""Simple liveness check."""
return Response({"status": "alive"}, status=status.HTTP_200_OK)
@@ -147,15 +152,21 @@ class LivenessView(APIView):
class ReadinessView(APIView):
"""
Kubernetes readiness probe endpoint.
Kubernetes readiness probe.
GET /api/health/ready/
Returns 200 if the application is ready to serve traffic.
Проверяет, готово ли приложение обрабатывать запросы.
"""
permission_classes = [AllowAny]
authentication_classes = []
@swagger_auto_schema(
tags=[HEALTH_TAG],
operation_summary="Readiness probe",
operation_description=(
"Возвращает 200 если приложение готово обрабатывать запросы."
),
)
def get(self, request: Request) -> Response:
"""Check if app is ready to serve traffic."""
# Check database connection
@@ -177,26 +188,21 @@ class BackgroundJobStatusView(APIView):
"""
Получение статуса фоновой задачи.
GET /api/v1/jobs/{task_id}/
Возвращает статус, прогресс и результат задачи.
Response:
{
"id": "uuid",
"task_id": "celery-task-id",
"status": "pending|started|success|failure|revoked",
"progress": 75,
"progress_message": "Обработка данных...",
"result": {...},
"error": "",
"is_finished": false
}
"""
from rest_framework.permissions import IsAuthenticated
permission_classes = [IsAuthenticated]
@swagger_auto_schema(
tags=[JOBS_TAG],
operation_summary="Статус задачи",
operation_description=(
"Возвращает статус конкретной фоновой задачи.\n"
"Доступно только владельцу задачи или администратору."
),
)
def get(self, request: Request, task_id: str) -> Response:
"""Получить статус задачи по task_id."""
from apps.core.serializers import BackgroundJobSerializer
@@ -219,18 +225,21 @@ class BackgroundJobListView(APIView):
"""
Список фоновых задач пользователя.
GET /api/v1/jobs/
Возвращает список задач текущего пользователя.
Query params:
status: Фильтр по статусу (pending, started, success, failure)
limit: Количество записей (по умолчанию 50)
Возвращает список задач текущего пользователя с фильтрацией.
"""
from rest_framework.permissions import IsAuthenticated
permission_classes = [IsAuthenticated]
@swagger_auto_schema(
tags=[JOBS_TAG],
operation_summary="Список задач",
operation_description=(
"Возвращает список фоновых задач текущего пользователя.\n"
"Поддерживает фильтрацию по статусу (status) и лимит (limit)."
),
)
def get(self, request: Request) -> Response:
"""Получить список задач пользователя."""
from apps.core.serializers import BackgroundJobListSerializer