diff --git a/scripts/create-migration.cjs b/scripts/create-migration.cjs index 91145c34..00877888 100644 --- a/scripts/create-migration.cjs +++ b/scripts/create-migration.cjs @@ -27,7 +27,7 @@ async function createMigration() { const timestamp = generateTimestamp(); const fileName = `${timestamp}_${slugify(String(migrationName), { lower: true })}.sql`; - const migrationsDir = path.join(__dirname, '../src-tauri/migrations'); + const migrationsDir = path.join(__dirname, '../src-tauri/yaak-models/migrations'); const filePath = path.join(migrationsDir, fileName); if (!fs.existsSync(migrationsDir)) { diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index da1e51af..66a88d17 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -2475,6 +2475,25 @@ dependencies = [ "tiff", ] +[[package]] +name = "include_dir" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" +dependencies = [ + "proc-macro2", + "quote", +] + [[package]] name = "indexmap" version = "1.9.3" @@ -7654,6 +7673,7 @@ version = "0.1.0" dependencies = [ "chrono", "hex", + "include_dir", "log", "nanoid", "r2d2", diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 3d78887f..16a28fac 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -57,7 +57,6 @@ ], "longDescription": "A cross-platform desktop app for interacting with REST, GraphQL, and gRPC", "resources": [ - "migrations", "vendored/protoc/include", "vendored/plugins", "vendored/plugin-runtime" diff --git a/src-tauri/yaak-models/Cargo.toml b/src-tauri/yaak-models/Cargo.toml index aeb897cb..b69bb5e5 100644 --- a/src-tauri/yaak-models/Cargo.toml +++ b/src-tauri/yaak-models/Cargo.toml @@ -7,6 +7,8 @@ publish = false [dependencies] chrono = { version = "0.4.38", features = ["serde"] } +hex = "0.4.3" +include_dir = "0.7" log = "0.4.22" nanoid = "0.4.0" r2d2 = "0.8.10" @@ -22,7 +24,6 @@ tauri-plugin-dialog = { workspace = true } thiserror = "2.0.11" tokio = { workspace = true } ts-rs = { workspace = true, features = ["chrono-impl", "serde-json-impl"] } -hex = "0.4.3" [build-dependencies] tauri-plugin = { workspace = true, features = ["build"] } diff --git a/src-tauri/migrations/20230225181302_init.sql b/src-tauri/yaak-models/migrations/20230225181302_init.sql similarity index 100% rename from src-tauri/migrations/20230225181302_init.sql rename to src-tauri/yaak-models/migrations/20230225181302_init.sql diff --git a/src-tauri/migrations/20230319042610_sort-priority.sql b/src-tauri/yaak-models/migrations/20230319042610_sort-priority.sql similarity index 100% rename from src-tauri/migrations/20230319042610_sort-priority.sql rename to src-tauri/yaak-models/migrations/20230319042610_sort-priority.sql diff --git a/src-tauri/migrations/20230330143214_request-auth.sql b/src-tauri/yaak-models/migrations/20230330143214_request-auth.sql similarity index 100% rename from src-tauri/migrations/20230330143214_request-auth.sql rename to src-tauri/yaak-models/migrations/20230330143214_request-auth.sql diff --git a/src-tauri/migrations/20230413232435_response-body-blob.sql b/src-tauri/yaak-models/migrations/20230413232435_response-body-blob.sql similarity index 100% rename from src-tauri/migrations/20230413232435_response-body-blob.sql rename to src-tauri/yaak-models/migrations/20230413232435_response-body-blob.sql diff --git a/src-tauri/migrations/20231022205109_environments.sql b/src-tauri/yaak-models/migrations/20231022205109_environments.sql similarity index 100% rename from src-tauri/migrations/20231022205109_environments.sql rename to src-tauri/yaak-models/migrations/20231022205109_environments.sql diff --git a/src-tauri/migrations/20231028161007_variables.sql b/src-tauri/yaak-models/migrations/20231028161007_variables.sql similarity index 100% rename from src-tauri/migrations/20231028161007_variables.sql rename to src-tauri/yaak-models/migrations/20231028161007_variables.sql diff --git a/src-tauri/migrations/20231103004111_workspace-variables.sql b/src-tauri/yaak-models/migrations/20231103004111_workspace-variables.sql similarity index 100% rename from src-tauri/migrations/20231103004111_workspace-variables.sql rename to src-tauri/yaak-models/migrations/20231103004111_workspace-variables.sql diff --git a/src-tauri/migrations/20231103142807_folders.sql b/src-tauri/yaak-models/migrations/20231103142807_folders.sql similarity index 100% rename from src-tauri/migrations/20231103142807_folders.sql rename to src-tauri/yaak-models/migrations/20231103142807_folders.sql diff --git a/src-tauri/migrations/20231112180500_body_object.sql b/src-tauri/yaak-models/migrations/20231112180500_body_object.sql similarity index 100% rename from src-tauri/migrations/20231112180500_body_object.sql rename to src-tauri/yaak-models/migrations/20231112180500_body_object.sql diff --git a/src-tauri/migrations/20231113183810_url_params.sql b/src-tauri/yaak-models/migrations/20231113183810_url_params.sql similarity index 100% rename from src-tauri/migrations/20231113183810_url_params.sql rename to src-tauri/yaak-models/migrations/20231113183810_url_params.sql diff --git a/src-tauri/migrations/20231122055216_remove_body.sql b/src-tauri/yaak-models/migrations/20231122055216_remove_body.sql similarity index 100% rename from src-tauri/migrations/20231122055216_remove_body.sql rename to src-tauri/yaak-models/migrations/20231122055216_remove_body.sql diff --git a/src-tauri/migrations/20240111221224_settings.sql b/src-tauri/yaak-models/migrations/20240111221224_settings.sql similarity index 100% rename from src-tauri/migrations/20240111221224_settings.sql rename to src-tauri/yaak-models/migrations/20240111221224_settings.sql diff --git a/src-tauri/migrations/20240115193751_workspace_settings.sql b/src-tauri/yaak-models/migrations/20240115193751_workspace_settings.sql similarity index 100% rename from src-tauri/migrations/20240115193751_workspace_settings.sql rename to src-tauri/yaak-models/migrations/20240115193751_workspace_settings.sql diff --git a/src-tauri/migrations/20240118181105_channel_setting.sql b/src-tauri/yaak-models/migrations/20240118181105_channel_setting.sql similarity index 100% rename from src-tauri/migrations/20240118181105_channel_setting.sql rename to src-tauri/yaak-models/migrations/20240118181105_channel_setting.sql diff --git a/src-tauri/migrations/20240127013915_cookies.sql b/src-tauri/yaak-models/migrations/20240127013915_cookies.sql similarity index 100% rename from src-tauri/migrations/20240127013915_cookies.sql rename to src-tauri/yaak-models/migrations/20240127013915_cookies.sql diff --git a/src-tauri/migrations/20240128230717_more_response_attrs.sql b/src-tauri/yaak-models/migrations/20240128230717_more_response_attrs.sql similarity index 100% rename from src-tauri/migrations/20240128230717_more_response_attrs.sql rename to src-tauri/yaak-models/migrations/20240128230717_more_response_attrs.sql diff --git a/src-tauri/migrations/20240203164833_grpc.sql b/src-tauri/yaak-models/migrations/20240203164833_grpc.sql similarity index 100% rename from src-tauri/migrations/20240203164833_grpc.sql rename to src-tauri/yaak-models/migrations/20240203164833_grpc.sql diff --git a/src-tauri/migrations/20240522031045_theme-settings.sql b/src-tauri/yaak-models/migrations/20240522031045_theme-settings.sql similarity index 100% rename from src-tauri/migrations/20240522031045_theme-settings.sql rename to src-tauri/yaak-models/migrations/20240522031045_theme-settings.sql diff --git a/src-tauri/migrations/20240529143147_more-settings.sql b/src-tauri/yaak-models/migrations/20240529143147_more-settings.sql similarity index 100% rename from src-tauri/migrations/20240529143147_more-settings.sql rename to src-tauri/yaak-models/migrations/20240529143147_more-settings.sql diff --git a/src-tauri/migrations/20240607151115_open-workspace-setting.sql b/src-tauri/yaak-models/migrations/20240607151115_open-workspace-setting.sql similarity index 100% rename from src-tauri/migrations/20240607151115_open-workspace-setting.sql rename to src-tauri/yaak-models/migrations/20240607151115_open-workspace-setting.sql diff --git a/src-tauri/migrations/20240814013812_fix-env-model.sql b/src-tauri/yaak-models/migrations/20240814013812_fix-env-model.sql similarity index 100% rename from src-tauri/migrations/20240814013812_fix-env-model.sql rename to src-tauri/yaak-models/migrations/20240814013812_fix-env-model.sql diff --git a/src-tauri/migrations/20240826184943_disable-telemetry.sql b/src-tauri/yaak-models/migrations/20240826184943_disable-telemetry.sql similarity index 100% rename from src-tauri/migrations/20240826184943_disable-telemetry.sql rename to src-tauri/yaak-models/migrations/20240826184943_disable-telemetry.sql diff --git a/src-tauri/migrations/20240829131004_plugins.sql b/src-tauri/yaak-models/migrations/20240829131004_plugins.sql similarity index 100% rename from src-tauri/migrations/20240829131004_plugins.sql rename to src-tauri/yaak-models/migrations/20240829131004_plugins.sql diff --git a/src-tauri/migrations/20241003134208_response-state.sql b/src-tauri/yaak-models/migrations/20241003134208_response-state.sql similarity index 100% rename from src-tauri/migrations/20241003134208_response-state.sql rename to src-tauri/yaak-models/migrations/20241003134208_response-state.sql diff --git a/src-tauri/migrations/20241012181547_proxy-setting.sql b/src-tauri/yaak-models/migrations/20241012181547_proxy-setting.sql similarity index 100% rename from src-tauri/migrations/20241012181547_proxy-setting.sql rename to src-tauri/yaak-models/migrations/20241012181547_proxy-setting.sql diff --git a/src-tauri/migrations/20241217204951_docs.sql b/src-tauri/yaak-models/migrations/20241217204951_docs.sql similarity index 100% rename from src-tauri/migrations/20241217204951_docs.sql rename to src-tauri/yaak-models/migrations/20241217204951_docs.sql diff --git a/src-tauri/migrations/20241219140051_base-environments.sql b/src-tauri/yaak-models/migrations/20241219140051_base-environments.sql similarity index 100% rename from src-tauri/migrations/20241219140051_base-environments.sql rename to src-tauri/yaak-models/migrations/20241219140051_base-environments.sql diff --git a/src-tauri/migrations/20250102141937_sync.sql b/src-tauri/yaak-models/migrations/20250102141937_sync.sql similarity index 100% rename from src-tauri/migrations/20250102141937_sync.sql rename to src-tauri/yaak-models/migrations/20250102141937_sync.sql diff --git a/src-tauri/migrations/20250108035425_editor-keymap.sql b/src-tauri/yaak-models/migrations/20250108035425_editor-keymap.sql similarity index 100% rename from src-tauri/migrations/20250108035425_editor-keymap.sql rename to src-tauri/yaak-models/migrations/20250108035425_editor-keymap.sql diff --git a/src-tauri/migrations/20250108205117_workspace-meta.sql b/src-tauri/yaak-models/migrations/20250108205117_workspace-meta.sql similarity index 100% rename from src-tauri/migrations/20250108205117_workspace-meta.sql rename to src-tauri/yaak-models/migrations/20250108205117_workspace-meta.sql diff --git a/src-tauri/migrations/20250114160022_remove-workspace-sync-setting.sql b/src-tauri/yaak-models/migrations/20250114160022_remove-workspace-sync-setting.sql similarity index 100% rename from src-tauri/migrations/20250114160022_remove-workspace-sync-setting.sql rename to src-tauri/yaak-models/migrations/20250114160022_remove-workspace-sync-setting.sql diff --git a/src-tauri/migrations/20250123192023_plugin-kv.sql b/src-tauri/yaak-models/migrations/20250123192023_plugin-kv.sql similarity index 100% rename from src-tauri/migrations/20250123192023_plugin-kv.sql rename to src-tauri/yaak-models/migrations/20250123192023_plugin-kv.sql diff --git a/src-tauri/migrations/20250128155623_websockets.sql b/src-tauri/yaak-models/migrations/20250128155623_websockets.sql similarity index 100% rename from src-tauri/migrations/20250128155623_websockets.sql rename to src-tauri/yaak-models/migrations/20250128155623_websockets.sql diff --git a/src-tauri/migrations/20250302041707_hide-window-controls.sql b/src-tauri/yaak-models/migrations/20250302041707_hide-window-controls.sql similarity index 100% rename from src-tauri/migrations/20250302041707_hide-window-controls.sql rename to src-tauri/yaak-models/migrations/20250302041707_hide-window-controls.sql diff --git a/src-tauri/migrations/20250326193143_key-value-id.sql b/src-tauri/yaak-models/migrations/20250326193143_key-value-id.sql similarity index 100% rename from src-tauri/migrations/20250326193143_key-value-id.sql rename to src-tauri/yaak-models/migrations/20250326193143_key-value-id.sql diff --git a/src-tauri/migrations/20250401122407_encrypted-key.sql b/src-tauri/yaak-models/migrations/20250401122407_encrypted-key.sql similarity index 100% rename from src-tauri/migrations/20250401122407_encrypted-key.sql rename to src-tauri/yaak-models/migrations/20250401122407_encrypted-key.sql diff --git a/src-tauri/migrations/20250402144842_encryption-key-challenge.sql b/src-tauri/yaak-models/migrations/20250402144842_encryption-key-challenge.sql similarity index 100% rename from src-tauri/migrations/20250402144842_encryption-key-challenge.sql rename to src-tauri/yaak-models/migrations/20250402144842_encryption-key-challenge.sql diff --git a/src-tauri/migrations/20250424152740_remove-fks.sql b/src-tauri/yaak-models/migrations/20250424152740_remove-fks.sql similarity index 100% rename from src-tauri/migrations/20250424152740_remove-fks.sql rename to src-tauri/yaak-models/migrations/20250424152740_remove-fks.sql diff --git a/src-tauri/migrations/20250507140702_remove-ev-sync-states.sql b/src-tauri/yaak-models/migrations/20250507140702_remove-ev-sync-states.sql similarity index 100% rename from src-tauri/migrations/20250507140702_remove-ev-sync-states.sql rename to src-tauri/yaak-models/migrations/20250507140702_remove-ev-sync-states.sql diff --git a/src-tauri/migrations/20250508161145_public-environments.sql b/src-tauri/yaak-models/migrations/20250508161145_public-environments.sql similarity index 100% rename from src-tauri/migrations/20250508161145_public-environments.sql rename to src-tauri/yaak-models/migrations/20250508161145_public-environments.sql diff --git a/src-tauri/migrations/20250516182745_default-attrs.sql b/src-tauri/yaak-models/migrations/20250516182745_default-attrs.sql similarity index 100% rename from src-tauri/migrations/20250516182745_default-attrs.sql rename to src-tauri/yaak-models/migrations/20250516182745_default-attrs.sql diff --git a/src-tauri/migrations/20250530174021_graphql-introspection.sql b/src-tauri/yaak-models/migrations/20250530174021_graphql-introspection.sql similarity index 100% rename from src-tauri/migrations/20250530174021_graphql-introspection.sql rename to src-tauri/yaak-models/migrations/20250530174021_graphql-introspection.sql diff --git a/src-tauri/migrations/20250531193722_sync-state-index.sql b/src-tauri/yaak-models/migrations/20250531193722_sync-state-index.sql similarity index 100% rename from src-tauri/migrations/20250531193722_sync-state-index.sql rename to src-tauri/yaak-models/migrations/20250531193722_sync-state-index.sql diff --git a/src-tauri/migrations/20250604102922_colored-methods-setting.sql b/src-tauri/yaak-models/migrations/20250604102922_colored-methods-setting.sql similarity index 100% rename from src-tauri/migrations/20250604102922_colored-methods-setting.sql rename to src-tauri/yaak-models/migrations/20250604102922_colored-methods-setting.sql diff --git a/src-tauri/migrations/20250611120000_environment-color.sql b/src-tauri/yaak-models/migrations/20250611120000_environment-color.sql similarity index 100% rename from src-tauri/migrations/20250611120000_environment-color.sql rename to src-tauri/yaak-models/migrations/20250611120000_environment-color.sql diff --git a/src-tauri/yaak-models/src/lib.rs b/src-tauri/yaak-models/src/lib.rs index 2ad98813..061aaa72 100644 --- a/src-tauri/yaak-models/src/lib.rs +++ b/src-tauri/yaak-models/src/lib.rs @@ -59,7 +59,7 @@ pub fn init() -> TauriPlugin { .build(manager) .unwrap(); - if let Err(e) = migrate_db(app_handle.app_handle(), &pool) { + if let Err(e) = migrate_db(&pool) { error!("Failed to run database migration {e:?}"); app_handle .dialog() diff --git a/src-tauri/yaak-models/src/migrate.rs b/src-tauri/yaak-models/src/migrate.rs index 8155e262..dbcd1ac9 100644 --- a/src-tauri/yaak-models/src/migrate.rs +++ b/src-tauri/yaak-models/src/migrate.rs @@ -1,26 +1,16 @@ use crate::error::Error::MigrationError; use crate::error::Result; -use log::info; +use include_dir::{include_dir, Dir, DirEntry}; +use log::{debug, info}; use r2d2::Pool; use r2d2_sqlite::SqliteConnectionManager; -use rusqlite::{OptionalExtension, TransactionBehavior, params}; +use rusqlite::{params, OptionalExtension, TransactionBehavior}; use sha2::{Digest, Sha384}; -use std::fs; -use std::path::Path; -use std::result::Result as StdResult; -use tauri::path::BaseDirectory; -use tauri::{AppHandle, Manager, Runtime}; -pub(crate) fn migrate_db( - app_handle: &AppHandle, - pool: &Pool, -) -> Result<()> { - let migrations_dir = app_handle - .path() - .resolve("migrations", BaseDirectory::Resource) - .expect("failed to resolve resource"); +static MIGRATIONS_DIR: Dir = include_dir!("$CARGO_MANIFEST_DIR/migrations"); - info!("Running database migrations from: {:?}", migrations_dir); +pub(crate) fn migrate_db(pool: &Pool) -> Result<()> { + info!("Running database migrations"); // Ensure the table exists // NOTE: Yaak used to use sqlx for migrations, so we need to mirror that table structure. We @@ -39,20 +29,22 @@ pub(crate) fn migrate_db( )?; // Read and sort all .sql files - let mut entries = fs::read_dir(migrations_dir) - .expect("Failed to find migrations directory") - .filter_map(StdResult::ok) + let mut entries = MIGRATIONS_DIR + .entries() + .into_iter() .filter(|e| e.path().extension().map(|ext| ext == "sql").unwrap_or(false)) .collect::>(); // Ensure they're in the correct order - entries.sort_by_key(|e| e.file_name()); + entries.sort_by_key(|e| e.path()); // Run each migration in a transaction + let mut num_migrations = 0; for entry in entries { + num_migrations += 1; let mut conn = pool.get()?; let mut tx = conn.transaction_with_behavior(TransactionBehavior::Immediate)?; - match run_migration(entry.path().as_path(), &mut tx) { + match run_migration(entry, &mut tx) { Ok(_) => tx.commit()?, Err(e) => { let msg = format!( @@ -66,16 +58,15 @@ pub(crate) fn migrate_db( }; } - info!("Finished running migrations"); + info!("Finished running {} migrations", num_migrations); Ok(()) } -fn run_migration(migration_path: &Path, tx: &mut rusqlite::Transaction) -> Result { +fn run_migration(migration_path: &DirEntry, tx: &mut rusqlite::Transaction) -> Result { let start = std::time::Instant::now(); - let (version, description) = - split_migration_filename(migration_path.file_name().unwrap().to_str().unwrap()) - .expect("Failed to parse migration filename"); + let (version, description) = split_migration_filename(migration_path.path().to_str().unwrap()) + .expect("Failed to parse migration filename"); // Skip if already applied let row: Option = tx @@ -85,11 +76,13 @@ fn run_migration(migration_path: &Path, tx: &mut rusqlite::Transaction) -> Resul .optional()?; if row.is_some() { + debug!("Skipping migration {description}"); // Migration was already run return Ok(false); } - let sql = fs::read_to_string(migration_path).expect("Failed to read migration file"); + let sql = + migration_path.as_file().unwrap().contents_utf8().expect("Failed to read migration file"); info!("Applying migration {description}"); // Split on `;`? → optional depending on how your SQL is structured