use sqlx::Row;
use crate::db::DbPool;
use crate::error::AppResult;
#[derive(Debug, Clone)]
pub struct WalletRow {
pub id: i64,
pub data_encrypted: String,
}
pub async fn iter_credential_rows(
pool: &DbPool,
after_id: i64,
batch_size: i64,
) -> AppResult<Vec<WalletRow>> {
let rows = sqlx::query(
r#"
SELECT id, data_encrypted
FROM noetl.credential
WHERE id > $1
ORDER BY id ASC
LIMIT $2
"#,
)
.bind(after_id)
.bind(batch_size)
.fetch_all(pool)
.await?;
Ok(rows
.into_iter()
.map(|r| WalletRow {
id: r.get::<i64, _>("id"),
data_encrypted: r.get::<String, _>("data_encrypted"),
})
.collect())
}
pub async fn iter_keychain_rows(
pool: &DbPool,
after_id: i64,
batch_size: i64,
) -> AppResult<Vec<WalletRow>> {
let rows = sqlx::query(
r#"
SELECT id, data_encrypted
FROM noetl.keychain
WHERE id > $1
ORDER BY id ASC
LIMIT $2
"#,
)
.bind(after_id)
.bind(batch_size)
.fetch_all(pool)
.await?;
Ok(rows
.into_iter()
.map(|r| WalletRow {
id: r.get::<i64, _>("id"),
data_encrypted: r.get::<String, _>("data_encrypted"),
})
.collect())
}
pub async fn update_credential_data(
pool: &DbPool,
id: i64,
new_data_encrypted: &str,
) -> AppResult<()> {
sqlx::query(
r#"
UPDATE noetl.credential
SET data_encrypted = $2
WHERE id = $1
"#,
)
.bind(id)
.bind(new_data_encrypted)
.execute(pool)
.await?;
Ok(())
}
pub async fn update_keychain_data(
pool: &DbPool,
id: i64,
new_data_encrypted: &str,
) -> AppResult<()> {
sqlx::query(
r#"
UPDATE noetl.keychain
SET data_encrypted = $2
WHERE id = $1
"#,
)
.bind(id)
.bind(new_data_encrypted)
.execute(pool)
.await?;
Ok(())
}
pub async fn key_status_credential(pool: &DbPool) -> AppResult<Vec<(String, i64)>> {
let rows = sqlx::query(
r#"
SELECT
COALESCE(
(data_encrypted::jsonb)->'dek'->>'kv',
'invalid'
) AS kek_version,
COUNT(*) AS n
FROM noetl.credential
GROUP BY kek_version
ORDER BY kek_version
"#,
)
.fetch_all(pool)
.await?;
Ok(rows
.into_iter()
.map(|r| {
(
r.get::<String, _>("kek_version"),
r.get::<i64, _>("n"),
)
})
.collect())
}
pub async fn key_status_keychain(pool: &DbPool) -> AppResult<Vec<(String, i64)>> {
let rows = sqlx::query(
r#"
SELECT
COALESCE(
(data_encrypted::jsonb)->'dek'->>'kv',
'invalid'
) AS kek_version,
COUNT(*) AS n
FROM noetl.keychain
GROUP BY kek_version
ORDER BY kek_version
"#,
)
.fetch_all(pool)
.await?;
Ok(rows
.into_iter()
.map(|r| {
(
r.get::<String, _>("kek_version"),
r.get::<i64, _>("n"),
)
})
.collect())
}