roles.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. from uuid import UUID
  2. from fastapi import APIRouter, Depends, HTTPException
  3. from sqlalchemy import select, delete
  4. from sqlalchemy.ext.asyncio import AsyncSession
  5. from sqlalchemy.orm import selectinload
  6. from backend.app.core.dependencies import require_permissions
  7. from backend.app.db.session import get_db
  8. from backend.app.models import Role, RolePermission
  9. from backend.app.schemas.role import RoleResponse, RoleUpdate
  10. router = APIRouter(prefix="/roles", tags=["roles"])
  11. @router.get("", response_model=list[RoleResponse], dependencies=[Depends(require_permissions(["users.view"]))])
  12. async def list_roles(db: AsyncSession = Depends(get_db)):
  13. result = await db.execute(select(Role).options(selectinload(Role.permissions)))
  14. roles = result.scalars().all()
  15. response = []
  16. for role in roles:
  17. permissions = [perm.permission_code for perm in role.permissions]
  18. response.append(RoleResponse(
  19. id=role.id,
  20. name=role.name,
  21. description=role.description,
  22. permissions=permissions
  23. ))
  24. return response
  25. @router.put("/{role_id}", response_model=RoleResponse, dependencies=[Depends(require_permissions(["users.assignRole"]))])
  26. async def update_role(role_id: UUID, payload: RoleUpdate, db: AsyncSession = Depends(get_db)):
  27. result = await db.execute(select(Role).where(Role.id == role_id))
  28. role = result.scalar_one_or_none()
  29. if not role:
  30. raise HTTPException(status_code=404, detail="角色不存在")
  31. await db.execute(delete(RolePermission).where(RolePermission.role_id == role_id))
  32. for code in payload.permissions:
  33. db.add(RolePermission(role_id=role_id, permission_code=code))
  34. await db.commit()
  35. await db.refresh(role)
  36. return RoleResponse(
  37. id=role.id,
  38. name=role.name,
  39. description=role.description,
  40. permissions=payload.permissions
  41. )