notifications.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. """站内通知接口(契约 1.34)。"""
  2. from __future__ import annotations
  3. from flask import request
  4. from dms.api.v1.blueprint import api_v1
  5. from dms.common.errors import InvalidArgumentError
  6. from dms.common.response import success_response
  7. from dms.security.auth_context import get_auth_context
  8. from dms.security.decorators import bearer_auth_required
  9. from dms.services.notification_service import (
  10. handle_notification,
  11. list_notifications,
  12. mark_all_read,
  13. unread_count,
  14. )
  15. def _parse_notification_id(value: str) -> int:
  16. if not value.isdecimal() or int(value) <= 0:
  17. raise InvalidArgumentError("id必须是正整数形式的字符串ID")
  18. return int(value)
  19. def _parse_action(value: object) -> str:
  20. if not isinstance(value, str):
  21. raise InvalidArgumentError("请求体必须是JSON对象")
  22. return value
  23. @api_v1.get("/notifications")
  24. @bearer_auth_required
  25. def notifications():
  26. return success_response(list_notifications(get_auth_context().user_id))
  27. @api_v1.get("/notifications/unread-count")
  28. @bearer_auth_required
  29. def notification_unread_count():
  30. return success_response(unread_count(get_auth_context().user_id))
  31. @api_v1.post("/notifications/read-all")
  32. @bearer_auth_required
  33. def notification_read_all():
  34. return success_response(mark_all_read(get_auth_context().user_id))
  35. @api_v1.post("/notifications/<id>/handle")
  36. @bearer_auth_required
  37. def notification_handle(id: str):
  38. if not request.is_json:
  39. raise InvalidArgumentError("请求体必须是JSON对象")
  40. body = request.get_json(silent=True)
  41. if not isinstance(body, dict):
  42. raise InvalidArgumentError("请求体必须是JSON对象")
  43. return success_response(
  44. handle_notification(
  45. get_auth_context().user_id,
  46. _parse_notification_id(id),
  47. _parse_action(body.get("action")),
  48. )
  49. )