diff --git a/Cargo.lock b/Cargo.lock index e85e215..b879652 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -220,8 +220,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" dependencies = [ "iana-time-zone", + "js-sys", "num-integer", "num-traits", + "time 0.1.45", + "wasm-bindgen", "winapi 0.3.9", ] @@ -281,7 +284,7 @@ dependencies = [ "rand", "sha2", "subtle", - "time", + "time 0.3.20", "version_check", ] @@ -523,6 +526,7 @@ dependencies = [ "rocket", "rocket_db_pools", "rocket_dyn_templates", + "settings", ] [[package]] @@ -740,7 +744,7 @@ checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] @@ -1238,7 +1242,7 @@ checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" dependencies = [ "libc", "log", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.45.0", ] @@ -1782,7 +1786,7 @@ dependencies = [ "serde", "state", "tempfile", - "time", + "time 0.3.20", "tokio", "tokio-stream", "tokio-util", @@ -1864,7 +1868,7 @@ dependencies = [ "smallvec", "stable-pattern", "state", - "time", + "time 0.3.20", "tokio", "uncased", ] @@ -1976,6 +1980,15 @@ dependencies = [ "serde", ] +[[package]] +name = "settings" +version = "0.0.0" +dependencies = [ + "chrono", + "database", + "thiserror", +] + [[package]] name = "sha2" version = "0.10.6" @@ -2280,6 +2293,17 @@ dependencies = [ "once_cell", ] +[[package]] +name = "time" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi 0.3.9", +] + [[package]] name = "time" version = "0.3.20" @@ -2663,6 +2687,12 @@ dependencies = [ "try-lock", ] +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" diff --git a/crates/ezidam/Cargo.toml b/crates/ezidam/Cargo.toml index 8fb2050..4449812 100644 --- a/crates/ezidam/Cargo.toml +++ b/crates/ezidam/Cargo.toml @@ -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" } \ No newline at end of file +database_pool = { path = "../database_pool" } +settings = { path = "../settings" } diff --git a/crates/ezidam/src/database.rs b/crates/ezidam/src/database.rs index 03a6b1f..b2d8272 100644 --- a/crates/ezidam/src/database.rs +++ b/crates/ezidam/src/database.rs @@ -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) } } diff --git a/crates/settings/Cargo.toml b/crates/settings/Cargo.toml new file mode 100644 index 0000000..55542f7 --- /dev/null +++ b/crates/settings/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "settings" +version = "0.0.0" +edition = "2021" + +[dependencies] +database = { path = "../database" } +thiserror = { workspace = true } +chrono = { workspace = true } \ No newline at end of file diff --git a/crates/settings/src/lib.rs b/crates/settings/src/lib.rs new file mode 100644 index 0000000..ef95367 --- /dev/null +++ b/crates/settings/src/lib.rs @@ -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, + updated_at: DateTime, + business_name: String, + business_logo: Vec, +} + +const DEFAULT_BUSINESS_NAME: &str = "ezidam"; +const DEFAULT_BUSINESS_LOGO: &[u8] = include_bytes!("../../../logo/ezidam.png"); + +impl From 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, Error> { + Ok(DatabaseSettings::init(conn).await?) + } + + pub async fn get(conn: impl SqliteExecutor<'_>) -> Result { + 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(()) + } +} diff --git a/logo/ezidam.png b/logo/ezidam.png new file mode 100644 index 0000000..6f94907 Binary files /dev/null and b/logo/ezidam.png differ diff --git a/logo/readme.md b/logo/readme.md new file mode 100644 index 0000000..0ca9c98 --- /dev/null +++ b/logo/readme.md @@ -0,0 +1,10 @@ +# logo + +## colors + +- the blue is `#3a88fe` + +## `logo.png` + +this file is used when building the project, compilation will fail if this file is not present +