diff --git a/Cargo.lock b/Cargo.lock index 6053171..6d88679 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "anyhow" -version = "1.0.68" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61" +checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800" [[package]] name = "async-trait" @@ -191,6 +191,17 @@ dependencies = [ "syn", ] +[[package]] +name = "diesel_migrations" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9ae22beef5e9d6fab9225ddb073c1c6c1a7a6ded5019d5da11d1e5c5adc34e2" +dependencies = [ + "diesel", + "migrations_internals", + "migrations_macros", +] + [[package]] name = "dirs" version = "4.0.0" @@ -361,6 +372,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "856b5cb0902c2b6d65d5fd97dfa30f9b70c7538e770b98eab5ed52d8db923e01" + [[package]] name = "hostname" version = "0.3.1" @@ -414,9 +431,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.23" +version = "0.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c" +checksum = "5e011372fa0b68db8350aa7a248930ecc7839bf46d8485577d69f117a75f164c" dependencies = [ "bytes", "futures-channel", @@ -476,14 +493,14 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dfb6c8100ccc63462345b67d1bbc3679177c75ee4bf59bf29c8b1d110b8189" +checksum = "22e18b0a45d56fe973d6db23972bf5bc46f988a4a2385deac9cc29572f09daef" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.0", "io-lifetimes", "rustix", - "windows-sys 0.42.0", + "windows-sys 0.45.0", ] [[package]] @@ -571,6 +588,27 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +[[package]] +name = "migrations_internals" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c493c09323068c01e54c685f7da41a9ccf9219735c3766fbfd6099806ea08fbc" +dependencies = [ + "serde", + "toml 0.5.11", +] + +[[package]] +name = "migrations_macros" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a8ff27a350511de30cdabb77147501c36ef02e0451d957abea2f30caffb2b58" +dependencies = [ + "migrations_internals", + "proc-macro2", + "quote", +] + [[package]] name = "mime" version = "0.3.16" @@ -648,7 +686,7 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" dependencies = [ - "hermit-abi", + "hermit-abi 0.2.6", "libc", ] @@ -817,9 +855,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.50" +version = "1.0.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2" +checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" dependencies = [ "unicode-ident", ] @@ -881,16 +919,16 @@ dependencies = [ [[package]] name = "rustix" -version = "0.36.7" +version = "0.36.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fdebc4b395b7fbb9ab11e462e20ed9051e7b16e42d24042c776eca0ac81b03" +checksum = "f43abb88211988493c1abb44a70efa56ff0ce98f233b7b276146f1f3f7ba9644" dependencies = [ "bitflags", "errno", "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.42.0", + "windows-sys 0.45.0", ] [[package]] @@ -974,9 +1012,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.91" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883" +checksum = "7434af0dc1cbd59268aa98b4c22c131c0584d2232f6fb166efb993e2832e896a" dependencies = [ "itoa", "ryu", @@ -1169,9 +1207,9 @@ dependencies = [ [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" @@ -1204,6 +1242,15 @@ dependencies = [ "syn", ] +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + [[package]] name = "toml" version = "0.6.0" @@ -1414,11 +1461,12 @@ dependencies = [ "axum", "clap", "diesel", + "diesel_migrations", "lettre", "serde", "time", "tokio", - "toml", + "toml 0.6.0", "tower", "tower-http", "tracing", diff --git a/Cargo.toml b/Cargo.toml index 3b358cf..dc0b957 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,7 @@ tracing-subscriber = "0.3" time = { version = "0.3", features = ["serde-human-readable"] } lettre = { version = "0.10", features = ["tracing"] } diesel = { version = "2", features = ["postgres", "r2d2", "time"] } +diesel_migrations = "2" serde = { version = "1", features = ["derive"] } toml = "0.6" clap = { version = "4", features = ["derive"] } diff --git a/src/main.rs b/src/main.rs index 771ad32..32d25c9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,11 @@ -use anyhow::{Error, Result}; +use anyhow::{anyhow, Error, Result}; use axum::{routing::post, Router}; use clap::Parser; use diesel::{ prelude::*, r2d2::{ConnectionManager, Pool}, }; +use diesel_migrations::{embed_migrations, EmbeddedMigrations, MigrationHarness}; use lettre::{Message, SmtpTransport, Transport}; use std::{env, net::SocketAddr, sync::Arc, thread::JoinHandle, time::Duration}; use time::OffsetDateTime; @@ -22,6 +23,8 @@ use args::Args; use config::Config; use models::{NewReminder, Reminder}; +pub const MIGRATIONS: EmbeddedMigrations = embed_migrations!(); + fn get_connection_pool(config: &Config) -> Result>> { Ok( Pool::builder().build(ConnectionManager::::new(format!( @@ -104,6 +107,11 @@ async fn main() -> Result<()> { let config = Config::load_config(args.config)?; let mut db_pool = get_connection_pool(&config)?; + trace!(migrations = ?db_pool + .get()? + .run_pending_migrations(MIGRATIONS) + .map_err(|e| anyhow!(e)), "running database migrations"); + let reminder = std::thread::spawn(move || -> Result<(), Error> { let mailer = SmtpTransport::unencrypted_localhost(); @@ -111,6 +119,7 @@ async fn main() -> Result<()> { remind(&mut db_pool, &mailer)?; } }); + let db_pool = get_connection_pool(&config)?; let app = Router::new() .route("/v1/reminder", post(api::create_reminder))