diff --git a/apps/api/views.py b/apps/api/views.py index 049f5db..f93b8b2 100644 --- a/apps/api/views.py +++ b/apps/api/views.py @@ -11,6 +11,7 @@ from django.utils.decorators import method_decorator from django.core.files import File from django.core.files.base import ContentFile from django.core.files.temp import NamedTemporaryFile +from django.db.utils import IntegrityError from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status, permissions, filters, generics @@ -25,18 +26,37 @@ from .serializers import RssFeedSerializer, FeedChannelSerializer log = logging.getLogger(__name__) +class RSSFeedPagination(PageNumberPagination): + page_size = 10 + page_size_query_param = "page_size" + max_page_size = 25 + + class RSSFeedList(generics.ListAPIView, generics.CreateAPIView): authentication_classes = [SessionAuthentication, TokenAuthentication] permission_classes = [permissions.IsAuthenticated] + pagination_class = RSSFeedPagination serializer_class = RssFeedSerializer - queryset = RSSFeed.objects.all().order_by("-created_at") + queryset = RSSFeed.objects.all().order_by("created_at") filter_backends = [filters.SearchFilter, rest_filters.DjangoFilterBackend, filters.OrderingFilter] - filterset_fields = ["uuid", "name", "url", "created_at"] + filterset_fields = ["uuid", "name", "url", "discord_server_id", "created_at"] search_fields = ["name"] ordering_fields = ["created_at"] + def post(self, request): + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + + try: + self.perform_create(serializer) + except IntegrityError: + return Response({"detail": "RSS Feed name must be unique"}, status=status.HTTP_409_CONFLICT, exception=True) + + headers = self.get_success_headers(serializer.data) + return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) + class RSSFeedDetail(generics.RetrieveUpdateDestroyAPIView): authentication_classes = [SessionAuthentication, TokenAuthentication] @@ -46,14 +66,6 @@ class RSSFeedDetail(generics.RetrieveUpdateDestroyAPIView): serializer_class = RssFeedSerializer queryset = RSSFeed.objects.all().order_by("-created_at") - # def delete(self, request, uuid: str): - # try: - # rss_feed = RSSFeed.objects.get(uuid=uuid) - # rss_feed.delete() - # return Response(status=status.HTTP_204_NO_CONTENT) - # except RSSFeed.DoesNotExist: - # return Response({"detail": "RSSFeed Not Found"}, status.HTTP_404_NOT_FOUND) - class FeedChannelListApiView(generics.ListAPIView): authentication_classes = [SessionAuthentication, TokenAuthentication]