"""GNACS 资产分类路由""" from fastapi import APIRouter, HTTPException, Query import database from bson import ObjectId router = APIRouter() def serialize(doc): if doc is None: return None result = {} for k, v in doc.items(): if k == "_id": result["_id"] = str(v) elif isinstance(v, list): result[k] = [serialize(i) if isinstance(i, dict) else i for i in v] elif isinstance(v, dict): result[k] = serialize(v) else: result[k] = v return result @router.get("/tree") async def get_classification_tree(): """获取完整的20大类资产分类树(含子类)""" col = database.asset_classes_col cursor = col.find({}, sort=[("class_code", 1)]) classes = [] async for doc in cursor: classes.append(serialize(doc)) return {"success": True, "data": classes, "total": len(classes)} @router.get("/list") async def list_classes( acc_standard: str = Query(None, description="按ACC代币标准筛选,如ACC-20/ACC-721/ACC-1155/ACC-1400"), min_kyc: int = Query(None, description="按最低KYC等级筛选") ): """列出所有资产大类""" col = database.asset_classes_col query = {} if acc_standard: query["token_standard"] = acc_standard if min_kyc is not None: query["min_kyc_level"] = {"$lte": min_kyc} cursor = col.find(query, sort=[("class_code", 1)]) classes = [] async for doc in cursor: classes.append(serialize(doc)) return {"success": True, "classes": classes, "total": len(classes)} @router.get("/{class_id}") async def get_class_detail(class_id: str): """获取指定资产大类的详细信息""" col = database.asset_classes_col doc = await col.find_one({"class_id": class_id.upper()}) if not doc: doc = await col.find_one({"class_code": class_id}) if not doc: raise HTTPException(status_code=404, detail=f"资产类别 {class_id} 不存在") return {"success": True, "data": serialize(doc)}