From 171aa62fa0fca71562a161bda6da46378f7e9f84 Mon Sep 17 00:00:00 2001 From: f321x Date: Mon, 1 Jul 2024 16:28:18 +0000 Subject: [PATCH] add coordinator endpoint for maker psbt polling --- .../coordinator/src/communication/api.rs | 6 +++++ .../coordinator/src/communication/mod.rs | 19 +++++++++++-- .../coordinator/src/database/mod.rs | 27 +++++++++++++++++++ 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/taptrade-cli-demo/coordinator/src/communication/api.rs b/taptrade-cli-demo/coordinator/src/communication/api.rs index af63783..180a00f 100644 --- a/taptrade-cli-demo/coordinator/src/communication/api.rs +++ b/taptrade-cli-demo/coordinator/src/communication/api.rs @@ -67,3 +67,9 @@ pub struct OfferPsbtRequest { pub offer: PublicOffer, pub trade_data: BondSubmissionRequest, } + +#[derive(Debug, Serialize, Deserialize)] +pub struct OfferTakenRequest { + pub robohash_hex: String, + pub order_id_hex: String, +} diff --git a/taptrade-cli-demo/coordinator/src/communication/mod.rs b/taptrade-cli-demo/coordinator/src/communication/mod.rs index 0ac798a..fa9d26a 100755 --- a/taptrade-cli-demo/coordinator/src/communication/mod.rs +++ b/taptrade-cli-demo/coordinator/src/communication/mod.rs @@ -120,14 +120,29 @@ async fn submit_taker_bond( .into_response()) } +async fn request_offer_status_maker( + Extension(database): Extension, + Json(payload): Json, +) -> Result { + let offer = database + .fetch_taken_offer_maker(&payload.order_id_hex, &payload.robohash_hex) + .await?; + match offer { + Some(offer) => Ok(Json(OfferTakenResponse { + trade_psbt_hex_to_sign: offer, + }) + .into_response()), + None => Ok(StatusCode::NO_CONTENT.into_response()), + } +} + pub async fn api_server(database: CoordinatorDB, wallet: CoordinatorWallet) -> Result<()> { let app = Router::new() .route("/create-offer", post(receive_order)) .route("/submit-maker-bond", post(submit_maker_bond)) .route("/fetch-available-offers", post(fetch_available_offers)) .route("/submit-taker-bond", post(submit_taker_bond)) - // submit-taker-bond - // request-offer-status + .route("/request-offer-status", post(request_offer_status_maker)) .layer(Extension(database)) .layer(Extension(wallet)); // add other routes here diff --git a/taptrade-cli-demo/coordinator/src/database/mod.rs b/taptrade-cli-demo/coordinator/src/database/mod.rs index cb291b4..43ea19d 100644 --- a/taptrade-cli-demo/coordinator/src/database/mod.rs +++ b/taptrade-cli-demo/coordinator/src/database/mod.rs @@ -346,6 +346,33 @@ impl CoordinatorDB { Ok(()) } + + pub async fn fetch_taken_offer_maker( + &self, + offer_id_hex: &String, + robohash_hex_maker: &String, + ) -> Result> { + let offer = sqlx::query( + "SELECT escrow_psbt_hex_maker, robohash_maker FROM taken_offers WHERE offer_id = ?", + ) + .bind(offer_id_hex) + .fetch_optional(&*self.db_pool) + .await?; + let offer = match offer { + Some(offer) => offer, + None => return Ok(None), + }; + match offer.try_get::, _>("robohash_maker") { + Ok(robohash) => { + if hex::encode(robohash) == *robohash_hex_maker { + Ok(offer.try_get("escrow_psbt_hex_maker")?) + } else { + Ok(None) + } + } + Err(_) => Ok(None), + } + } } #[cfg(test)]