"""站内通知接口(契约 1.34)。""" from __future__ import annotations from flask import request from dms.api.v1.blueprint import api_v1 from dms.common.errors import InvalidArgumentError from dms.common.response import success_response from dms.security.auth_context import get_auth_context from dms.security.decorators import bearer_auth_required from dms.services.notification_service import ( handle_notification, list_notifications, mark_all_read, unread_count, ) def _parse_notification_id(value: str) -> int: if not value.isdecimal() or int(value) <= 0: raise InvalidArgumentError("id必须是正整数形式的字符串ID") return int(value) def _parse_action(value: object) -> str: if not isinstance(value, str): raise InvalidArgumentError("请求体必须是JSON对象") return value @api_v1.get("/notifications") @bearer_auth_required def notifications(): return success_response(list_notifications(get_auth_context().user_id)) @api_v1.get("/notifications/unread-count") @bearer_auth_required def notification_unread_count(): return success_response(unread_count(get_auth_context().user_id)) @api_v1.post("/notifications/read-all") @bearer_auth_required def notification_read_all(): return success_response(mark_all_read(get_auth_context().user_id)) @api_v1.post("/notifications//handle") @bearer_auth_required def notification_handle(id: str): if not request.is_json: raise InvalidArgumentError("请求体必须是JSON对象") body = request.get_json(silent=True) if not isinstance(body, dict): raise InvalidArgumentError("请求体必须是JSON对象") return success_response( handle_notification( get_auth_context().user_id, _parse_notification_id(id), _parse_action(body.get("action")), ) )