fix(backend): end_task 和 complete_task 补齐权限校验

- end_task 新增 operator_role 参数 + _check_permission 调用
- complete_task 新增 operator_role 参数 + _check_permission 调用
- 两个端点均注入 current_user Depends(get_current_user)
- 非任务负责人且非管理员/主管调用时返回 403
This commit is contained in:
2026-08-11 10:13:40 +08:00
parent de47d27cfb
commit d40a8d480e
2 changed files with 18 additions and 4 deletions

View File

@ -349,7 +349,8 @@ async def get_all_tasks(
# ============================================================
async def end_task(
db: AsyncSession, task_id: uuid.UUID, operator_id: str | None = None
db: AsyncSession, task_id: uuid.UUID, operator_id: str | None = None,
operator_role: str | None = None,
) -> TaskResponse:
"""
结束当前分支:标记任务为 COMPLETED不创建下游任务。
@ -357,6 +358,9 @@ async def end_task(
"""
task = await _get_task_or_404(db, task_id)
# 权限校验:本人 或 管理员/主管 可结束
_check_permission(task.assignee_id, operator_id, operator_role)
# 校验:仅 SPAWN 协助分支可以结束主分支TRANSFER/RECOVERY不能通过此接口终止
if not task.parent_task_id:
raise HTTPException(status_code=409, detail="根任务无法结束,请使用完工转交")
@ -857,7 +861,8 @@ async def transfer_task(
# ============================================================
async def complete_task(
db: AsyncSession, task_id: uuid.UUID, request: TaskCompleteRequest
db: AsyncSession, task_id: uuid.UUID, request: TaskCompleteRequest,
operator_role: str | None = None,
) -> TaskCompleteResponse:
"""
核心业务:完成任务 + 可选创建下一步任务。
@ -872,6 +877,9 @@ async def complete_task(
"""
task = await _get_task_or_404(db, task_id)
# 权限校验:本人 或 管理员/主管 可操作
_check_permission(task.assignee_id, request.operator_id, operator_role)
# --- 1. 幂等检查 ---
if task.status == TASK_STATUS_COMPLETED:
raise HTTPException(