infrasynth-backend-kit/infrasynth/webhooks/views.py
2026-08-28 14:38:47 -05:00

101 lines
3.1 KiB
Python

from rest_framework import status, viewsets
from rest_framework.permissions import AllowAny, IsAuthenticated
from rest_framework.response import Response
from .filters import (
InboundEndpointFilter,
InboundEventFilter,
OutboundDeliveryFilter,
OutboundEndpointFilter,
OutboundSubscriptionFilter,
)
from .models import (
InboundEndpoint,
InboundEvent,
OutboundDelivery,
OutboundEndpoint,
OutboundSubscription,
)
from .serializers import (
InboundEndpointSerializer,
InboundEventSerializer,
InboundReceiveSerializer,
OutboundDeliverySerializer,
OutboundEndpointSerializer,
OutboundSubscriptionSerializer,
)
from .signals import inbound_event_received
class OutboundEndpointViewSet(viewsets.ModelViewSet):
queryset = OutboundEndpoint.objects.all()
serializer_class = OutboundEndpointSerializer
permission_classes = [IsAuthenticated]
filterset_class = OutboundEndpointFilter
search_fields = ["name"]
class OutboundSubscriptionViewSet(viewsets.ModelViewSet):
queryset = OutboundSubscription.objects.select_related("endpoint").all()
serializer_class = OutboundSubscriptionSerializer
permission_classes = [IsAuthenticated]
filterset_class = OutboundSubscriptionFilter
search_fields = ["event_name"]
class OutboundDeliveryViewSet(viewsets.ReadOnlyModelViewSet):
queryset = OutboundDelivery.objects.select_related("subscription__endpoint").all()
serializer_class = OutboundDeliverySerializer
permission_classes = [IsAuthenticated]
filterset_class = OutboundDeliveryFilter
class InboundEndpointViewSet(viewsets.ModelViewSet):
queryset = InboundEndpoint.objects.all()
serializer_class = InboundEndpointSerializer
permission_classes = [IsAuthenticated]
filterset_class = InboundEndpointFilter
search_fields = ["name", "slug"]
class InboundEventViewSet(viewsets.ReadOnlyModelViewSet):
queryset = InboundEvent.objects.select_related("endpoint").all()
serializer_class = InboundEventSerializer
permission_classes = [IsAuthenticated]
filterset_class = InboundEventFilter
class InboundReceiveView(viewsets.ViewSet):
permission_classes = [AllowAny]
def create(self, request, slug=None):
serializer = InboundReceiveSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
try:
endpoint = InboundEndpoint.objects.get(slug=slug, is_active=True)
except InboundEndpoint.DoesNotExist:
return Response({"detail": "Endpoint not found"}, status=status.HTTP_404_NOT_FOUND)
payload = serializer.validated_data["payload"]
headers = serializer.validated_data["headers"]
event_type = headers.get("X-Event-Type", "unknown")
event = InboundEvent.objects.create(
endpoint=endpoint,
event_type=event_type,
raw_payload=payload,
)
inbound_event_received.send(
sender=InboundReceiveView,
event=event,
payload=payload,
headers=headers,
)
return Response(
InboundEventSerializer(event).data,
status=status.HTTP_201_CREATED,
)