48 lines
1.5 KiB
Python
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)
|