From 8c8d01deb98da4c2c8eae14b417369790a5a567f Mon Sep 17 00:00:00 2001 From: fluo10 Date: Tue, 20 May 2025 08:34:15 +0900 Subject: [PATCH] Add migrations --- Cargo.toml | 6 ++ README.md | 4 +- bullet-cards-migration-client/Cargo.toml | 9 +++ bullet-cards-migration-client/README.md | 41 ++++++++++ bullet-cards-migration-client/src/lib.rs | 12 +++ .../src/m20220101_000001_create_table.rs | 41 ++++++++++ bullet-cards-migration-client/src/main.rs | 6 ++ bullet-cards-migration-core/Cargo.toml | 9 +++ bullet-cards-migration-core/README.md | 41 ++++++++++ bullet-cards-migration-core/src/lib.rs | 1 + .../src/m20220101_000001_create_table.rs | 76 +++++++++++++++++++ bullet-cards-migration-server/Cargo.toml | 9 +++ bullet-cards-migration-server/README.md | 41 ++++++++++ bullet-cards-migration-server/src/lib.rs | 12 +++ .../src/m20220101_000001_create_table.rs | 41 ++++++++++ bullet-cards-migration-server/src/main.rs | 6 ++ 16 files changed, 353 insertions(+), 2 deletions(-) create mode 100644 Cargo.toml create mode 100644 bullet-cards-migration-client/Cargo.toml create mode 100644 bullet-cards-migration-client/README.md create mode 100644 bullet-cards-migration-client/src/lib.rs create mode 100644 bullet-cards-migration-client/src/m20220101_000001_create_table.rs create mode 100644 bullet-cards-migration-client/src/main.rs create mode 100644 bullet-cards-migration-core/Cargo.toml create mode 100644 bullet-cards-migration-core/README.md create mode 100644 bullet-cards-migration-core/src/lib.rs create mode 100644 bullet-cards-migration-core/src/m20220101_000001_create_table.rs create mode 100644 bullet-cards-migration-server/Cargo.toml create mode 100644 bullet-cards-migration-server/README.md create mode 100644 bullet-cards-migration-server/src/lib.rs create mode 100644 bullet-cards-migration-server/src/m20220101_000001_create_table.rs create mode 100644 bullet-cards-migration-server/src/main.rs diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..9231169 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +[workspace] +members = ["bullet-cards-*"] + +[workspace.dependencies] +async-std = { version = "1", features = ["attributes", "tokio1"] } +sea-orm-migration = { version = "1.1.0", features = ["runtime-tokio-rustls","sqlx-sqlite"] } diff --git a/README.md b/README.md index f22a440..4c57a05 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ -# porgana +# Bullet Cards -My personal organization application \ No newline at end of file +My personal organization application inspired by bullet journal and index card \ No newline at end of file diff --git a/bullet-cards-migration-client/Cargo.toml b/bullet-cards-migration-client/Cargo.toml new file mode 100644 index 0000000..80411e6 --- /dev/null +++ b/bullet-cards-migration-client/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "bullet-cards-migration-client" +version = "0.1.0" +edition = "2021" +publish = false + +[dependencies] +async-std.workspace = true +sea-orm-migration.workspace = true diff --git a/bullet-cards-migration-client/README.md b/bullet-cards-migration-client/README.md new file mode 100644 index 0000000..3b438d8 --- /dev/null +++ b/bullet-cards-migration-client/README.md @@ -0,0 +1,41 @@ +# Running Migrator CLI + +- Generate a new migration file + ```sh + cargo run -- generate MIGRATION_NAME + ``` +- Apply all pending migrations + ```sh + cargo run + ``` + ```sh + cargo run -- up + ``` +- Apply first 10 pending migrations + ```sh + cargo run -- up -n 10 + ``` +- Rollback last applied migrations + ```sh + cargo run -- down + ``` +- Rollback last 10 applied migrations + ```sh + cargo run -- down -n 10 + ``` +- Drop all tables from the database, then reapply all migrations + ```sh + cargo run -- fresh + ``` +- Rollback all applied migrations, then reapply all migrations + ```sh + cargo run -- refresh + ``` +- Rollback all applied migrations + ```sh + cargo run -- reset + ``` +- Check the status of all migrations + ```sh + cargo run -- status + ``` diff --git a/bullet-cards-migration-client/src/lib.rs b/bullet-cards-migration-client/src/lib.rs new file mode 100644 index 0000000..2c605af --- /dev/null +++ b/bullet-cards-migration-client/src/lib.rs @@ -0,0 +1,12 @@ +pub use sea_orm_migration::prelude::*; + +mod m20220101_000001_create_table; + +pub struct Migrator; + +#[async_trait::async_trait] +impl MigratorTrait for Migrator { + fn migrations() -> Vec> { + vec![Box::new(m20220101_000001_create_table::Migration)] + } +} diff --git a/bullet-cards-migration-client/src/m20220101_000001_create_table.rs b/bullet-cards-migration-client/src/m20220101_000001_create_table.rs new file mode 100644 index 0000000..1863d6d --- /dev/null +++ b/bullet-cards-migration-client/src/m20220101_000001_create_table.rs @@ -0,0 +1,41 @@ +use sea_orm_migration::{prelude::*, schema::*}; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + // Replace the sample below with your own migration scripts + todo!(); + + manager + .create_table( + Table::create() + .table(Post::Table) + .if_not_exists() + .col(pk_auto(Post::Id)) + .col(string(Post::Title)) + .col(string(Post::Text)) + .to_owned(), + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + // Replace the sample below with your own migration scripts + todo!(); + + manager + .drop_table(Table::drop().table(Post::Table).to_owned()) + .await + } +} + +#[derive(DeriveIden)] +enum Post { + Table, + Id, + Title, + Text, +} diff --git a/bullet-cards-migration-client/src/main.rs b/bullet-cards-migration-client/src/main.rs new file mode 100644 index 0000000..95c3d35 --- /dev/null +++ b/bullet-cards-migration-client/src/main.rs @@ -0,0 +1,6 @@ +use sea_orm_migration::prelude::*; + +#[async_std::main] +async fn main() { + cli::run_cli(bullet_cards_migration_client::Migrator).await; +} diff --git a/bullet-cards-migration-core/Cargo.toml b/bullet-cards-migration-core/Cargo.toml new file mode 100644 index 0000000..92084ce --- /dev/null +++ b/bullet-cards-migration-core/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "bullet-cards-migration-core" +version = "0.1.0" +edition = "2021" +publish = false + +[dependencies] +async-std.workspace = true +sea-orm-migration.workspace = true diff --git a/bullet-cards-migration-core/README.md b/bullet-cards-migration-core/README.md new file mode 100644 index 0000000..3b438d8 --- /dev/null +++ b/bullet-cards-migration-core/README.md @@ -0,0 +1,41 @@ +# Running Migrator CLI + +- Generate a new migration file + ```sh + cargo run -- generate MIGRATION_NAME + ``` +- Apply all pending migrations + ```sh + cargo run + ``` + ```sh + cargo run -- up + ``` +- Apply first 10 pending migrations + ```sh + cargo run -- up -n 10 + ``` +- Rollback last applied migrations + ```sh + cargo run -- down + ``` +- Rollback last 10 applied migrations + ```sh + cargo run -- down -n 10 + ``` +- Drop all tables from the database, then reapply all migrations + ```sh + cargo run -- fresh + ``` +- Rollback all applied migrations, then reapply all migrations + ```sh + cargo run -- refresh + ``` +- Rollback all applied migrations + ```sh + cargo run -- reset + ``` +- Check the status of all migrations + ```sh + cargo run -- status + ``` diff --git a/bullet-cards-migration-core/src/lib.rs b/bullet-cards-migration-core/src/lib.rs new file mode 100644 index 0000000..ab422f1 --- /dev/null +++ b/bullet-cards-migration-core/src/lib.rs @@ -0,0 +1 @@ +pub mod m20220101_000001_create_table; diff --git a/bullet-cards-migration-core/src/m20220101_000001_create_table.rs b/bullet-cards-migration-core/src/m20220101_000001_create_table.rs new file mode 100644 index 0000000..670d33e --- /dev/null +++ b/bullet-cards-migration-core/src/m20220101_000001_create_table.rs @@ -0,0 +1,76 @@ +use sea_orm_migration::{prelude::*, schema::*}; + +pub trait TableMigration { + async fn up<'a>(manager: &'a SchemaManager<'a>) -> Result<(), DbErr> { + manager.create_table(Self::table_create_statement()).await?; + for statement in Self::index_create_statements().into_iter() { + manager.create_index(statement).await? + } + Ok(()) + } + async fn down<'a>(manager: &'a SchemaManager<'a>) -> Result<(), DbErr> { + manager.drop_table(Self::table_drop_statement()).await?; + Ok(()) + } + fn table_create_statement() -> TableCreateStatement; + fn index_create_statements() -> Vec; + fn table_drop_statement() -> TableDropStatement; +} + + +#[derive(DeriveIden)] +pub enum BulletCard { + Table, + Id, + CreatedAt, + UpdatedAt, + DeletedAt, + Title, + Content, +} + +static IDX_BULLET_CARD_CREATED_AT: &str = "idx_bullet_card_created_at"; +static IDX_BULLET_CARD_UPDATED_AT: &str = "idx_bullet_card_updated_at"; +static IDX_BULLET_CARD_DELETED_AT: &str = "idx_bullet_card_deleted_at"; +static IDX_BULLET_CARD_TITLE: &str = "idx_bullet_card_title"; + +impl TableMigration for BulletCard { + + fn table_create_statement() -> TableCreateStatement { + Table::create() + .table(Self::Table) + .if_not_exists() + .col(uuid(Self::Id)) + .col(timestamp_with_time_zone(Self::CreatedAt)) + .col(timestamp_with_time_zone(Self::UpdatedAt)) + .col(timestamp_with_time_zone_null(Self::DeletedAt)) + .col(string(Self::Title)) + .col(string(Self::Content)) + .to_owned() + } + + fn index_create_statements() -> Vec { + vec![ + Index::create().name(IDX_BULLET_CARD_CREATED_AT) + .table(Self::Table) + .col(Self::CreatedAt) + .to_owned(), + Index::create().name(IDX_BULLET_CARD_DELETED_AT) + .table(Self::Table) + .col(Self::DeletedAt) + .to_owned(), + Index::create().name(IDX_BULLET_CARD_TITLE) + .table(Self::Table) + .col(Self::Title) + .to_owned(), + Index::create().name(IDX_BULLET_CARD_UPDATED_AT) + .table(Self::Table) + .col(Self::UpdatedAt) + .to_owned(), + ] + } + + fn table_drop_statement() -> TableDropStatement { + Table::drop().table(Self::Table).to_owned() + } +} diff --git a/bullet-cards-migration-server/Cargo.toml b/bullet-cards-migration-server/Cargo.toml new file mode 100644 index 0000000..3505df6 --- /dev/null +++ b/bullet-cards-migration-server/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "bullet-cards-migration-server" +version = "0.1.0" +edition = "2021" +publish = false + +[dependencies] +async-std.workspace = true +sea-orm-migration = { workspace = true, features = ["sqlx-postgres"]} \ No newline at end of file diff --git a/bullet-cards-migration-server/README.md b/bullet-cards-migration-server/README.md new file mode 100644 index 0000000..3b438d8 --- /dev/null +++ b/bullet-cards-migration-server/README.md @@ -0,0 +1,41 @@ +# Running Migrator CLI + +- Generate a new migration file + ```sh + cargo run -- generate MIGRATION_NAME + ``` +- Apply all pending migrations + ```sh + cargo run + ``` + ```sh + cargo run -- up + ``` +- Apply first 10 pending migrations + ```sh + cargo run -- up -n 10 + ``` +- Rollback last applied migrations + ```sh + cargo run -- down + ``` +- Rollback last 10 applied migrations + ```sh + cargo run -- down -n 10 + ``` +- Drop all tables from the database, then reapply all migrations + ```sh + cargo run -- fresh + ``` +- Rollback all applied migrations, then reapply all migrations + ```sh + cargo run -- refresh + ``` +- Rollback all applied migrations + ```sh + cargo run -- reset + ``` +- Check the status of all migrations + ```sh + cargo run -- status + ``` diff --git a/bullet-cards-migration-server/src/lib.rs b/bullet-cards-migration-server/src/lib.rs new file mode 100644 index 0000000..2c605af --- /dev/null +++ b/bullet-cards-migration-server/src/lib.rs @@ -0,0 +1,12 @@ +pub use sea_orm_migration::prelude::*; + +mod m20220101_000001_create_table; + +pub struct Migrator; + +#[async_trait::async_trait] +impl MigratorTrait for Migrator { + fn migrations() -> Vec> { + vec![Box::new(m20220101_000001_create_table::Migration)] + } +} diff --git a/bullet-cards-migration-server/src/m20220101_000001_create_table.rs b/bullet-cards-migration-server/src/m20220101_000001_create_table.rs new file mode 100644 index 0000000..1863d6d --- /dev/null +++ b/bullet-cards-migration-server/src/m20220101_000001_create_table.rs @@ -0,0 +1,41 @@ +use sea_orm_migration::{prelude::*, schema::*}; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + // Replace the sample below with your own migration scripts + todo!(); + + manager + .create_table( + Table::create() + .table(Post::Table) + .if_not_exists() + .col(pk_auto(Post::Id)) + .col(string(Post::Title)) + .col(string(Post::Text)) + .to_owned(), + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + // Replace the sample below with your own migration scripts + todo!(); + + manager + .drop_table(Table::drop().table(Post::Table).to_owned()) + .await + } +} + +#[derive(DeriveIden)] +enum Post { + Table, + Id, + Title, + Text, +} diff --git a/bullet-cards-migration-server/src/main.rs b/bullet-cards-migration-server/src/main.rs new file mode 100644 index 0000000..59375ee --- /dev/null +++ b/bullet-cards-migration-server/src/main.rs @@ -0,0 +1,6 @@ +use sea_orm_migration::prelude::*; + +#[async_std::main] +async fn main() { + cli::run_cli(bullet_cards_migration_server::Migrator).await; +}