| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- """站内通知接口(契约 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/<id>/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")),
- )
- )
|