Files
mlc/mlc-client/src/daos/user.rs
2025-03-24 12:52:25 +01:00

73 lines
2.0 KiB
Rust

use std::sync::{Arc, Mutex};
use rusqlite::Connection;
use rusqlite::OptionalExtension;
#[derive(Debug, Clone)]
pub struct UserdataStorage {
pub connection: Arc<Mutex<Connection>>,
}
pub struct Userdata {
pub user_id: String,
pub secret_key: Vec<u8>,
pub public_key: Vec<u8>,
}
impl UserdataStorage {
pub fn new(connection: Arc<Mutex<Connection>>) -> Self {
Self { connection }
}
pub fn get_user(&self) -> anyhow::Result<Option<Userdata>> {
let conn = self
.connection
.lock()
.expect("Connection mutext is poisoned. It's a critical error. Exiting.");
let res = conn
.query_row(
"SELECT user_id, secret_key, public_key FROM mls_cli_userdata",
[],
|row| {
let user_id = row.get(0)?;
let secret_key = row.get(1)?;
let public_key = row.get(2)?;
Ok(Userdata {
user_id,
secret_key,
public_key,
})
},
)
.optional()?;
Ok(res)
}
pub fn truncate(&self) -> anyhow::Result<()> {
let conn = self
.connection
.lock()
.expect("Connection mutext is poisoned. It's a critical error. Exiting.");
conn.execute("DELETE FROM mls_cli_userdata", [])?;
Ok(())
}
pub fn save_user(
&self,
user_id: &str,
public_key: &[u8],
secret_key: &[u8],
) -> anyhow::Result<()> {
let conn = self
.connection
.lock()
.expect("Connection mutext is poisoned. It's a critical error. Exiting.");
conn.execute(
"INSERT INTO mls_cli_userdata (user_id, secret_key, public_key) VALUES (?1, ?2, ?3)",
rusqlite::params![user_id, secret_key, public_key],
)?;
Ok(())
}
}