diff --git a/core/serializers.py b/core/serializers.py index bcc89c9..cf1dcf8 100644 --- a/core/serializers.py +++ b/core/serializers.py @@ -1,6 +1,6 @@ from django.conf import settings from rest_framework import exceptions as rest_exceptions -from rest_framework import serializers +from rest_framework import generics, serializers from . import exceptions, models from .service import CoreService @@ -219,3 +219,18 @@ def save(self, **kwargs): data = OfferSerializer(offer).data return data + + +class CancelOfferSerializer(serializers.Serializer): + offer = serializers.UUIDField + + def validate(self, attrs): + user = self.context["user"] + # check if the offer exist and it belongs + # to the user requesting the action + generics.get_object_or_404(models.Offer, id=attrs["offer"], user=user) + return attrs + + def save(self): + # delete the offer + CoreService.cancel_offer(self.validated_data["offer_id"]) diff --git a/core/service.py b/core/service.py index 6aedf83..14ceeee 100644 --- a/core/service.py +++ b/core/service.py @@ -108,3 +108,12 @@ def create_offer( offer.signature_unique_id = signature_unique_id offer.save() return offer + + @classmethod + def cancel_offer(cls, offer_id: str): + """ + Delete the offer + Args: + offer_id(str): The id of the offer + """ + models.Offer.objects.get(id=offer_id).delete() diff --git a/core/urls.py b/core/urls.py index 637414a..7642312 100644 --- a/core/urls.py +++ b/core/urls.py @@ -19,4 +19,5 @@ name="signin", ), path("offer/create/", views.OfferCreateAPIView.as_view(), name="create-offer"), + path("offer/cancel/", views.OfferCancelAPIView.as_view(), name="cancel-offer"), ] diff --git a/core/views.py b/core/views.py index 34e07bc..fd3602e 100644 --- a/core/views.py +++ b/core/views.py @@ -38,3 +38,15 @@ def post(self, request): serializer.is_valid(raise_exception=True) data = serializer.save() return Response(data, status=status.HTTP_201_CREATED) + + +class OfferCancelAPIView(GenericAPIView): + serializer_class = serializers.CancelOfferSerializer + permission_classes = [IsAuthenticated] + + def post(self, request): + user = request.user + serializer = self.serializer_class(data=request.data, context={"user": user}) + serializer.is_valid(raise_exception=True) + serializer.save() + return Response(status=status.HTTP_204_NO_CONTENT)