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:
@ -84,6 +84,7 @@ async def complete_task_endpoint(
|
|||||||
task_id: str,
|
task_id: str,
|
||||||
request: TaskCompleteRequest,
|
request: TaskCompleteRequest,
|
||||||
db: AsyncSession = Depends(get_db),
|
db: AsyncSession = Depends(get_db),
|
||||||
|
current_user: dict = Depends(get_current_user),
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
**核心接口:完成任务 + 可选创建下一步任务(转交)**
|
**核心接口:完成任务 + 可选创建下一步任务(转交)**
|
||||||
@ -100,7 +101,8 @@ async def complete_task_endpoint(
|
|||||||
- 完成后自动创建下一步任务并指定负责人
|
- 完成后自动创建下一步任务并指定负责人
|
||||||
"""
|
"""
|
||||||
return await task_service.complete_task(
|
return await task_service.complete_task(
|
||||||
db, uuid.UUID(task_id), request
|
db, uuid.UUID(task_id), request,
|
||||||
|
operator_role=current_user.get("role"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -113,13 +115,17 @@ async def end_task_endpoint(
|
|||||||
task_id: str,
|
task_id: str,
|
||||||
operator_id: str | None = Query(None),
|
operator_id: str | None = Query(None),
|
||||||
db: AsyncSession = Depends(get_db),
|
db: AsyncSession = Depends(get_db),
|
||||||
|
current_user: dict = Depends(get_current_user),
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
**结束当前分支:标记任务为 COMPLETED,不创建下游任务。**
|
**结束当前分支:标记任务为 COMPLETED,不创建下游任务。**
|
||||||
|
|
||||||
用于工人认为工序已完结、无需转交下一人的场景。
|
用于工人认为工序已完结、无需转交下一人的场景。
|
||||||
"""
|
"""
|
||||||
return await task_service.end_task(db, uuid.UUID(task_id), operator_id)
|
return await task_service.end_task(
|
||||||
|
db, uuid.UUID(task_id), operator_id,
|
||||||
|
operator_role=current_user.get("role"),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|||||||
@ -349,7 +349,8 @@ async def get_all_tasks(
|
|||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
||||||
async def end_task(
|
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:
|
) -> TaskResponse:
|
||||||
"""
|
"""
|
||||||
结束当前分支:标记任务为 COMPLETED,不创建下游任务。
|
结束当前分支:标记任务为 COMPLETED,不创建下游任务。
|
||||||
@ -357,6 +358,9 @@ async def end_task(
|
|||||||
"""
|
"""
|
||||||
task = await _get_task_or_404(db, task_id)
|
task = await _get_task_or_404(db, task_id)
|
||||||
|
|
||||||
|
# 权限校验:本人 或 管理员/主管 可结束
|
||||||
|
_check_permission(task.assignee_id, operator_id, operator_role)
|
||||||
|
|
||||||
# 校验:仅 SPAWN 协助分支可以结束,主分支(TRANSFER/RECOVERY)不能通过此接口终止
|
# 校验:仅 SPAWN 协助分支可以结束,主分支(TRANSFER/RECOVERY)不能通过此接口终止
|
||||||
if not task.parent_task_id:
|
if not task.parent_task_id:
|
||||||
raise HTTPException(status_code=409, detail="根任务无法结束,请使用完工转交")
|
raise HTTPException(status_code=409, detail="根任务无法结束,请使用完工转交")
|
||||||
@ -857,7 +861,8 @@ async def transfer_task(
|
|||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
||||||
async def complete_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:
|
) -> TaskCompleteResponse:
|
||||||
"""
|
"""
|
||||||
核心业务:完成任务 + 可选创建下一步任务。
|
核心业务:完成任务 + 可选创建下一步任务。
|
||||||
@ -872,6 +877,9 @@ async def complete_task(
|
|||||||
"""
|
"""
|
||||||
task = await _get_task_or_404(db, task_id)
|
task = await _get_task_or_404(db, task_id)
|
||||||
|
|
||||||
|
# 权限校验:本人 或 管理员/主管 可操作
|
||||||
|
_check_permission(task.assignee_id, request.operator_id, operator_role)
|
||||||
|
|
||||||
# --- 1. 幂等检查 ---
|
# --- 1. 幂等检查 ---
|
||||||
if task.status == TASK_STATUS_COMPLETED:
|
if task.status == TASK_STATUS_COMPLETED:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
|
|||||||
Reference in New Issue
Block a user