62 lines
2.0 KiB
Python
62 lines
2.0 KiB
Python
"""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)}
|
||
|