Make approval decisions idempotent
CI / Rust Checks (push) Has been cancelled
CI / UI Checks (push) Has been cancelled
CI / Frontend E2E (push) Has been cancelled
CI / Deployment Manifests (push) Has been cancelled
CI / Deploy (push) Has been cancelled

This commit is contained in:
github-ops
2026-06-24 13:23:04 +00:00
parent 267061e226
commit 8ce00ede31
2 changed files with 70 additions and 5 deletions
+32 -1
View File
@@ -326,7 +326,38 @@ async fn decide_approval_request(
}
}
Ok(Some(record)) => Json(json!(record)).into_response(),
Ok(None) => StatusCode::CONFLICT.into_response(),
Ok(None) => {
existing_decision_response(&state, &key.api_key.workspace_id, agent_id, &approval_id)
.await
}
Err(_) => StatusCode::INTERNAL_SERVER_ERROR.into_response(),
}
}
async fn existing_decision_response(
state: &Arc<AppState>,
workspace_id: &crank_core::WorkspaceId,
agent_id: &crank_core::AgentId,
approval_id: &ApprovalRequestId,
) -> Response {
match state
.registry
.get_approval_request_for_agent(workspace_id, agent_id, approval_id)
.await
{
Ok(Some(record))
if matches!(
record.approval.status,
ApprovalRequestStatus::Completed
| ApprovalRequestStatus::Failed
| ApprovalRequestStatus::Denied
| ApprovalRequestStatus::Expired
) =>
{
Json(json!(record)).into_response()
}
Ok(Some(_)) => StatusCode::CONFLICT.into_response(),
Ok(None) => StatusCode::NOT_FOUND.into_response(),
Err(_) => StatusCode::INTERNAL_SERVER_ERROR.into_response(),
}
}