- 新增多个 API 路由:`/api/customers`, `/api/products`, `/api/advisors`, `/api/compliance`, `/api/staff`,支持客户信息、产品详情、理财师客户列表、合规判定及员工上下文查询。 - 引入平台服务层,封装核心只读操作,支持数据脱敏功能。 - 更新依赖注入,确保各 API 路由的权限控制与数据访问一致性。 - 添加相应的单元测试,确保新接口的功能完整性与稳定性。 此更新为代销平台提供了基础的 REST API 支持,增强了系统的可扩展性与可维护性。
56 lines
1.8 KiB
Python
56 lines
1.8 KiB
Python
"""代销平台 · 产品货架 / 详情 / 净值。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from fastapi import APIRouter, Depends, Query, Request
|
|
|
|
from app.api.deps import AuthContext, get_platform_auth_context
|
|
from app.repository.core_ro import CoreReadOnlyRepository
|
|
from app.service.platform import product_service
|
|
from app.utils.exceptions import ApiError
|
|
from app.utils.response import ok
|
|
|
|
router = APIRouter(prefix="/api/products", tags=["platform-products"])
|
|
|
|
|
|
def _trace_id(request: Request) -> str:
|
|
return getattr(request.state, "trace_id", "unknown")
|
|
|
|
|
|
@router.get("")
|
|
def list_products_api(
|
|
request: Request,
|
|
limit: int = Query(50, ge=1, le=200),
|
|
offset: int = Query(0, ge=0),
|
|
auth: AuthContext = Depends(get_platform_auth_context),
|
|
) -> dict:
|
|
data = product_service.list_products(limit=limit, offset=offset)
|
|
return ok(data, _trace_id(request)).model_dump()
|
|
|
|
|
|
@router.get("/{product_id}")
|
|
def get_product_api(
|
|
product_id: str,
|
|
request: Request,
|
|
auth: AuthContext = Depends(get_platform_auth_context),
|
|
) -> dict:
|
|
row = product_service.get_product(product_id)
|
|
if row is None:
|
|
raise ApiError(404, "NOT_FOUND", f"product not found: {product_id}")
|
|
return ok(row, _trace_id(request)).model_dump()
|
|
|
|
|
|
@router.get("/{product_id}/nav")
|
|
def get_product_nav_api(
|
|
product_id: str,
|
|
request: Request,
|
|
auth: AuthContext = Depends(get_platform_auth_context),
|
|
) -> dict:
|
|
core = CoreReadOnlyRepository()
|
|
if core.get_product(product_id) is None:
|
|
raise ApiError(404, "NOT_FOUND", f"product not found: {product_id}")
|
|
nav = product_service.get_latest_nav(product_id, core_ro=core)
|
|
if nav is None:
|
|
raise ApiError(404, "NOT_FOUND", f"nav not found for product: {product_id}")
|
|
return ok(nav, _trace_id(request)).model_dump()
|