From 8cf98323486f0d8bc8f92a3a5f90f9ae18a4259c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Calder=C3=B3n?= Date: Wed, 15 Jan 2025 16:20:03 -0300 Subject: [PATCH 1/2] Fix canceling orders --- src/cli/send_msg.rs | 39 ++++++++++++++++++++++++++++----------- src/db.rs | 15 +++++++++++++++ 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/src/cli/send_msg.rs b/src/cli/send_msg.rs index 034d3bf..367fa8f 100644 --- a/src/cli/send_msg.rs +++ b/src/cli/send_msg.rs @@ -148,19 +148,36 @@ async fn process_order_response( trade_keys: &Keys, request_id: u64, ) -> Result<()> { - if let Some(order) = dm.iter().find_map(|el| { - let message = el.0.get_inner_message_kind(); - if message.request_id == Some(request_id) { - if let Some(Payload::Order(order)) = message.payload.as_ref() { - return Some(order.clone()); + for (message, _) in dm { + let kind = message.get_inner_message_kind(); + if let Some(req_id) = kind.request_id { + if req_id != request_id { + continue; + } + + match kind.action { + Action::NewOrder => { + if let Some(Payload::Order(order)) = kind.payload.as_ref() { + if let Err(e) = + Order::new(pool, order.clone(), trade_keys, Some(request_id as i64)) + .await + { + println!("Failed to create new order: {}", e); + } + return Ok(()); + } + } + Action::Canceled => { + if let Some(id) = kind.id { + if let Err(e) = Order::delete_by_id(pool, &id.to_string()).await { + println!("Failed to delete order: {}", e); + } + return Ok(()); + } + } + _ => (), } } - None - }) { - println!("Order id {} created", order.id.unwrap()); - Order::new(pool, order.clone(), trade_keys, Some(request_id as i64)).await?; - } else { - println!("Error: No matching order found in response"); } Ok(()) diff --git a/src/db.rs b/src/db.rs index 9a53ed2..fe83015 100644 --- a/src/db.rs +++ b/src/db.rs @@ -439,4 +439,19 @@ impl Order { .await?; Ok(orders) } + + pub async fn delete_by_id(pool: &SqlitePool, id: &str) -> Result { + let rows_affected = sqlx::query( + r#" + DELETE FROM orders + WHERE id = ? + "#, + ) + .bind(id) + .execute(pool) + .await? + .rows_affected(); + + Ok(rows_affected > 0) + } } From f1007ee74123ecc32ca9a835de2b38fb0ae7892a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Calder=C3=B3n?= Date: Wed, 15 Jan 2025 16:37:26 -0300 Subject: [PATCH 2/2] Improve error handling in process_order_response. Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- src/cli/send_msg.rs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/cli/send_msg.rs b/src/cli/send_msg.rs index 367fa8f..bbcaaab 100644 --- a/src/cli/send_msg.rs +++ b/src/cli/send_msg.rs @@ -158,21 +158,23 @@ async fn process_order_response( match kind.action { Action::NewOrder => { if let Some(Payload::Order(order)) = kind.payload.as_ref() { - if let Err(e) = - Order::new(pool, order.clone(), trade_keys, Some(request_id as i64)) - .await - { - println!("Failed to create new order: {}", e); - } + Order::new(pool, order.clone(), trade_keys, Some(request_id as i64)) + .await + .map_err(|e| anyhow::anyhow!("Failed to create new order: {}", e))?; return Ok(()); } } Action::Canceled => { if let Some(id) = kind.id { - if let Err(e) = Order::delete_by_id(pool, &id.to_string()).await { - println!("Failed to delete order: {}", e); + // Verify order exists before deletion + if Order::get_by_id(pool, &id.to_string()).await.is_ok() { + Order::delete_by_id(pool, &id.to_string()) + .await + .map_err(|e| anyhow::anyhow!("Failed to delete order: {}", e))?; + return Ok(()); + } else { + return Err(anyhow::anyhow!("Order not found: {}", id)); } - return Ok(()); } } _ => (),