From 15e41724481f3538f00caa51e663d20f9b82a2bf Mon Sep 17 00:00:00 2001 From: Mia Date: Sun, 13 Jul 2025 12:59:24 +0100 Subject: [PATCH] feat(parakeet): run database migrations from within parakeet --- Cargo.lock | 99 +++++++++++++++++++++++++++++++++++++++--- parakeet/Cargo.toml | 3 +- parakeet/src/config.rs | 2 + parakeet/src/main.rs | 15 +++++++ 4 files changed, 112 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 84864de7..d30d7a73 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1080,6 +1080,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" @@ -1308,7 +1319,7 @@ dependencies = [ "atomic", "pear", "serde", - "toml", + "toml 0.8.19", "uncased", "version_check", ] @@ -2390,6 +2401,27 @@ dependencies = [ "sketches-ddsketch", ] +[[package]] +name = "migrations_internals" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bda1634d70d5bd53553cf15dca9842a396e8c799982a3ad22998dc44d961f24" +dependencies = [ + "serde", + "toml 0.9.2", +] + +[[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" @@ -2663,6 +2695,7 @@ dependencies = [ "did-resolver", "diesel", "diesel-async", + "diesel_migrations", "eyre", "figment", "itertools 0.14.0", @@ -3655,6 +3688,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -4132,11 +4174,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" dependencies = [ "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.8", + "toml_datetime 0.6.8", "toml_edit", ] +[[package]] +name = "toml" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed0aee96c12fa71097902e0bb061a5e1ebd766a6636bb605ba401c45c1650eac" +dependencies = [ + "indexmap", + "serde", + "serde_spanned 1.0.0", + "toml_datetime 0.7.0", + "toml_parser", + "toml_writer", + "winnow 0.7.12", +] + [[package]] name = "toml_datetime" version = "0.6.8" @@ -4146,6 +4203,15 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" +dependencies = [ + "serde", +] + [[package]] name = "toml_edit" version = "0.22.22" @@ -4154,11 +4220,26 @@ checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap", "serde", - "serde_spanned", - "toml_datetime", - "winnow", + "serde_spanned 0.6.8", + "toml_datetime 0.6.8", + "winnow 0.6.24", ] +[[package]] +name = "toml_parser" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97200572db069e74c512a14117b296ba0a80a30123fbbb5aa1f4a348f639ca30" +dependencies = [ + "winnow 0.7.12", +] + +[[package]] +name = "toml_writer" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" + [[package]] name = "tonic" version = "0.13.0" @@ -4853,6 +4934,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" + [[package]] name = "winreg" version = "0.50.0" diff --git a/parakeet/Cargo.toml b/parakeet/Cargo.toml index 035fcc9f..59b3cef7 100644 --- a/parakeet/Cargo.toml +++ b/parakeet/Cargo.toml @@ -13,7 +13,8 @@ dataloader = { path = "../dataloader-rs", default-features = false, features = [ deadpool = { version = "0.12.1", features = ["managed"] } did-resolver = { path = "../did-resolver" } diesel = { version = "2.2.6", features = ["chrono", "serde_json"] } -diesel-async = { version = "0.5.2", features = ["deadpool", "postgres"] } +diesel_migrations = "2.2" +diesel-async = { version = "0.5.2", features = ["deadpool", "postgres", "async-connection-wrapper"] } eyre = "0.6.12" figment = { version = "0.10.19", features = ["env", "toml"] } itertools = "0.14.0" diff --git a/parakeet/src/config.rs b/parakeet/src/config.rs index ec1eb306..d0704882 100644 --- a/parakeet/src/config.rs +++ b/parakeet/src/config.rs @@ -24,6 +24,8 @@ pub struct Config { #[serde(default)] pub cdn: ConfigCdn, pub did_allowlist: Option>, + #[serde(default)] + pub migrate: bool, } #[derive(Debug, Deserialize)] diff --git a/parakeet/src/main.rs b/parakeet/src/main.rs index f86aeab6..6ee17ef4 100644 --- a/parakeet/src/main.rs +++ b/parakeet/src/main.rs @@ -1,10 +1,14 @@ +use diesel_async::async_connection_wrapper::AsyncConnectionWrapper; use diesel_async::pooled_connection::deadpool::Pool; use diesel_async::pooled_connection::AsyncDieselConnectionManager; use diesel_async::AsyncPgConnection; +use diesel_migrations::{embed_migrations, EmbeddedMigrations, MigrationHarness}; use std::sync::Arc; use tower_http::cors::{AllowHeaders, AllowOrigin, CorsLayer}; use tower_http::trace::TraceLayer; +const MIGRATIONS: EmbeddedMigrations = embed_migrations!(); + mod config; mod db; mod hydration; @@ -30,6 +34,17 @@ async fn main() -> eyre::Result<()> { let db_mgr = AsyncDieselConnectionManager::::new(&conf.database_url); let pool = Pool::builder(db_mgr).build()?; + if conf.migrate { + tracing::info!("migrating database"); + let conn = pool.get().await?; + tokio::task::spawn_blocking(move || { + let mut aw = AsyncConnectionWrapper::<_>::from(conn); + aw.run_pending_migrations(MIGRATIONS).unwrap(); + }) + .await?; + tracing::info!("database migrations complete"); + } + let index_client = parakeet_index::Client::connect(conf.index_uri).await?; let dataloaders = Arc::new(loaders::Dataloaders::new( -- 2.51.2