44 lines
1.5 KiB
Python
44 lines
1.5 KiB
Python
from __future__ import annotations
|
|
|
|
from fastapi import APIRouter, Depends
|
|
|
|
from app.core.deps import DbDep, require_perm
|
|
from app.core.exceptions import ok
|
|
from app.schemas.role import RoleCreate, RoleRead, RoleUpdate
|
|
from app.services import role_service
|
|
|
|
router = APIRouter(prefix="/roles", tags=["role"])
|
|
|
|
|
|
@router.get("", dependencies=[Depends(require_perm("auth:role:view"))])
|
|
async def list_roles(db: DbDep) -> dict:
|
|
items = await role_service.list_all(db)
|
|
return ok([RoleRead.model_validate(r).model_dump() for r in items])
|
|
|
|
|
|
@router.get("/{rid}", dependencies=[Depends(require_perm("auth:role:view"))])
|
|
async def get_role(rid: int, db: DbDep) -> dict:
|
|
role = await role_service.get_with_menus(db, rid)
|
|
detail = await role_service.to_detail(db, role)
|
|
return ok(detail.model_dump())
|
|
|
|
|
|
@router.post("", dependencies=[Depends(require_perm("auth:role:create"))])
|
|
async def create_role(data: RoleCreate, db: DbDep) -> dict:
|
|
role = await role_service.create(db, data)
|
|
detail = await role_service.to_detail(db, role)
|
|
return ok(detail.model_dump())
|
|
|
|
|
|
@router.patch("/{rid}", dependencies=[Depends(require_perm("auth:role:update"))])
|
|
async def update_role(rid: int, data: RoleUpdate, db: DbDep) -> dict:
|
|
role = await role_service.update(db, rid, data)
|
|
detail = await role_service.to_detail(db, role)
|
|
return ok(detail.model_dump())
|
|
|
|
|
|
@router.delete("/{rid}", dependencies=[Depends(require_perm("auth:role:delete"))])
|
|
async def delete_role(rid: int, db: DbDep) -> dict:
|
|
await role_service.delete(db, rid)
|
|
return ok()
|