Server-Side Implementation
async fn create_order(
State(state): State<AppState>,
TypedHeader(idempotency_key): TypedHeader<IdempotencyKey>,
Json(body): Json<CreateOrderRequest>,
) -> Result<Response, AppError> {
let key = idempotency_key.0;
if let Some(cached) = state.idempotency_cache.get(&key) {
return Ok(cached.into_response());
}
state.idempotency_cache.insert(key.clone(), CachedResponse::InProgress);
let response = create_order_internal(&state, body).await?;
let cached = CachedResponse::Complete(response.clone());
state.idempotency_cache.insert(key, cached);
Ok(response.into_response())
}