101 lines
3.1 KiB
Python
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,
|
|
)
|