from rest_framework import status from rest_framework.views import APIView 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 class AddRateView(APIView): """ API view for adding or updating a rate. """ permission_classes = [IsAuthenticated] def post(self, request): """ Add or update a rate for a content. """ serializer = RateSerializer(data=request.data, context={'request': request}) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) class RemoveRateView(APIView): """ API view for removing a rate. """ permission_classes = [IsAuthenticated] def post(self, request): """ Remove a rate by setting its status to False. """ serializer = RateStatusSerializer(data=request.data) if serializer.is_valid(): service = serializer.validated_data['service'] content_id = serializer.validated_data['content_id'] try: rate = Rate.objects.get( user=request.user, service=service, content_id=content_id ) rate.status = False rate.save() 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): """ API view for checking if a user has rated a content and getting the rate value. """ permission_classes = [IsAuthenticated] def post(self, request): """ Check if a user has rated a content and get the rate value. """ serializer = RateStatusSerializer(data=request.data) if serializer.is_valid(): service = serializer.validated_data['service'] content_id = serializer.validated_data['content_id'] rate_info = Rate.get_user_rate(request.user, service, content_id) return Response(rate_info, status=status.HTTP_200_OK) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) class AverageRateView(APIView): """ API view for getting the average rate of a content. """ def post(self, request): """ Get the average rate of a content. """ serializer = AverageRateSerializer(data=request.data) if serializer.is_valid(): service = serializer.validated_data['service'] content_id = serializer.validated_data['content_id'] avg_rate = Rate.get_average_rate(service, content_id) return Response({'average_rate': avg_rate}, status=status.HTTP_200_OK) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)