mini-rbac/backend/controller/role.py
2022-10-04 12:40:11 +08:00

79 lines
2.4 KiB
Python

from fastapi import APIRouter, Query
from core.utils import list_to_tree
from dbhelper.menu import get_menu
from dbhelper.role import (
del_role,
get_role,
get_role_menus,
get_roles,
new_role,
put_role,
)
from schemas import ListAll, Response, RoleIn, RoleInfo, RoleQuery, RoleRead
router = APIRouter(prefix="/role", tags=["角色管理"])
@router.post("", summary="角色新增", response_model=Response[RoleInfo])
async def role_add(data: RoleIn):
if result := await new_role(data):
return Response(data=result)
return Response(code=400, msg="菜单不存在")
@router.get("/{rid}/menu", summary="查询角色拥有权限", response_model=Response)
async def role_has_menu(rid: int):
"""
rid: 角色ID
"""
menus = await get_role_menus(rid)
try:
result = list_to_tree(menus)
except KeyError:
return Response(code=400, msg="菜单缺少根节点.")
return Response(data=result)
@router.get("", summary="角色列表", response_model=Response[ListAll[list[RoleRead]]])
async def role_arr(
offset: int = Query(default=1, description="偏移量-页码"),
limit: int = Query(default=10, description="数据量"),
):
skip = (offset - 1) * limit
roles, count = await get_roles(skip, limit)
return Response(data=ListAll(total=count, items=roles))
@router.delete("/{pk}", summary="角色删除", response_model=Response)
async def role_del(pk: int):
if await del_role(pk) == 0:
return Response(code=400, msg="角色不存在")
return Response()
@router.put("/{pk}", summary="角色更新", response_model=Response)
async def role_put(pk: int, data: RoleIn):
"""更新角色"""
if await get_role({"id": pk}) is None:
return Response(code=400, msg="角色不存在")
# 如果不为ture -> 有菜单id不存在
if not all([await get_menu({"id": mid}) for mid in data.menus]):
return Response(code=400, msg="菜单不存在")
if await put_role(pk, data) == 0:
return Response(code=400, msg="角色不存在")
return Response()
@router.post("/query", summary="角色查询", response_model=Response[ListAll[list[RoleRead]]])
async def role_query(query: RoleQuery):
"""post条件查询角色表"""
size = query.limit
skip = (query.offset - 1) * size
del query.offset, query.limit
users, count = await get_roles(skip, size, query.dict())
return Response(data=ListAll(total=count, items=users))