From 47c59902181b6f81b046f9c471780efd85fd708f Mon Sep 17 00:00:00 2001 From: alyssa Date: Thu, 24 Jul 2025 01:36:04 +0000 Subject: [PATCH] chore: move migrations to rust also adds some basic test seed data --- Cargo.lock | 11 +++ PluralKit.Bot/Init.cs | 10 --- ci/Dockerfile.rust | 2 + ci/rust-docker-target.sh | 1 + crates/h | 0 crates/migrate/Cargo.toml | 12 ++++ crates/migrate/build.rs | 55 +++++++++++++++ .../migrate/data}/clean.sql | 0 .../migrate/data}/functions.sql | 0 .../migrate/data/migrations}/0.sql | 0 .../migrate/data/migrations}/1.sql | 0 .../migrate/data/migrations}/10.sql | 0 .../migrate/data/migrations}/11.sql | 0 .../migrate/data/migrations}/12.sql | 0 .../migrate/data/migrations}/13.sql | 0 .../migrate/data/migrations}/14.sql | 0 .../migrate/data/migrations}/15.sql | 0 .../migrate/data/migrations}/16.sql | 0 .../migrate/data/migrations}/17.sql | 0 .../migrate/data/migrations}/18.sql | 0 .../migrate/data/migrations}/19.sql | 0 .../migrate/data/migrations}/2.sql | 0 .../migrate/data/migrations}/20.sql | 0 .../migrate/data/migrations}/21.sql | 0 .../migrate/data/migrations}/22.sql | 0 .../migrate/data/migrations}/23.sql | 0 .../migrate/data/migrations}/24.sql | 0 .../migrate/data/migrations}/25.sql | 0 .../migrate/data/migrations}/26.sql | 0 .../migrate/data/migrations}/27.sql | 0 .../migrate/data/migrations}/28.sql | 0 .../migrate/data/migrations}/29.sql | 0 .../migrate/data/migrations}/3.sql | 0 .../migrate/data/migrations}/30.sql | 0 .../migrate/data/migrations}/31.sql | 0 .../migrate/data/migrations}/32.sql | 0 .../migrate/data/migrations}/33.sql | 0 .../migrate/data/migrations}/34.sql | 0 .../migrate/data/migrations}/35.sql | 0 .../migrate/data/migrations}/36.sql | 0 .../migrate/data/migrations}/37.sql | 0 .../migrate/data/migrations}/38.sql | 0 .../migrate/data/migrations}/39.sql | 0 .../migrate/data/migrations}/4.sql | 0 .../migrate/data/migrations}/40.sql | 0 .../migrate/data/migrations}/41.sql | 0 .../migrate/data/migrations}/42.sql | 0 .../migrate/data/migrations}/43.sql | 0 .../migrate/data/migrations}/44.sql | 0 .../migrate/data/migrations}/45.sql | 0 .../migrate/data/migrations}/46.sql | 0 .../migrate/data/migrations}/47.sql | 0 .../migrate/data/migrations}/48.sql | 0 .../migrate/data/migrations}/49.sql | 0 .../migrate/data/migrations}/5.sql | 0 .../migrate/data/migrations}/50.sql | 0 .../migrate/data/migrations}/51.sql | 0 .../migrate/data/migrations}/52.sql | 0 .../migrate/data/migrations}/6.sql | 0 .../migrate/data/migrations}/7.sql | 0 .../migrate/data/migrations}/8.sql | 0 .../migrate/data/migrations}/9.sql | 0 crates/migrate/data/seed.sql | 8 +++ .../Views => crates/migrate/data}/views.sql | 0 crates/migrate/src/main.rs | 70 +++++++++++++++++++ docker-compose.yml | 14 ++++ 66 files changed, 173 insertions(+), 10 deletions(-) create mode 100644 crates/h create mode 100644 crates/migrate/Cargo.toml create mode 100644 crates/migrate/build.rs rename {PluralKit.Core/Database => crates/migrate/data}/clean.sql (100%) rename {PluralKit.Core/Database/Functions => crates/migrate/data}/functions.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/0.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/1.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/10.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/11.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/12.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/13.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/14.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/15.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/16.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/17.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/18.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/19.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/2.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/20.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/21.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/22.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/23.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/24.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/25.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/26.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/27.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/28.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/29.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/3.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/30.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/31.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/32.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/33.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/34.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/35.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/36.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/37.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/38.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/39.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/4.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/40.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/41.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/42.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/43.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/44.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/45.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/46.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/47.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/48.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/49.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/5.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/50.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/51.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/52.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/6.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/7.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/8.sql (100%) rename {PluralKit.Core/Database/Migrations => crates/migrate/data/migrations}/9.sql (100%) create mode 100644 crates/migrate/data/seed.sql rename {PluralKit.Core/Database/Views => crates/migrate/data}/views.sql (100%) create mode 100644 crates/migrate/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index e50bf992..96bb2e24 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2185,6 +2185,17 @@ dependencies = [ "sketches-ddsketch", ] +[[package]] +name = "migrate" +version = "0.1.0" +dependencies = [ + "anyhow", + "libpk", + "sqlx", + "tokio", + "tracing", +] + [[package]] name = "mime" version = "0.3.17" diff --git a/PluralKit.Bot/Init.cs b/PluralKit.Bot/Init.cs index bf48d6c4..25b98f1b 100644 --- a/PluralKit.Bot/Init.cs +++ b/PluralKit.Bot/Init.cs @@ -57,16 +57,6 @@ public class Init var cache = services.Resolve(); - if (config.Cluster == null) - { - // "Connect to the database" (ie. set off database migrations and ensure state) - logger.Information("Connecting to database"); - await services.Resolve().ApplyMigrations(); - - // Clear shard status from Redis - await redis.Connection.GetDatabase().KeyDeleteAsync("pluralkit:shardstatus"); - } - logger.Information("Initializing bot"); var bot = services.Resolve(); diff --git a/ci/Dockerfile.rust b/ci/Dockerfile.rust index b035cfcf..e320fb00 100644 --- a/ci/Dockerfile.rust +++ b/ci/Dockerfile.rust @@ -25,6 +25,7 @@ COPY Cargo.lock /build/ COPY crates/ /build/crates +RUN cargo build --bin migrate --release --target x86_64-unknown-linux-musl RUN cargo build --bin api --release --target x86_64-unknown-linux-musl RUN cargo build --bin dispatch --release --target x86_64-unknown-linux-musl RUN cargo build --bin gateway --release --target x86_64-unknown-linux-musl @@ -35,6 +36,7 @@ RUN cargo build --bin gdpr_worker --release --target x86_64-unknown-linux-musl FROM alpine:latest +COPY --from=binary-builder /build/target/x86_64-unknown-linux-musl/release/migrate /migrate COPY --from=binary-builder /build/target/x86_64-unknown-linux-musl/release/api /api COPY --from=binary-builder /build/target/x86_64-unknown-linux-musl/release/dispatch /dispatch COPY --from=binary-builder /build/target/x86_64-unknown-linux-musl/release/gateway /gateway diff --git a/ci/rust-docker-target.sh b/ci/rust-docker-target.sh index 501f65c2..ba6df5e9 100755 --- a/ci/rust-docker-target.sh +++ b/ci/rust-docker-target.sh @@ -37,6 +37,7 @@ EOF } # add rust binaries here to build +build migrate build api build dispatch build gateway diff --git a/crates/h b/crates/h new file mode 100644 index 00000000..e69de29b diff --git a/crates/migrate/Cargo.toml b/crates/migrate/Cargo.toml new file mode 100644 index 00000000..cf4eff2d --- /dev/null +++ b/crates/migrate/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "migrate" +version = "0.1.0" +edition = "2021" + +[dependencies] +libpk = { path = "../libpk" } + +anyhow = { workspace = true } +sqlx = { workspace = true } +tokio = { workspace = true } +tracing = { workspace = true } diff --git a/crates/migrate/build.rs b/crates/migrate/build.rs new file mode 100644 index 00000000..80829b0d --- /dev/null +++ b/crates/migrate/build.rs @@ -0,0 +1,55 @@ +use std::{ + env, + error::Error, + fs::{self, File}, + io::Write, + path::Path, +}; + +fn main() -> Result<(), Box> { + let out_dir = env::var("OUT_DIR")?; + let dest_path = Path::new(&out_dir).join("data.rs"); + let mut datafile = File::create(&dest_path)?; + + let prefix = "../../../../../../crates/migrate/data"; + + let ct = fs::read_dir("data/migrations")? + .filter(|p| { + p.as_ref() + .unwrap() + .file_name() + .into_string() + .unwrap() + .contains(".sql") + }) + .count(); + + writeln!(&mut datafile, "const MIGRATIONS: [&'static str; {ct}] = [")?; + for idx in 0..ct { + writeln!( + &mut datafile, + "\tinclude_str!(\"{prefix}/migrations/{idx}.sql\")," + )?; + } + writeln!(&mut datafile, "];\n")?; + + writeln!( + &mut datafile, + "const CLEAN: &'static str = include_str!(\"{prefix}/clean.sql\");" + )?; + writeln!( + &mut datafile, + "const VIEWS: &'static str = include_str!(\"{prefix}/views.sql\");" + )?; + writeln!( + &mut datafile, + "const FUNCTIONS: &'static str = include_str!(\"{prefix}/functions.sql\");" + )?; + + writeln!( + &mut datafile, + "const SEED: &'static str = include_str!(\"{prefix}/seed.sql\");" + )?; + + Ok(()) +} diff --git a/PluralKit.Core/Database/clean.sql b/crates/migrate/data/clean.sql similarity index 100% rename from PluralKit.Core/Database/clean.sql rename to crates/migrate/data/clean.sql diff --git a/PluralKit.Core/Database/Functions/functions.sql b/crates/migrate/data/functions.sql similarity index 100% rename from PluralKit.Core/Database/Functions/functions.sql rename to crates/migrate/data/functions.sql diff --git a/PluralKit.Core/Database/Migrations/0.sql b/crates/migrate/data/migrations/0.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/0.sql rename to crates/migrate/data/migrations/0.sql diff --git a/PluralKit.Core/Database/Migrations/1.sql b/crates/migrate/data/migrations/1.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/1.sql rename to crates/migrate/data/migrations/1.sql diff --git a/PluralKit.Core/Database/Migrations/10.sql b/crates/migrate/data/migrations/10.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/10.sql rename to crates/migrate/data/migrations/10.sql diff --git a/PluralKit.Core/Database/Migrations/11.sql b/crates/migrate/data/migrations/11.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/11.sql rename to crates/migrate/data/migrations/11.sql diff --git a/PluralKit.Core/Database/Migrations/12.sql b/crates/migrate/data/migrations/12.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/12.sql rename to crates/migrate/data/migrations/12.sql diff --git a/PluralKit.Core/Database/Migrations/13.sql b/crates/migrate/data/migrations/13.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/13.sql rename to crates/migrate/data/migrations/13.sql diff --git a/PluralKit.Core/Database/Migrations/14.sql b/crates/migrate/data/migrations/14.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/14.sql rename to crates/migrate/data/migrations/14.sql diff --git a/PluralKit.Core/Database/Migrations/15.sql b/crates/migrate/data/migrations/15.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/15.sql rename to crates/migrate/data/migrations/15.sql diff --git a/PluralKit.Core/Database/Migrations/16.sql b/crates/migrate/data/migrations/16.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/16.sql rename to crates/migrate/data/migrations/16.sql diff --git a/PluralKit.Core/Database/Migrations/17.sql b/crates/migrate/data/migrations/17.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/17.sql rename to crates/migrate/data/migrations/17.sql diff --git a/PluralKit.Core/Database/Migrations/18.sql b/crates/migrate/data/migrations/18.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/18.sql rename to crates/migrate/data/migrations/18.sql diff --git a/PluralKit.Core/Database/Migrations/19.sql b/crates/migrate/data/migrations/19.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/19.sql rename to crates/migrate/data/migrations/19.sql diff --git a/PluralKit.Core/Database/Migrations/2.sql b/crates/migrate/data/migrations/2.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/2.sql rename to crates/migrate/data/migrations/2.sql diff --git a/PluralKit.Core/Database/Migrations/20.sql b/crates/migrate/data/migrations/20.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/20.sql rename to crates/migrate/data/migrations/20.sql diff --git a/PluralKit.Core/Database/Migrations/21.sql b/crates/migrate/data/migrations/21.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/21.sql rename to crates/migrate/data/migrations/21.sql diff --git a/PluralKit.Core/Database/Migrations/22.sql b/crates/migrate/data/migrations/22.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/22.sql rename to crates/migrate/data/migrations/22.sql diff --git a/PluralKit.Core/Database/Migrations/23.sql b/crates/migrate/data/migrations/23.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/23.sql rename to crates/migrate/data/migrations/23.sql diff --git a/PluralKit.Core/Database/Migrations/24.sql b/crates/migrate/data/migrations/24.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/24.sql rename to crates/migrate/data/migrations/24.sql diff --git a/PluralKit.Core/Database/Migrations/25.sql b/crates/migrate/data/migrations/25.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/25.sql rename to crates/migrate/data/migrations/25.sql diff --git a/PluralKit.Core/Database/Migrations/26.sql b/crates/migrate/data/migrations/26.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/26.sql rename to crates/migrate/data/migrations/26.sql diff --git a/PluralKit.Core/Database/Migrations/27.sql b/crates/migrate/data/migrations/27.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/27.sql rename to crates/migrate/data/migrations/27.sql diff --git a/PluralKit.Core/Database/Migrations/28.sql b/crates/migrate/data/migrations/28.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/28.sql rename to crates/migrate/data/migrations/28.sql diff --git a/PluralKit.Core/Database/Migrations/29.sql b/crates/migrate/data/migrations/29.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/29.sql rename to crates/migrate/data/migrations/29.sql diff --git a/PluralKit.Core/Database/Migrations/3.sql b/crates/migrate/data/migrations/3.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/3.sql rename to crates/migrate/data/migrations/3.sql diff --git a/PluralKit.Core/Database/Migrations/30.sql b/crates/migrate/data/migrations/30.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/30.sql rename to crates/migrate/data/migrations/30.sql diff --git a/PluralKit.Core/Database/Migrations/31.sql b/crates/migrate/data/migrations/31.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/31.sql rename to crates/migrate/data/migrations/31.sql diff --git a/PluralKit.Core/Database/Migrations/32.sql b/crates/migrate/data/migrations/32.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/32.sql rename to crates/migrate/data/migrations/32.sql diff --git a/PluralKit.Core/Database/Migrations/33.sql b/crates/migrate/data/migrations/33.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/33.sql rename to crates/migrate/data/migrations/33.sql diff --git a/PluralKit.Core/Database/Migrations/34.sql b/crates/migrate/data/migrations/34.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/34.sql rename to crates/migrate/data/migrations/34.sql diff --git a/PluralKit.Core/Database/Migrations/35.sql b/crates/migrate/data/migrations/35.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/35.sql rename to crates/migrate/data/migrations/35.sql diff --git a/PluralKit.Core/Database/Migrations/36.sql b/crates/migrate/data/migrations/36.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/36.sql rename to crates/migrate/data/migrations/36.sql diff --git a/PluralKit.Core/Database/Migrations/37.sql b/crates/migrate/data/migrations/37.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/37.sql rename to crates/migrate/data/migrations/37.sql diff --git a/PluralKit.Core/Database/Migrations/38.sql b/crates/migrate/data/migrations/38.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/38.sql rename to crates/migrate/data/migrations/38.sql diff --git a/PluralKit.Core/Database/Migrations/39.sql b/crates/migrate/data/migrations/39.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/39.sql rename to crates/migrate/data/migrations/39.sql diff --git a/PluralKit.Core/Database/Migrations/4.sql b/crates/migrate/data/migrations/4.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/4.sql rename to crates/migrate/data/migrations/4.sql diff --git a/PluralKit.Core/Database/Migrations/40.sql b/crates/migrate/data/migrations/40.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/40.sql rename to crates/migrate/data/migrations/40.sql diff --git a/PluralKit.Core/Database/Migrations/41.sql b/crates/migrate/data/migrations/41.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/41.sql rename to crates/migrate/data/migrations/41.sql diff --git a/PluralKit.Core/Database/Migrations/42.sql b/crates/migrate/data/migrations/42.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/42.sql rename to crates/migrate/data/migrations/42.sql diff --git a/PluralKit.Core/Database/Migrations/43.sql b/crates/migrate/data/migrations/43.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/43.sql rename to crates/migrate/data/migrations/43.sql diff --git a/PluralKit.Core/Database/Migrations/44.sql b/crates/migrate/data/migrations/44.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/44.sql rename to crates/migrate/data/migrations/44.sql diff --git a/PluralKit.Core/Database/Migrations/45.sql b/crates/migrate/data/migrations/45.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/45.sql rename to crates/migrate/data/migrations/45.sql diff --git a/PluralKit.Core/Database/Migrations/46.sql b/crates/migrate/data/migrations/46.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/46.sql rename to crates/migrate/data/migrations/46.sql diff --git a/PluralKit.Core/Database/Migrations/47.sql b/crates/migrate/data/migrations/47.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/47.sql rename to crates/migrate/data/migrations/47.sql diff --git a/PluralKit.Core/Database/Migrations/48.sql b/crates/migrate/data/migrations/48.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/48.sql rename to crates/migrate/data/migrations/48.sql diff --git a/PluralKit.Core/Database/Migrations/49.sql b/crates/migrate/data/migrations/49.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/49.sql rename to crates/migrate/data/migrations/49.sql diff --git a/PluralKit.Core/Database/Migrations/5.sql b/crates/migrate/data/migrations/5.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/5.sql rename to crates/migrate/data/migrations/5.sql diff --git a/PluralKit.Core/Database/Migrations/50.sql b/crates/migrate/data/migrations/50.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/50.sql rename to crates/migrate/data/migrations/50.sql diff --git a/PluralKit.Core/Database/Migrations/51.sql b/crates/migrate/data/migrations/51.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/51.sql rename to crates/migrate/data/migrations/51.sql diff --git a/PluralKit.Core/Database/Migrations/52.sql b/crates/migrate/data/migrations/52.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/52.sql rename to crates/migrate/data/migrations/52.sql diff --git a/PluralKit.Core/Database/Migrations/6.sql b/crates/migrate/data/migrations/6.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/6.sql rename to crates/migrate/data/migrations/6.sql diff --git a/PluralKit.Core/Database/Migrations/7.sql b/crates/migrate/data/migrations/7.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/7.sql rename to crates/migrate/data/migrations/7.sql diff --git a/PluralKit.Core/Database/Migrations/8.sql b/crates/migrate/data/migrations/8.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/8.sql rename to crates/migrate/data/migrations/8.sql diff --git a/PluralKit.Core/Database/Migrations/9.sql b/crates/migrate/data/migrations/9.sql similarity index 100% rename from PluralKit.Core/Database/Migrations/9.sql rename to crates/migrate/data/migrations/9.sql diff --git a/crates/migrate/data/seed.sql b/crates/migrate/data/seed.sql new file mode 100644 index 00000000..27bca359 --- /dev/null +++ b/crates/migrate/data/seed.sql @@ -0,0 +1,8 @@ +-- example data (for integration tests or such) + +insert into systems (hid, token) values ( + 'exmpl', + 'vlPitT0tEgT++a450w1/afODy5NXdALcHDwryX6dOIZdGUGbZg+5IH3nrUsQihsw' +); +insert into system_config (system) values (1); +insert into system_guild (system, guild) values (1, 466707357099884544); diff --git a/PluralKit.Core/Database/Views/views.sql b/crates/migrate/data/views.sql similarity index 100% rename from PluralKit.Core/Database/Views/views.sql rename to crates/migrate/data/views.sql diff --git a/crates/migrate/src/main.rs b/crates/migrate/src/main.rs new file mode 100644 index 00000000..85b15e33 --- /dev/null +++ b/crates/migrate/src/main.rs @@ -0,0 +1,70 @@ +#![feature(let_chains)] + +use tracing::info; + +include!(concat!(env!("OUT_DIR"), "/data.rs")); + +#[libpk::main] +async fn main() -> anyhow::Result<()> { + let db = libpk::db::init_data_db().await?; + + // clean + // get current migration + // migrate to latest + // run views + // run functions + + #[derive(sqlx::FromRow)] + struct CurrentMigration { + schema_version: i32, + } + + let info = match sqlx::query_as("select schema_version from info") + .fetch_optional(&db) + .await + { + Ok(Some(result)) => result, + Ok(None) => CurrentMigration { schema_version: -1 }, + Err(e) if format!("{e}").contains("relation \"info\" does not exist") => { + CurrentMigration { schema_version: -1 } + } + Err(e) => return Err(e.into()), + }; + + info!("current migration: {}", info.schema_version); + + info!("running clean.sql"); + sqlx::raw_sql(fix_feff(CLEAN)).execute(&db).await?; + + for idx in (info.schema_version + 1) as usize..MIGRATIONS.len() { + info!("running migration {idx}"); + sqlx::raw_sql(fix_feff(MIGRATIONS[idx as usize])) + .execute(&db) + .await?; + } + + info!("running views.sql"); + sqlx::raw_sql(fix_feff(VIEWS)).execute(&db).await?; + + info!("running functions.sql"); + sqlx::raw_sql(fix_feff(FUNCTIONS)).execute(&db).await?; + + if let Ok(var) = std::env::var("SEED") + && var == "true" + { + info!("running seed.sql"); + sqlx::raw_sql(fix_feff(SEED)).execute(&db).await?; + info!( + "example system created with hid 'exmpl', token 'vlPitT0tEgT++a450w1/afODy5NXdALcHDwryX6dOIZdGUGbZg+5IH3nrUsQihsw', guild_id 466707357099884544" + ); + } + + info!("all done!"); + + Ok(()) +} + +// some migration scripts have \u{feff} at the start +fn fix_feff(sql: &str) -> &str { + sql.trim_start_matches("\u{feff}") +} diff --git a/docker-compose.yml b/docker-compose.yml index 18ddaa03..e2caa46a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,17 @@ version: "3" services: + migrate: + build: + context: . + dockerfile: ci/Dockerfile.rust + environment: + - RUST_LOG=info + - pluralkit__db__data_db_uri=postgresql://postgres:postgres@db:5432/postgres + - pluralkit__db__data_redis_addr=1 + command: ["/migrate"] + depends_on: ["db"] + bot: build: context: . @@ -17,6 +28,9 @@ services: - "PluralKit__Bot__EventAwaiterTarget=http://bot:5002/events" - "PluralKit__Bot__DisableGateway=true" restart: unless-stopped + depends_on: + migrate: + condition: service_completed_successfully gateway: build: