use anyhow::{Context, Result};
use deadpool_sqlite::Pool;
use rusqlite::OptionalExtension;
use rusqlite::params;
use crate::db::database::interact_err;
pub struct DiscordToolCardRepository {
pool: Pool,
}
impl DiscordToolCardRepository {
pub fn new(pool: Pool) -> Self {
Self { pool }
}
pub async fn get(&self, message_id: u64) -> Result<Option<String>> {
let id = message_id.to_string();
self.pool
.get()
.await
.context("Failed to get connection")?
.interact(move |conn| {
conn.query_row(
"SELECT state FROM discord_tool_cards WHERE message_id = ?1",
params![id],
|row| row.get(0),
)
.optional()
})
.await
.map_err(interact_err)?
.context("Failed to read tool card")
}
pub async fn set(&self, message_id: u64, state: &str) -> Result<()> {
let id = message_id.to_string();
let state = state.to_string();
self.pool
.get()
.await
.context("Failed to get connection")?
.interact(move |conn| {
conn.execute(
"INSERT INTO discord_tool_cards (message_id, state, updated_at) \
VALUES (?1, ?2, strftime('%s','now')) \
ON CONFLICT(message_id) DO UPDATE SET \
state = excluded.state, \
updated_at = excluded.updated_at",
params![id, state],
)
})
.await
.map_err(interact_err)?
.context("Failed to write tool card")?;
Ok(())
}
}