70 lines
2.1 KiB
Rust
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(()))
|
|
}
|
|
}
|