Browse Source

feat: implement nut-06 time

Pavol Rusnak 7 months ago
parent
commit
e67dc15ce6

+ 8 - 0
bindings/cdk-js/src/nuts/nut06.rs

@@ -79,6 +79,7 @@ impl JsMintInfo {
         nuts: JsValue,
         mint_icon_url: Option<String>,
         motd: Option<String>,
+        time: Option<u64>,
     ) -> Result<JsMintInfo> {
         Ok(JsMintInfo {
             inner: MintInfo {
@@ -92,6 +93,7 @@ impl JsMintInfo {
                 nuts: serde_wasm_bindgen::from_value(nuts).map_err(into_err)?,
                 mint_icon_url,
                 motd,
+                time,
             },
         })
     }
@@ -152,6 +154,12 @@ impl JsMintInfo {
     pub fn motd(&self) -> Option<String> {
         self.inner.motd.clone()
     }
+
+    /// Get time
+    #[wasm_bindgen(getter)]
+    pub fn time(&self) -> Option<u64> {
+        self.inner.time
+    }
 }
 
 #[wasm_bindgen(js_name = ContactInfo)]

+ 1 - 1
crates/cdk-axum/src/router_handlers.rs

@@ -392,7 +392,7 @@ pub async fn post_check(
 }
 
 pub async fn get_mint_info(State(state): State<MintState>) -> Result<Json<MintInfo>, Response> {
-    Ok(Json(state.mint.mint_info().clone()))
+    Ok(Json(state.mint.mint_info().clone().time(unix_time())))
 }
 
 pub async fn post_swap(

+ 1 - 0
crates/cdk-sqlite/src/wallet/migrations/20240902210905_mint_time.sql

@@ -0,0 +1 @@
+ALTER TABLE mint ADD mint_time INTEGER;

+ 9 - 3
crates/cdk-sqlite/src/wallet/mod.rs

@@ -92,6 +92,7 @@ impl WalletDatabase for WalletSqliteDatabase {
             nuts,
             mint_icon_url,
             motd,
+            time,
         ) = match mint_info {
             Some(mint_info) => {
                 let MintInfo {
@@ -104,6 +105,7 @@ impl WalletDatabase for WalletSqliteDatabase {
                     nuts,
                     mint_icon_url,
                     motd,
+                    time,
                 } = mint_info;
 
                 (
@@ -116,16 +118,17 @@ impl WalletDatabase for WalletSqliteDatabase {
                     serde_json::to_string(&nuts).ok(),
                     mint_icon_url,
                     motd,
+                    time,
                 )
             }
-            None => (None, None, None, None, None, None, None, None, None),
+            None => (None, None, None, None, None, None, None, None, None, None),
         };
 
         sqlx::query(
             r#"
 INSERT OR REPLACE INTO mint
-(mint_url, name, pubkey, version, description, description_long, contact, nuts, mint_icon_url, motd)
-VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
+(mint_url, name, pubkey, version, description, description_long, contact, nuts, mint_icon_url, motd, mint_time)
+VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
         "#,
         )
         .bind(mint_url.to_string())
@@ -138,6 +141,7 @@ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
         .bind(nuts)
         .bind(mint_icon_url)
         .bind(motd)
+        .bind(time.map(|v| v as i64))
         .execute(&self.pool)
         .await
         .map_err(Error::from)?;
@@ -771,6 +775,7 @@ fn sqlite_row_to_mint_info(row: &SqliteRow) -> Result<MintInfo, Error> {
     let row_nuts: Option<String> = row.try_get("nuts").map_err(Error::from)?;
     let mint_icon_url: Option<String> = row.try_get("mint_icon_url").map_err(Error::from)?;
     let motd: Option<String> = row.try_get("motd").map_err(Error::from)?;
+    let time: Option<i64> = row.try_get("mint_time").map_err(Error::from)?;
 
     Ok(MintInfo {
         name,
@@ -784,6 +789,7 @@ fn sqlite_row_to_mint_info(row: &SqliteRow) -> Result<MintInfo, Error> {
             .unwrap_or_default(),
         mint_icon_url,
         motd,
+        time: time.map(|t| t as u64),
     })
 }
 

+ 14 - 0
crates/cdk/src/nuts/nut06.rs

@@ -79,6 +79,9 @@ pub struct MintInfo {
     /// message of the day that the wallet must display to the user
     #[serde(skip_serializing_if = "Option::is_none")]
     pub motd: Option<String>,
+    /// server unix timestamp
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub time: Option<u64>,
 }
 
 impl MintInfo {
@@ -170,6 +173,17 @@ impl MintInfo {
             ..self
         }
     }
+
+    /// Set time
+    pub fn time<S>(self, time: S) -> Self
+    where
+        S: Into<u64>,
+    {
+        Self {
+            time: Some(time.into()),
+            ..self
+        }
+    }
 }
 
 /// Supported nuts and settings