Ver código fonte

Update melt_quote update usage introducing `update_melt_quote_request_lookup_id`

Cesar Rodas 4 meses atrás
pai
commit
f130d77695

+ 8 - 0
crates/cdk-common/src/database/mint/mod.rs

@@ -83,6 +83,14 @@ pub trait QuotesTransaction<'a> {
     ) -> Result<Option<mint::MeltQuote>, Self::Err>;
     /// Add [`mint::MeltQuote`]
     async fn add_melt_quote(&mut self, quote: mint::MeltQuote) -> Result<(), Self::Err>;
+
+    /// Updates the request lookup id for a melt quote
+    async fn update_melt_quote_request_lookup_id(
+        &mut self,
+        quote_id: &Uuid,
+        new_request_lookup_id: &str,
+    ) -> Result<(), Self::Err>;
+
     /// Update [`mint::MeltQuote`] state
     ///
     /// It is expected for this function to fail if the state is already set to the new state

+ 14 - 1
crates/cdk-sqlite/src/mint/mod.rs

@@ -361,7 +361,7 @@ impl<'a> MintQuotesTransaction<'a> for SqliteTransaction<'a> {
     async fn add_melt_quote(&mut self, quote: mint::MeltQuote) -> Result<(), Self::Err> {
         query(
             r#"
-            INSERT OR REPLACE INTO melt_quote
+            INSERT INTO melt_quote
             (
                 id, unit, amount, request, fee_reserve, state,
                 expiry, payment_preimage, request_lookup_id, msat_to_pay,
@@ -396,6 +396,19 @@ impl<'a> MintQuotesTransaction<'a> for SqliteTransaction<'a> {
         Ok(())
     }
 
+    async fn update_melt_quote_request_lookup_id(
+        &mut self,
+        quote_id: &Uuid,
+        new_request_lookup_id: &str,
+    ) -> Result<(), Self::Err> {
+        query(r#"UPDATE melt_quote SET request_lookup_id = :new_req_id WHERE id = :id"#)
+            .bind(":new_req_id", new_request_lookup_id.to_owned())
+            .bind(":id", quote_id.as_hyphenated().to_string())
+            .execute(&self.inner)
+            .await?;
+        Ok(())
+    }
+
     async fn update_melt_quote_state(
         &mut self,
         quote_id: &Uuid,

+ 25 - 2
crates/cdk/src/mint/melt.rs

@@ -173,7 +173,23 @@ impl Mint {
         );
 
         let mut tx = self.localstore.begin_transaction().await?;
-        tx.add_melt_quote(quote.clone()).await?;
+        if let Some(mut from_db_quote) = tx.get_melt_quote(&quote.id).await? {
+            if from_db_quote.state != quote.state {
+                tx.update_melt_quote_state(&quote.id, from_db_quote.state)
+                    .await?;
+                from_db_quote.state = quote.state;
+            }
+            if from_db_quote.request_lookup_id != quote.request_lookup_id {
+                tx.update_melt_quote_request_lookup_id(&quote.id, &quote.request_lookup_id)
+                    .await?;
+                from_db_quote.request_lookup_id = quote.request_lookup_id.clone();
+            }
+            if from_db_quote != quote {
+                return Err(Error::Internal);
+            }
+        } else {
+            tx.add_melt_quote(quote.clone()).await?;
+        }
         tx.commit().await?;
 
         Ok(quote.into())
@@ -533,9 +549,16 @@ impl Mint {
                     let mut melt_quote = quote;
                     melt_quote.request_lookup_id = payment_lookup_id;
 
-                    if let Err(err) = tx.add_melt_quote(melt_quote.clone()).await {
+                    if let Err(err) = tx
+                        .update_melt_quote_request_lookup_id(
+                            &melt_quote.id,
+                            &melt_quote.request_lookup_id,
+                        )
+                        .await
+                    {
                         tracing::warn!("Could not update payment lookup id: {}", err);
                     }
+
                     (tx, pre.payment_proof, amount_spent, melt_quote)
                 } else {
                     (tx, pre.payment_proof, amount_spent, quote)