feat(events): add cursor infinite event feed

This commit is contained in:
2026-06-21 02:35:13 +03:30
parent 563d6ee238
commit 0c15fbfbd2
7 changed files with 170 additions and 36 deletions

View File

@@ -1,6 +1,7 @@
from django.db import connection
from rest_framework import generics, status
from rest_framework.exceptions import NotFound, ValidationError
from rest_framework.pagination import CursorPagination
from rest_framework.response import Response
from rest_framework.views import APIView
@@ -9,6 +10,13 @@ from jobs.serializers import JobCreateSerializer, JobEventSerializer, JobSeriali
from jobs.services import create_job, job_stats, retry_failed_job
class JobEventCursorPagination(CursorPagination):
page_size = 50
page_size_query_param = "limit"
max_page_size = 200
ordering = "-id"
class HealthAPIView(APIView):
def get(self, request):
try:
@@ -63,21 +71,17 @@ class JobEventsAPIView(APIView):
class GlobalJobEventsAPIView(APIView):
def get(self, request):
queryset = JobEvent.objects.order_by("id")
after_id = request.query_params.get("after_id")
queryset = JobEvent.objects.order_by("-id")
event_type = request.query_params.get("type")
job_id = request.query_params.get("job_id")
if after_id:
queryset = queryset.filter(id__gt=after_id)
if event_type:
queryset = queryset.filter(type=event_type)
if job_id:
queryset = queryset.filter(job_id=job_id)
try:
limit = min(int(request.query_params.get("limit", "100")), 500)
except ValueError as exc:
raise ValidationError({"limit": "Must be an integer."}) from exc
return Response(JobEventSerializer(queryset[:limit], many=True).data)
paginator = JobEventCursorPagination()
page = paginator.paginate_queryset(queryset, request, view=self)
return paginator.get_paginated_response(JobEventSerializer(page, many=True).data)
class JobStatsAPIView(APIView):