From 4593ed024ecd6be3b244cadcb15e9ffd2c4ed271 Mon Sep 17 00:00:00 2001 From: mortezaei Date: Wed, 7 May 2025 11:51:39 +0330 Subject: [PATCH] fix: bookmark --- apps/bookmark/serializers/bookmark.py | 2 +- apps/bookmark/views/bookmark.py | 31 ++++++++++++++++++++++++--- apps/bookmark/views/rate.py | 27 +++++++++++++++++++---- 3 files changed, 52 insertions(+), 8 deletions(-) diff --git a/apps/bookmark/serializers/bookmark.py b/apps/bookmark/serializers/bookmark.py index ce4fefe..8a80666 100644 --- a/apps/bookmark/serializers/bookmark.py +++ b/apps/bookmark/serializers/bookmark.py @@ -10,7 +10,7 @@ class BookmarkSerializer(serializers.ModelSerializer): class Meta: model = Bookmark fields = ['id', 'user', 'service', 'content_id', 'status', 'created_at', 'updated_at'] - read_only_fields = ['id', 'created_at', 'updated_at', 'status'] + read_only_fields = ['id', 'created_at', 'updated_at', 'status', 'user'] def validate(self, data): """ diff --git a/apps/bookmark/views/bookmark.py b/apps/bookmark/views/bookmark.py index a624165..837f575 100644 --- a/apps/bookmark/views/bookmark.py +++ b/apps/bookmark/views/bookmark.py @@ -4,6 +4,7 @@ from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated from rest_framework.generics import CreateAPIView, DestroyAPIView from rest_framework.exceptions import ValidationError +from drf_yasg.utils import swagger_auto_schema from apps.bookmark.models import Bookmark from apps.bookmark.serializers import BookmarkSerializer @@ -16,7 +17,16 @@ class AddBookmarkView(CreateAPIView): """ permission_classes = [IsAuthenticated] serializer_class = BookmarkSerializer - + + @swagger_auto_schema( + operation_description="Add a bookmark for a specific content in a service. If the bookmark already exists but is inactive, it will be reactivated.", + request_body=BookmarkSerializer, + responses={ + 201: "Bookmark created successfully.", + 200: "Bookmark reactivated or already active.", + 400: "Invalid input." + } + ) def create(self, request, *args, **kwargs): service = request.data.get('service') content_id = request.data.get('content_id') @@ -66,7 +76,16 @@ class RemoveBookmarkView(DestroyAPIView): """ permission_classes = [IsAuthenticated] serializer_class = BookmarkSerializer - + + @swagger_auto_schema( + operation_description="Deactivate a bookmark by setting its status to False using content_id and user.", + request_body=BookmarkSerializer, + responses={ + 204: "Bookmark deactivated successfully.", + 400: "Invalid input.", + 404: "Bookmark not found or already inactive." + } + ) def get_object(self): service = self.request.data.get('service') content_id = self.request.data.get('content_id') @@ -98,7 +117,13 @@ class BookmarkStatusView(APIView): Return the count of bookmarks for each service for the current user. """ permission_classes = [IsAuthenticated] - + + @swagger_auto_schema( + operation_description="Return the count of bookmarks for each service for the current user.", + responses={ + 200: "A list of bookmark counts for each service.", + } + ) def get(self, request): # Get all active bookmarks for the current user user_bookmarks = Bookmark.objects.filter( diff --git a/apps/bookmark/views/rate.py b/apps/bookmark/views/rate.py index b79500f..fa0ab4d 100644 --- a/apps/bookmark/views/rate.py +++ b/apps/bookmark/views/rate.py @@ -4,13 +4,23 @@ from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated from apps.bookmark.models import Rate from apps.bookmark.serializers import RateSerializer, RateStatusSerializer, AverageRateSerializer +from drf_yasg import openapi +from drf_yasg.utils import swagger_auto_schema class AddRateView(APIView): """ API view for adding or updating a rate. """ permission_classes = [IsAuthenticated] - + + @swagger_auto_schema( + operation_description="Add or update a rate for a content.", + request_body=RateSerializer, + responses={ + 201: "Rate created successfully.", + 400: "Invalid input." + } + ) def post(self, request): """ Add or update a rate for a content. @@ -26,7 +36,16 @@ class RemoveRateView(APIView): API view for removing a rate. """ permission_classes = [IsAuthenticated] - + + @swagger_auto_schema( + operation_description="Remove a rate by setting its status to False.", + request_body=RateStatusSerializer, + responses={ + 200: "Rate removed successfully.", + 404: "Rate not found.", + 400: "Invalid input." + } + ) def post(self, request): """ Remove a rate by setting its status to False. @@ -35,7 +54,7 @@ class RemoveRateView(APIView): if serializer.is_valid(): service = serializer.validated_data['service'] content_id = serializer.validated_data['content_id'] - + try: rate = Rate.objects.get( user=request.user, @@ -47,7 +66,7 @@ class RemoveRateView(APIView): return Response({'message': 'Rate removed successfully'}, status=status.HTTP_200_OK) except Rate.DoesNotExist: return Response({'message': 'Rate not found'}, status=status.HTTP_404_NOT_FOUND) - + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) class RateStatusView(APIView):