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, )