from fastapi import APIRouter, Depends from sqlalchemy.orm import Session from app.core.db import get_db from app.core.deps import get_current_user from app.models import Permission, RolePermission, UserRole, User from app.models.enums import StatusEnum, PermissionTypeEnum router = APIRouter(prefix="/menus", tags=["menus"]) def build_tree(items): by_parent = {} for item in items: by_parent.setdefault(item.parent_id, []).append(item) def make_node(item): return { "id": item.perm_id, "name": item.name, "code": item.code, "type": item.perm_type, "level": item.level, "path": item.path, "icon": item.icon, "children": [make_node(child) for child in by_parent.get(item.perm_id, [])], } roots = by_parent.get(None, []) + by_parent.get(0, []) return [make_node(node) for node in roots] @router.get("/tree") def menu_tree( db: Session = Depends(get_db), current_user: User = Depends(get_current_user), ): items = ( db.query(Permission) .join(RolePermission, RolePermission.perm_id == Permission.perm_id) .join(UserRole, UserRole.role_id == RolePermission.role_id) .filter(UserRole.user_id == current_user.user_id) .filter(Permission.status == int(StatusEnum.ENABLED)) .filter(Permission.perm_type.in_([PermissionTypeEnum.MENU, PermissionTypeEnum.BUTTON])) .order_by(Permission.level, Permission.sort_order) .all() ) return build_tree(items)