from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select from fastcrud import FastCRUD from database import get_db from models import Permission, Role from schemas import ( PermissionCreate, PermissionResponse, RolePermissionAssign, RolePermissionResponse, ) from middleware import get_current_user from models import User router = APIRouter(prefix="/permissions", tags=["permissions"]) # 创建FastCRUD实例 permission_crud = FastCRUD(Permission, PermissionResponse) @router.post("/", response_model=PermissionResponse) async def create_permission( permission_data: PermissionCreate, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): """创建权限""" # 检查权限编码是否已存在 result = await db.execute(select(Permission).filter(Permission.code == permission_data.code)) existing_permission = result.scalar_one_or_none() if existing_permission: raise HTTPException(status_code=400, detail="权限编码已存在") # 创建权限实例 db_permission = Permission( name=permission_data.name, code=permission_data.code, description=permission_data.description, ) db.add(db_permission) await db.commit() await db.refresh(db_permission) return db_permission @router.get("/", response_model=list[PermissionResponse]) async def get_permissions( db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): """获取所有权限""" result = await db.execute(select(Permission)) permissions = result.scalars().all() return permissions @router.get("/{permission_id}", response_model=PermissionResponse) async def get_permission( permission_id: int, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): """获取单个权限""" permission = await permission_crud.get(db, id=permission_id) if not permission: raise HTTPException(status_code=404, detail="权限不存在") return permission @router.put("/{permission_id}", response_model=PermissionResponse) async def update_permission( permission_id: int, permission_data: PermissionCreate, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): """更新权限""" # 检查权限编码是否被其他权限使用 result = await db.execute( select(Permission).filter(Permission.code == permission_data.code, Permission.id != permission_id) ) existing_permission = result.scalar_one_or_none() if existing_permission: raise HTTPException(status_code=400, detail="权限编码已存在") # 准备更新数据 update_data = permission_data.model_dump() # 使用FastCRUD更新权限 updated_permission = await permission_crud.update( db, update_data, id=permission_id, schema_to_select=PermissionResponse, return_as_model=True ) if not updated_permission: raise HTTPException(status_code=404, detail="权限不存在") return updated_permission @router.delete("/{permission_id}") async def delete_permission( permission_id: int, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): """删除权限""" # 检查权限是否存在 result = await db.execute(select(Permission).filter(Permission.id == permission_id)) existing_permission = result.scalar_one_or_none() if not existing_permission: raise HTTPException(status_code=404, detail="权限不存在") # 使用FastCRUD删除权限 deleted = await permission_crud.delete(db, id=permission_id) return {"message": "权限删除成功"} # 角色权限关联接口 @router.post("/assign", response_model=RolePermissionResponse) async def assign_permissions_to_role( data: RolePermissionAssign, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): """为角色分配权限""" # 查找角色 result = await db.execute(select(Role).filter(Role.id == data.role_id)) role = result.scalar_one_or_none() if not role: raise HTTPException(status_code=404, detail="角色不存在") # 查找要分配的权限 permissions = [] for permission_id in data.permission_ids: result = await db.execute(select(Permission).filter(Permission.id == permission_id)) permission = result.scalar_one_or_none() if permission: permissions.append(permission) # 更新角色的权限 role.permissions = permissions await db.commit() await db.refresh(role) # 返回角色权限信息 return RolePermissionResponse( role_id=role.id, role_name=role.name, permissions=[PermissionResponse.from_orm(p) for p in role.permissions] ) @router.get("/role/{role_id}", response_model=RolePermissionResponse) async def get_role_permissions( role_id: int, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): """获取角色的权限列表""" # 查找角色 result = await db.execute(select(Role).filter(Role.id == role_id)) role = result.scalar_one_or_none() if not role: raise HTTPException(status_code=404, detail="角色不存在") # 返回角色权限信息 return RolePermissionResponse( role_id=role.id, role_name=role.name, permissions=[PermissionResponse.from_orm(p) for p in role.permissions] )