"""IP条目池维护接口。""" 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.pagination import PageRequest from dms.common.response import success_response from dms.security.decorators import admin_required, bearer_auth_required from dms.services.ip_entry_service import ( create_ip_entry, delete_ip_entry, list_ip_entries, update_ip_entry, ) def _integer_query(name: str, default: int) -> int: raw_value = request.args.get(name) if raw_value is None or raw_value == "": return default try: return int(raw_value) except ValueError as exc: raise InvalidArgumentError(f"{name}必须是整数") from exc def _json_body(): if not request.is_json: raise InvalidArgumentError("请求体必须是JSON对象") body = request.get_json(silent=True) if not isinstance(body, dict): raise InvalidArgumentError("请求体必须是JSON对象") return body def _parse_entry_id(value: str) -> int: if not value.isdecimal() or int(value) <= 0: raise InvalidArgumentError("id必须是正整数形式的字符串ID") return int(value) def _parse_delete_row_version(value: str | None) -> int: if value is None or not value.isdecimal(): raise InvalidArgumentError("rowVersion必须是非负整数") return int(value) @api_v1.get("/ip-entries") @bearer_auth_required @admin_required def ip_entries(): return success_response( list_ip_entries( keyword=request.args.get("keyword"), page_request=PageRequest( page=_integer_query("page", 1), page_size=_integer_query("pageSize", 20), ), ) ) @api_v1.post("/ip-entries") @bearer_auth_required @admin_required def create_ip_entry_route(): return success_response(create_ip_entry(_json_body()), status=201) @api_v1.put("/ip-entries/") @bearer_auth_required @admin_required def update_ip_entry_route(id: str): return success_response(update_ip_entry(_parse_entry_id(id), _json_body())) @api_v1.delete("/ip-entries/") @bearer_auth_required @admin_required def delete_ip_entry_route(id: str): return success_response( delete_ip_entry( _parse_entry_id(id), _parse_delete_row_version(request.args.get("rowVersion")), ) )