"""运营 Web(/web/admin)JSON 请求体解析。 与 ApiCryptoMiddleware 配合:中间件未改写 body 时,在路由内解密 `{ enc, ts, nonce, edata }` 并剥 `{ data: ... }`,避免 FastAPI 声明式 Body 在校验阶段只看到密文信封而 422。 """ from __future__ import annotations from typing import Any, Optional, Tuple from fastapi import Request from app.core.request_payload import resolve_request_payload async def parse_admin_request_json( request: Request, current_user: dict, *, source: str, ) -> Tuple[Any, Optional[str]]: """ 读取 JSON body;dict 时走 resolve_request_payload(明文 / 密文 / data 包装)。 Returns: (payload, None) 成功; (_, err_msg) 密文解密失败(此时 payload 为原始 raw,调用方可忽略)。 """ raw: Any = await request.json() if isinstance(raw, dict): resolved = resolve_request_payload(raw, current_user, source=source) if resolved == {} and int(raw.get("enc", 0) or 0) == 1: return raw, "密文解密失败" return resolved, None return raw, None