from drf_spectacular.utils import extend_schema from rest_framework import status from rest_framework.permissions import AllowAny from rest_framework.response import Response from rest_framework.views import APIView from apps.contacts.api.serializers import ( ContactSubmissionCreateSerializer, ContactSubmissionResponseSerializer, ) from apps.contacts.api.throttles import ContactSubmissionThrottle def _get_client_ip(request): forwarded_for = request.META.get("HTTP_X_FORWARDED_FOR") if forwarded_for: return forwarded_for.split(",")[0].strip() return request.META.get("REMOTE_ADDR") class ContactSubmissionView(APIView): permission_classes = (AllowAny,) throttle_classes = (ContactSubmissionThrottle,) serializer_class = ContactSubmissionCreateSerializer @extend_schema( request=ContactSubmissionCreateSerializer, responses={201: ContactSubmissionResponseSerializer}, ) def post(self, request): serializer = self.serializer_class(data=request.data) serializer.is_valid(raise_exception=True) submission = serializer.save( ip_address=_get_client_ip(request), user_agent=request.META.get("HTTP_USER_AGENT", ""), ) return Response( ContactSubmissionResponseSerializer(submission).data, status=status.HTTP_201_CREATED, )