173 lines
5.5 KiB
Python
173 lines
5.5 KiB
Python
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]
|
|
) |