"""数据权限校验(仅本人名下客户,PRD §五「最小权限原则」)。 customer_relation.advisor_id = 当前投顾 id 是数据权限唯一判据;越权一律 403。 """ from __future__ import annotations from sqlalchemy.ext.asyncio import AsyncSession from model.customer_relation import CustomerRelation from repositories.customer_relation import CustomerRelationRepo from utils.exceptions import ForbiddenError async def require_owned_relation( db: AsyncSession, advisor_id: int, customer_id: int ) -> CustomerRelation: """校验客户归属并返回关系记录(调用方可继续判断签约状态);越权抛 403。""" rel = await CustomerRelationRepo(db).get_by_customer_advisor(customer_id, advisor_id) if rel is None: raise ForbiddenError("无权操作该客户数据") return rel async def ensure_customer_owned( db: AsyncSession, advisor_id: int, customer_id: int ) -> None: """仅校验归属,不返回关系(不需要签约状态时用)。""" await require_owned_relation(db, advisor_id, customer_id)