nex_basse/backend/app/api/v1/endpoints/menus.py

48 lines
1.5 KiB
Python

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)