ip_entries.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. """IP条目池维护接口。"""
  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.pagination import PageRequest
  7. from dms.common.response import success_response
  8. from dms.security.decorators import admin_required, bearer_auth_required
  9. from dms.services.ip_entry_service import (
  10. create_ip_entry,
  11. delete_ip_entry,
  12. list_ip_entries,
  13. update_ip_entry,
  14. )
  15. def _integer_query(name: str, default: int) -> int:
  16. raw_value = request.args.get(name)
  17. if raw_value is None or raw_value == "":
  18. return default
  19. try:
  20. return int(raw_value)
  21. except ValueError as exc:
  22. raise InvalidArgumentError(f"{name}必须是整数") from exc
  23. def _json_body():
  24. if not request.is_json:
  25. raise InvalidArgumentError("请求体必须是JSON对象")
  26. body = request.get_json(silent=True)
  27. if not isinstance(body, dict):
  28. raise InvalidArgumentError("请求体必须是JSON对象")
  29. return body
  30. def _parse_entry_id(value: str) -> int:
  31. if not value.isdecimal() or int(value) <= 0:
  32. raise InvalidArgumentError("id必须是正整数形式的字符串ID")
  33. return int(value)
  34. def _parse_delete_row_version(value: str | None) -> int:
  35. if value is None or not value.isdecimal():
  36. raise InvalidArgumentError("rowVersion必须是非负整数")
  37. return int(value)
  38. @api_v1.get("/ip-entries")
  39. @bearer_auth_required
  40. @admin_required
  41. def ip_entries():
  42. return success_response(
  43. list_ip_entries(
  44. keyword=request.args.get("keyword"),
  45. page_request=PageRequest(
  46. page=_integer_query("page", 1),
  47. page_size=_integer_query("pageSize", 20),
  48. ),
  49. )
  50. )
  51. @api_v1.post("/ip-entries")
  52. @bearer_auth_required
  53. @admin_required
  54. def create_ip_entry_route():
  55. return success_response(create_ip_entry(_json_body()), status=201)
  56. @api_v1.put("/ip-entries/<id>")
  57. @bearer_auth_required
  58. @admin_required
  59. def update_ip_entry_route(id: str):
  60. return success_response(update_ip_entry(_parse_entry_id(id), _json_body()))
  61. @api_v1.delete("/ip-entries/<id>")
  62. @bearer_auth_required
  63. @admin_required
  64. def delete_ip_entry_route(id: str):
  65. return success_response(
  66. delete_ip_entry(
  67. _parse_entry_id(id),
  68. _parse_delete_row_version(request.args.get("rowVersion")),
  69. )
  70. )