diff --git a/Cargo.toml b/Cargo.toml index 800efb7..f6152f6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ sqlx = { version = "0.7", default-features = false, features = [ "sqlite", "macros", "chrono", + "migrate", ] } chrono = { version = "0.4", features = ["serde"] } regex = "1.11" diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..7609593 --- /dev/null +++ b/build.rs @@ -0,0 +1,5 @@ +// generated by `sqlx migrate build-script` +fn main() { + // trigger recompilation when a new migration is added + println!("cargo:rerun-if-changed=migrations"); +} \ No newline at end of file diff --git a/schema.sql b/migrations/1_base.sql similarity index 100% rename from schema.sql rename to migrations/1_base.sql diff --git a/src/db/migrate.rs b/src/db/migrate.rs new file mode 100644 index 0000000..0290c6e --- /dev/null +++ b/src/db/migrate.rs @@ -0,0 +1,19 @@ +use rocket::{fairing, Build, Rocket}; +use rocket_db_pools::Database; + +use super::schema::DollTags; + +pub async fn run_migrations(rocket: Rocket) -> fairing::Result { + let db = match DollTags::fetch(&rocket) { + Some(v) => v, + None => return Err(rocket), + }; + + match sqlx::migrate!().run(&**db).await { + Ok(_) => Ok(rocket), + Err(e) => { + error!("Failed to update database\n{:?}", e); + Err(rocket) + } + } +} diff --git a/src/db/mod.rs b/src/db/mod.rs index 8867045..9dfb52a 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -1,2 +1,3 @@ pub mod doll; +pub mod migrate; pub mod schema; diff --git a/src/main.rs b/src/main.rs index c9662ab..667341e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,9 +3,11 @@ extern crate rocket; use std::collections::HashMap; use db::doll::{self, check_ids}; +use db::migrate::run_migrations; use db::schema::{CreateDollProfile, DollTags, DollTagsDb}; use regex::Regex; use rng::generate_ids; +use rocket::fairing::AdHoc; use rocket::form::Form; use rocket::fs::{relative, FileServer}; use rocket::response::Redirect; @@ -152,9 +154,7 @@ async fn show_profile( ident: Option<&str>, microchip_id: Option<&str>, ) -> Result { - let internal_id = ident - .and_then(|v| id_public_to_db(v)) - .unwrap_or(0); + let internal_id = ident.and_then(|v| id_public_to_db(v)).unwrap_or(0); let microchip_id = microchip_id.unwrap_or(""); println!("id: {}\nmicrochip id: {}", internal_id, microchip_id); @@ -191,6 +191,7 @@ fn rocket() -> _ { }); })) .attach(DollTags::init()) + .attach(AdHoc::try_on_ignite("SQLx migrations", run_migrations)) .mount("/assets", FileServer::from(relative!("/assets"))) .mount( "/",