Files
zcglxt/backend/app/api/v1/permissions.py

61 lines
1.8 KiB
Python

"""
Permission API routes.
"""
from typing import Dict, List
from fastapi import APIRouter, Depends
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.core.deps import get_db, get_current_user
from app.core.response import success_response
from app.models.user import Permission
router = APIRouter()
def _permission_to_dict(permission: Permission) -> Dict:
return {
"id": permission.id,
"permission_name": permission.permission_name,
"permission_code": permission.permission_code,
"module": permission.module,
"module_name": permission.module,
"resource": permission.resource,
"action": permission.action,
"description": permission.description,
"created_at": permission.created_at,
}
@router.get("/tree")
async def permission_tree(
db: AsyncSession = Depends(get_db),
current_user=Depends(get_current_user),
):
result = await db.execute(select(Permission).order_by(Permission.module, Permission.id))
permissions = list(result.scalars().all())
module_map: Dict[str, List[Permission]] = {}
module_order: List[str] = []
for permission in permissions:
module = permission.module or "misc"
if module not in module_map:
module_map[module] = []
module_order.append(module)
module_map[module].append(permission)
tree = []
for idx, module in enumerate(module_order, start=1):
children = [_permission_to_dict(p) for p in module_map[module]]
tree.append(
{
"id": -idx,
"permission_name": module,
"module_name": module,
"disabled": True,
"children": children,
}
)
return success_response(data=tree)