| 1234567891011121314151617181920212223242526272829303132333435 |
- """运营 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
|