repair-agent 88b8f023f4
Some checks failed
Build and Deploy Backend / build-and-deploy (push) Failing after 1m36s
Fix app api
2026-02-09 15:35:33 +08:00

88 lines
2.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
通知模块视图 - App端
"""
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated
from drf_spectacular.utils import extend_schema
from utils.response import success, error
from utils.exceptions import ErrorCode
from apps.admins.authentication import AppJWTAuthentication
from .models import Notification
from .serializers import NotificationSerializer
@extend_schema(tags=['通知'])
class NotificationViewSet(viewsets.ViewSet):
"""通知视图集App端"""
authentication_classes = [AppJWTAuthentication]
permission_classes = [IsAuthenticated]
def list(self, request):
"""
通知列表
GET /api/v1/notifications/
"""
queryset = Notification.objects.filter(user=request.user)
# 按类型筛选
ntype = request.query_params.get('type')
if ntype:
queryset = queryset.filter(type=ntype)
# 分页
page = int(request.query_params.get('page', 1))
page_size = int(request.query_params.get('page_size', 20))
start = (page - 1) * page_size
end = start + page_size
total = queryset.count()
unread_count = Notification.objects.filter(user=request.user, is_read=False).count()
notifications = queryset[start:end]
return success(data={
'total': total,
'unread_count': unread_count,
'items': NotificationSerializer(notifications, many=True).data,
})
def destroy(self, request, pk=None):
"""
删除通知
DELETE /api/v1/notifications/{id}/
"""
try:
notification = Notification.objects.get(id=pk, user=request.user)
except Notification.DoesNotExist:
return error(code=ErrorCode.NOTIFICATION_NOT_FOUND, message='通知不存在')
notification.delete()
return success(message='删除成功')
@action(detail=True, methods=['post'])
def read(self, request, pk=None):
"""
标记已读
POST /api/v1/notifications/{id}/read/
"""
try:
notification = Notification.objects.get(id=pk, user=request.user)
except Notification.DoesNotExist:
return error(code=ErrorCode.NOTIFICATION_NOT_FOUND, message='通知不存在')
notification.is_read = True
notification.save(update_fields=['is_read'])
return success(message='已标记为已读')
@action(detail=False, methods=['post'], url_path='read-all')
def read_all(self, request):
"""
全部已读
POST /api/v1/notifications/read-all/
"""
count = Notification.objects.filter(
user=request.user, is_read=False
).update(is_read=True)
return success(data={'count': count}, message=f'已将{count}条通知标记为已读')