diff --git a/src/cli/send_msg.rs b/src/cli/send_msg.rs index 034d3bf..bbcaaab 100644 --- a/src/cli/send_msg.rs +++ b/src/cli/send_msg.rs @@ -148,19 +148,38 @@ 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() { + 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 { + // 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)); + } + } + } + _ => (), } } - 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) + } }