完善项目权限前置依赖保存校验

- 以接口权限定义中的 prerequisite_permissions 作为前置依赖单一事实源,生成运行时前置权限映射\n- 保存项目角色权限前预检缺失前置权限与受影响下游权限,未确认时返回 409 调整详情\n- 确认保存时自动合并补齐前置权限与取消下游权限,并提供有效权限矩阵读取接口\n- 前端角色权限编辑改为保存时执行依赖校验,弹窗展示需补充前置权限和受影响下游权限\n- 新增编辑权限取消按钮,清理权限选择即时确认弹窗残留\n- 补充后端接口测试、前端权限编辑测试与优化设计文档
This commit is contained in:
Cheng Zhou
2026-06-04 16:29:44 +08:00
parent 02f2c6660b
commit d6452e3f9d
13 changed files with 1089 additions and 80 deletions
+20 -2
View File
@@ -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)