diff --git a/Cargo.lock b/Cargo.lock index 58b88ae..5599982 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -871,6 +871,17 @@ dependencies = [ "syn", ] +[[package]] +name = "diesel_migrations" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a73ce704bad4231f001bff3314d91dce4aba0770cee8b233991859abc15c1f6" +dependencies = [ + "diesel", + "migrations_internals", + "migrations_macros", +] + [[package]] name = "diesel_table_macro_syntax" version = "0.2.0" @@ -1783,6 +1794,27 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "migrations_internals" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd01039851e82f8799046eabbb354056283fb265c8ec0996af940f4e85a380ff" +dependencies = [ + "serde", + "toml", +] + +[[package]] +name = "migrations_macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb161cc72176cb37aa47f1fc520d3ef02263d67d661f44f05d05a079e1237fd" +dependencies = [ + "migrations_internals", + "proc-macro2", + "quote", +] + [[package]] name = "mime" version = "0.3.17" @@ -2602,6 +2634,7 @@ dependencies = [ "console_error_panic_hook", "deadpool-diesel", "diesel", + "diesel_migrations", "dotenvy", "futures", "lettre", diff --git a/Cargo.toml b/Cargo.toml index b57a7cf..cca7d2d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,3 +33,4 @@ tower = "0.5.2" regex = "1.11.1" lettre = { version = "0.11.12", features = ["tokio1", "serde", "tracing", "tokio1-native-tls"] } clap = { version = "4.5.31", features = ["derive"] } +diesel_migrations = { version = "2.2.0", features = ["postgres"] } diff --git a/src/main.rs b/src/main.rs index 6e1bc4e..2817998 100644 --- a/src/main.rs +++ b/src/main.rs @@ -25,6 +25,7 @@ use std::process::exit; use chrono::{TimeDelta, Utc}; use clap::{Parser, Subcommand}; +use diesel_migrations::{embed_migrations, EmbeddedMigrations, MigrationHarness}; use email::SmtpOptions; use tokio::time::sleep; use tracing_subscriber::EnvFilter; @@ -71,6 +72,7 @@ async fn main() { let db_pool = deadpool_diesel::postgres::Pool::builder(manager) .build() .unwrap(); + let session_store = PgStore::new(db_pool.clone()); let reqwest_client = reqwest::ClientBuilder::new() .https_only(true) @@ -94,6 +96,16 @@ async fn main() { exit(1); }; + if settings.run_database_migrations == Some(1) { + const MIGRATIONS: EmbeddedMigrations = embed_migrations!("migrations/"); + // Run migrations on server startup + let conn = db_pool.get().await.unwrap(); + conn.interact(|conn| conn.run_pending_migrations(MIGRATIONS).map(|_| ())) + .await + .unwrap() + .unwrap(); + } + let app_state = AppState { db_pool: db_pool.clone(), mailer, diff --git a/src/settings.rs b/src/settings.rs index 45e6ae0..9dc0b7f 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -13,6 +13,11 @@ pub struct Settings { pub database_url: String, + /** + * When set to 1, embedded Diesel migrations will be run on startup. + */ + pub run_database_migrations: Option, + #[serde(default = "default_host")] pub host: String,