37 lines
1.4 KiB
Python
37 lines
1.4 KiB
Python
"""客户权益 controller(`docs/05` §19 T 段)。
|
||||
|
|
|
|||
|
|
| § | 端点 | 权限码 | 摘要 |
|
|||
|
|
|---|---|---|---|
|
|||
|
|
| T010 | `GET /api/v1/users/me/entitlements` | `benefit:read:self` | 我的客户层级与应享权益 |
|
|||
|
|
|
|||
|
|
设计要点(与 `trading.py` 的 §T 端点保持一致):
|
|||
|
|
|
|||
|
|
- 走 `build_request_context`(数据范围 `self`),权限检查在 **Service 层**
|
|||
|
|
(`CustomerBenefitService.entitlements_for` → `AuthorizationService.require`);
|
|||
|
|
- 不走限流依赖 —— 低频只读查询,由底座网关层限流;
|
|||
|
|
- 信封用 `envelope`(`docs/05` §3.3)。
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
from __future__ import annotations
|
|||
|
|
|
|||
|
|
from fastapi import APIRouter, Depends
|
|||
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|||
|
|
|
|||
|
|
from app.api.dependencies.auth import build_request_context
|
|||
|
|
from app.api.dependencies.database import get_session
|
|||
|
|
from app.api.views.envelope import envelope
|
|||
|
|
from app.core.contracts import RequestContext
|
|||
|
|
from app.service.customer_benefit_service import CustomerBenefitService
|
|||
|
|
|
|||
|
|
router = APIRouter(prefix="/api/v1/users/me", tags=["benefit"])
|
|||
|
|
|
|||
|
|
|
|||
|
|
# T010 我的权益
|
|||
|
|
@router.get("/entitlements")
|
|||
|
|
async def get_my_entitlements(
|
|||
|
|
context: RequestContext = Depends(build_request_context), # noqa: B008
|
|||
|
|
session: AsyncSession = Depends(get_session), # noqa: B008
|
|||
|
|
) -> dict[str, object]:
|
|||
|
|
data = await CustomerBenefitService(session).entitlements_for(context)
|
|||
|
|
return envelope(data, context)
|