完善项目权限前置依赖保存校验
- 以接口权限定义中的 prerequisite_permissions 作为前置依赖单一事实源,生成运行时前置权限映射\n- 保存项目角色权限前预检缺失前置权限与受影响下游权限,未确认时返回 409 调整详情\n- 确认保存时自动合并补齐前置权限与取消下游权限,并提供有效权限矩阵读取接口\n- 前端角色权限编辑改为保存时执行依赖校验,弹窗展示需补充前置权限和受影响下游权限\n- 新增编辑权限取消按钮,清理权限选择即时确认弹窗残留\n- 补充后端接口测试、前端权限编辑测试与优化设计文档
This commit is contained in:
@@ -12,6 +12,8 @@ from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from app.core.deps import get_current_user, get_db_session, is_system_admin, require_study_member, require_system_permission
|
||||
from app.core.project_permissions import (
|
||||
get_api_endpoint_permissions,
|
||||
get_effective_api_endpoint_permissions,
|
||||
PrerequisitePermissionConfirmationRequired,
|
||||
replace_api_endpoint_permissions,
|
||||
get_missing_prerequisites,
|
||||
)
|
||||
@@ -173,7 +175,7 @@ async def get_my_study_api_permissions(
|
||||
|
||||
membership = await member_crud.get_member(db, study_id, current_user.id)
|
||||
role = membership.role_in_study if membership and membership.is_active else ""
|
||||
permissions = await get_api_endpoint_permissions(db, study_id)
|
||||
permissions = await get_effective_api_endpoint_permissions(db, study_id)
|
||||
role_permissions = permissions.get(role, {})
|
||||
return {
|
||||
role: {
|
||||
@@ -232,6 +234,7 @@ async def get_study_api_permissions(
|
||||
async def update_study_api_permissions(
|
||||
study_id: uuid.UUID,
|
||||
payload: dict[str, dict[str, bool]],
|
||||
confirm_prerequisite_adjustments: bool = False,
|
||||
_=Depends(require_system_permission("system:permissions:project_config")),
|
||||
current_user=Depends(get_current_user),
|
||||
db: Annotated[AsyncSession, Depends(get_db_session)] = None,
|
||||
@@ -259,7 +262,22 @@ async def update_study_api_permissions(
|
||||
)
|
||||
|
||||
# 替换权限配置
|
||||
await replace_api_endpoint_permissions(db, study_id, payload)
|
||||
try:
|
||||
await replace_api_endpoint_permissions(
|
||||
db,
|
||||
study_id,
|
||||
payload,
|
||||
confirm_prerequisite_adjustments=confirm_prerequisite_adjustments,
|
||||
)
|
||||
except PrerequisitePermissionConfirmationRequired as exc:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_409_CONFLICT,
|
||||
detail={
|
||||
"code": "PREREQUISITE_PERMISSION_CONFIRMATION_REQUIRED",
|
||||
"message": "需要确认前置权限调整",
|
||||
"adjustments": exc.adjustments,
|
||||
},
|
||||
) from exc
|
||||
|
||||
# 返回更新后的权限矩阵
|
||||
permissions = await get_api_endpoint_permissions(db, study_id)
|
||||
|
||||
Reference in New Issue
Block a user