ezidam/crates/database/src/tables/settings.rs

70 lines
2.1 KiB
Rust

use crate::error::{handle_error, Error};
use sqlx::sqlite::SqliteQueryResult;
use sqlx::types::chrono::{DateTime, Utc};
use sqlx::{FromRow, SqliteExecutor};
#[derive(FromRow)]
pub struct Settings {
pub id: i64,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub business_name: Option<String>,
pub business_logo: Option<Vec<u8>>,
}
impl Settings {
pub async fn init(conn: impl SqliteExecutor<'_>) -> Result<Option<()>, Error> {
let query: SqliteQueryResult = sqlx::query_file!("queries/settings/init.sql")
.execute(conn)
.await
.map_err(handle_error)?;
Ok((query.rows_affected() == 1).then_some(()))
}
pub async fn get(conn: impl SqliteExecutor<'_>) -> Result<Self, Error> {
sqlx::query_file_as!(Self, "queries/settings/get.sql")
.fetch_one(conn)
.await
.map_err(handle_error)
}
pub async fn set_business_name(
conn: impl SqliteExecutor<'_>,
value: Option<&str>,
) -> Result<Option<()>, Error> {
let query: SqliteQueryResult =
sqlx::query_file!("queries/settings/set_business_name.sql", value)
.execute(conn)
.await
.map_err(handle_error)?;
Ok((query.rows_affected() == 1).then_some(()))
}
pub async fn set_business_logo(
conn: impl SqliteExecutor<'_>,
value: Option<&[u8]>,
) -> Result<Option<()>, Error> {
let query: SqliteQueryResult =
sqlx::query_file!("queries/settings/set_business_logo.sql", value)
.execute(conn)
.await
.map_err(handle_error)?;
Ok((query.rows_affected() == 1).then_some(()))
}
pub async fn set_first_admin(
conn: impl SqliteExecutor<'_>,
id: &str,
) -> Result<Option<()>, Error> {
let query: SqliteQueryResult =
sqlx::query_file!("queries/settings/set_first_admin.sql", id)
.execute(conn)
.await
.map_err(handle_error)?;
Ok((query.rows_affected() == 1).then_some(()))
}
}