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, pub updated_at: DateTime, pub business_name: Option, pub business_logo: Option>, pub url: Option, pub first_admin: Option, } impl Settings { pub async fn init(conn: impl SqliteExecutor<'_>) -> Result, 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 { 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, 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, 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, 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(())) } pub async fn set_url(conn: impl SqliteExecutor<'_>, url: &str) -> Result, Error> { let query: SqliteQueryResult = sqlx::query_file!("queries/settings/set_url.sql", url) .execute(conn) .await .map_err(handle_error)?; Ok((query.rows_affected() == 1).then_some(())) } }