feat(server): add project RBAC and guarded workflows

This commit is contained in:
2026-07-30 16:45:09 +08:00
parent 3fbb17bb30
commit ae1a657554
29 changed files with 1431 additions and 412 deletions
+6 -11
View File
@@ -41,19 +41,14 @@ def _project_network(network: str, project_context: ProjectContext) -> str:
return project_context.project_code
def _can_modify_project(project_context: ProjectContext, current_user: Any) -> bool:
return bool(
project_context.project_role in {"owner", "admin", "member"}
or getattr(current_user, "role", None) == "admin"
or getattr(current_user, "is_superuser", False)
)
def _can_modify_project(project_context: ProjectContext) -> bool:
return project_context.project_role == "member"
def _require_project_write(
project_context: ProjectContext,
current_user: Any,
) -> None:
if not _can_modify_project(project_context, current_user):
if not _can_modify_project(project_context):
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="当前项目角色为只读,不能修改监测点方案",
@@ -88,7 +83,7 @@ def _get_scheme_response(
return {
**scheme,
"can_edit": (
_can_modify_project(project_context, current_user)
_can_modify_project(project_context)
and can_edit_sensor_placement(current_user, scheme)
),
}
@@ -110,7 +105,7 @@ async def optimize_sensor_placement_scheme(
current_user=Depends(get_current_metadata_user),
) -> dict[str, Any]:
network = _project_network(payload.network, project_context)
_require_project_write(project_context, current_user)
_require_project_write(project_context)
optimizer = (
pressure_sensor_placement_sensitivity
if payload.method == "sensitivity"
@@ -173,7 +168,7 @@ async def overwrite_sensor_placement_scheme(
current_user=Depends(get_current_metadata_user),
) -> dict[str, Any]:
network = _project_network(network, project_context)
_require_project_write(project_context, current_user)
_require_project_write(project_context)
scheme = _get_scheme_response(
network,
scheme_id,