bridge_common/repo/
settings.rsuse chrono::Utc;
use serde_json::Value;
use sqlx::{query, query_as, Executor, Postgres};
use crate::{settings::Settings, types::Result};
struct SettingsRow {
value: Value,
}
pub async fn get<'a, E>(executor: E, company_id: i32) -> Result<Settings>
where
E: Executor<'a, Database = Postgres> + std::marker::Copy,
{
match query_as!(
SettingsRow,
"SELECT value FROM settings WHERE company_id = $1 LIMIT 1",
company_id,
)
.fetch_optional(executor)
.await?
{
Some(row) => Ok(Settings::try_from(row.value)?),
None => {
let settings = Settings::default();
insert(executor, company_id, &settings).await?;
Ok(settings)
}
}
}
pub async fn insert<'a, E>(executor: E, company_id: i32, settings: &Settings) -> Result<()>
where
E: Executor<'a, Database = Postgres>,
{
query!(
"INSERT INTO settings (company_id, value, created_at, updated_at) VALUES ($1, $2, $3, $4)",
company_id,
serde_json::to_value(settings)?,
Utc::now(),
Utc::now(),
)
.execute(executor)
.await?;
Ok(())
}
pub async fn update<'a, E>(executor: E, company_id: i32, settings: &Settings) -> Result<()>
where
E: Executor<'a, Database = Postgres>,
{
query!(
"UPDATE settings SET value = $1, updated_at = $2 WHERE company_id = $3",
serde_json::to_value(settings)?,
Utc::now(),
company_id,
)
.execute(executor)
.await?;
Ok(())
}