- 新增多个 API 路由:`/api/customers`, `/api/products`, `/api/advisors`, `/api/compliance`, `/api/staff`,支持客户信息、产品详情、理财师客户列表、合规判定及员工上下文查询。 - 引入平台服务层,封装核心只读操作,支持数据脱敏功能。 - 更新依赖注入,确保各 API 路由的权限控制与数据访问一致性。 - 添加相应的单元测试,确保新接口的功能完整性与稳定性。 此更新为代销平台提供了基础的 REST API 支持,增强了系统的可扩展性与可维护性。
47 lines
1.4 KiB
Python
47 lines
1.4 KiB
Python
"""Platform Service 公共:JSON 序列化与可选脱敏。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import datetime as _dt
|
|
from decimal import Decimal
|
|
from typing import Any
|
|
|
|
from app.config.settings import settings
|
|
from app.utils import desensitize as d
|
|
|
|
|
|
def to_jsonable(value: Any) -> Any:
|
|
if isinstance(value, Decimal):
|
|
return float(round(value, 2))
|
|
if isinstance(value, (_dt.datetime, _dt.date)):
|
|
return value.isoformat()
|
|
if isinstance(value, dict):
|
|
return {k: to_jsonable(v) for k, v in value.items()}
|
|
if isinstance(value, list):
|
|
return [to_jsonable(v) for v in value]
|
|
return value
|
|
|
|
|
|
def maybe_desensitize_row(row: dict[str, Any] | None) -> dict[str, Any] | None:
|
|
if row is None or not settings.platform_response_desensitize:
|
|
return row
|
|
out = dict(row)
|
|
for key, masker in (
|
|
("display_name", d.mask_name),
|
|
("full_name", d.mask_name),
|
|
("mobile_phone", d.mask_phone),
|
|
("phone", d.mask_phone),
|
|
("id_card_no", d.mask_id_card),
|
|
("id_no", d.mask_id_card),
|
|
("bank_card_no", d.mask_bank_card),
|
|
):
|
|
if key in out and out[key]:
|
|
out[key] = masker(str(out[key]))
|
|
return out
|
|
|
|
|
|
def prepare_row(row: dict[str, Any] | None) -> dict[str, Any] | None:
|
|
if row is None:
|
|
return None
|
|
return to_jsonable(maybe_desensitize_row(row) or row)
|