from typing import Optional from beanie import PydanticObjectId from fastapi import HTTPException def parse_object_id(value: str) -> PydanticObjectId: """Parse a string to PydanticObjectId, raising 400 on invalid format.""" try: return PydanticObjectId(value) except Exception: raise HTTPException(status_code=400, detail="无效的ID格式") def mask_name(name: Optional[str]) -> str: """隐私脱敏:姓名""" if not name or len(name) < 2: return name or "" return name[0] + "*" * (len(name) - 1)