added settings crate, creating settings on web startup
This commit is contained in:
parent
9c2b43ec3c
commit
a85c1431c8
7 changed files with 148 additions and 7 deletions
|
|
@ -10,4 +10,5 @@ rocket_dyn_templates = { version = "0.1.0-rc.2", features = ["tera"] }
|
|||
infer = { version = "0.12.0", default-features = false }
|
||||
|
||||
# local crates
|
||||
database_pool = { path = "../database_pool" }
|
||||
database_pool = { path = "../database_pool" }
|
||||
settings = { path = "../settings" }
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ use database_pool::run_migrations;
|
|||
use rocket::fairing::AdHoc;
|
||||
use rocket::{error, fairing, info, Build, Rocket};
|
||||
use rocket_db_pools::{sqlx, Database as RocketDatabase};
|
||||
use settings::Settings;
|
||||
|
||||
#[derive(RocketDatabase)]
|
||||
#[database("ezidam")]
|
||||
|
|
@ -25,10 +26,26 @@ impl Database {
|
|||
match run_migrations(&db.0).await {
|
||||
Ok(()) => {
|
||||
info!("Migrations ran successfully");
|
||||
Ok(rocket)
|
||||
}
|
||||
Err(e) => {
|
||||
error!("Failed to run migrations: {}", e);
|
||||
return Err(rocket);
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize settings
|
||||
match Settings::init(&db.0).await {
|
||||
Ok(insertion) => {
|
||||
if insertion.is_some() {
|
||||
// This should happen only once in the lifetime of the database
|
||||
info!("Created settings in database");
|
||||
} else {
|
||||
info!("Found existing settings in database");
|
||||
}
|
||||
Ok(rocket)
|
||||
}
|
||||
Err(e) => {
|
||||
error!("Failed to interact with settings: {}", e);
|
||||
Err(rocket)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
9
crates/settings/Cargo.toml
Normal file
9
crates/settings/Cargo.toml
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
[package]
|
||||
name = "settings"
|
||||
version = "0.0.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
database = { path = "../database" }
|
||||
thiserror = { workspace = true }
|
||||
chrono = { workspace = true }
|
||||
74
crates/settings/src/lib.rs
Normal file
74
crates/settings/src/lib.rs
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
use chrono::{DateTime, Utc};
|
||||
use database::sqlx::SqliteExecutor;
|
||||
use database::Settings as DatabaseSettings;
|
||||
|
||||
// error
|
||||
#[derive(thiserror::Error)]
|
||||
// the rest
|
||||
#[derive(Debug)]
|
||||
pub enum Error {
|
||||
#[error("Database: {0}")]
|
||||
Database(#[from] database::Error),
|
||||
}
|
||||
|
||||
// the rest
|
||||
#[derive(Debug)]
|
||||
pub struct Settings {
|
||||
created_at: DateTime<Utc>,
|
||||
updated_at: DateTime<Utc>,
|
||||
business_name: String,
|
||||
business_logo: Vec<u8>,
|
||||
}
|
||||
|
||||
const DEFAULT_BUSINESS_NAME: &str = "ezidam";
|
||||
const DEFAULT_BUSINESS_LOGO: &[u8] = include_bytes!("../../../logo/ezidam.png");
|
||||
|
||||
impl From<DatabaseSettings> for Settings {
|
||||
fn from(db: DatabaseSettings) -> Self {
|
||||
Self {
|
||||
created_at: db.created_at,
|
||||
updated_at: db.updated_at,
|
||||
business_name: db
|
||||
.business_name
|
||||
.unwrap_or_else(|| DEFAULT_BUSINESS_NAME.into()),
|
||||
business_logo: db
|
||||
.business_logo
|
||||
.unwrap_or_else(|| DEFAULT_BUSINESS_LOGO.to_vec()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Settings {
|
||||
pub fn business_logo(&self) -> &[u8] {
|
||||
self.business_logo.as_slice()
|
||||
}
|
||||
}
|
||||
|
||||
impl Settings {
|
||||
pub async fn init(conn: impl SqliteExecutor<'_>) -> Result<Option<()>, Error> {
|
||||
Ok(DatabaseSettings::init(conn).await?)
|
||||
}
|
||||
|
||||
pub async fn get(conn: impl SqliteExecutor<'_>) -> Result<Self, Error> {
|
||||
Ok(DatabaseSettings::get(conn).await.map(Self::from)?)
|
||||
}
|
||||
|
||||
pub async fn set_business_name(
|
||||
conn: impl SqliteExecutor<'_>,
|
||||
business_name: &str,
|
||||
) -> Result<(), Error> {
|
||||
DatabaseSettings::set_business_name(conn, Some(business_name)).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// **Warning**: No checks are performed, make sure the bytes are safe!
|
||||
pub async fn set_business_logo(
|
||||
conn: impl SqliteExecutor<'_>,
|
||||
business_logo: &[u8],
|
||||
) -> Result<(), Error> {
|
||||
DatabaseSettings::set_business_logo(conn, Some(business_logo)).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue