Skip to content

Commit b96db8a

Browse files
committed
feat: GET /notifications and /notifications/:id
1 parent 8b8e133 commit b96db8a

3 files changed

Lines changed: 42 additions & 0 deletions

File tree

src/api/notifications/__init__.py

Whitespace-only changes.

src/api/notifications/views.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from django.db.models import QuerySet
2+
from rest_framework.pagination import PageNumberPagination
3+
from rest_framework import serializers, viewsets
4+
from rest_framework.permissions import IsAuthenticated
5+
6+
from webview.models import Notification
7+
8+
9+
class NotificationSerializer(serializers.ModelSerializer):
10+
title = serializers.SerializerMethodField()
11+
12+
class Meta:
13+
model = Notification
14+
fields = ["id", "title", "is_read", "created_at"]
15+
16+
def get_title(self, obj: Notification) -> str:
17+
return obj.title
18+
19+
20+
class NotificationPagination(PageNumberPagination):
21+
page_size = 20
22+
page_size_query_param = "per_page"
23+
max_page_size = 100
24+
25+
26+
class NotificationViewSet(viewsets.ReadOnlyModelViewSet):
27+
permission_classes = [IsAuthenticated]
28+
serializer_class = NotificationSerializer
29+
30+
def get_queryset(
31+
self,
32+
) -> QuerySet[Notification]: # pyright: ignore[reportIncompatibleMethodOverride]
33+
return (
34+
Notification.objects.filter(user=self.request.user)
35+
.select_related(
36+
"suggestionnotification__suggestion__cve",
37+
)
38+
.select_subclasses()
39+
.order_by("-created_at")
40+
)

src/api/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44

55
from api.issues.views import NixpkgsIssueViewSet
66
from api.me import CurrentUserView
7+
from api.notifications.views import NotificationViewSet
78
from api.subscriptions.views import SubscriptionsViewSet
89
from api.suggestions.views import SuggestionViewSet
910

1011
v1_router = routers.DefaultRouter(trailing_slash=False)
1112
v1_router.register(r"issues", NixpkgsIssueViewSet)
13+
v1_router.register(r"notifications", NotificationViewSet)
1214
v1_router.register("suggestions", SuggestionViewSet)
1315
v1_router.register("subscriptions", SubscriptionsViewSet)
1416

0 commit comments

Comments
 (0)