diff --git a/Cargo.lock b/Cargo.lock index 5f1ab47..3b5d2c3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2664,7 +2664,7 @@ dependencies = [ "clap", "dirs", "progress-pile-core", - "progress-pile-migration", + "progress-pile-migration-client", "sea-orm", "serde", "tempfile", @@ -2704,10 +2704,28 @@ dependencies = [ ] [[package]] -name = "progress-pile-migration" +name = "progress-pile-migration-client" version = "0.1.0" dependencies = [ "async-std", + "progress-pile-migration-core", + "sea-orm-migration", +] + +[[package]] +name = "progress-pile-migration-core" +version = "0.1.0" +dependencies = [ + "async-std", + "sea-orm-migration", +] + +[[package]] +name = "progress-pile-migration-server" +version = "0.1.0" +dependencies = [ + "async-std", + "progress-pile-migration-core", "sea-orm-migration", ] @@ -2722,7 +2740,7 @@ dependencies = [ "chrono", "clap", "progress-pile-core", - "progress-pile-migration", + "progress-pile-migration-server", "rand 0.9.1", "sea-orm", "serde", @@ -2901,20 +2919,6 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.16", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - [[package]] name = "rsa" version = "0.9.8" @@ -2967,37 +2971,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "rustls" -version = "0.23.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" -dependencies = [ - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pki-types" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" - -[[package]] -name = "rustls-webpki" -version = "0.103.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - [[package]] name = "rustversion" version = "1.0.20" @@ -3396,7 +3369,6 @@ dependencies = [ "native-tls", "once_cell", "percent-encoding", - "rustls", "serde", "serde_json", "sha2", @@ -3407,7 +3379,6 @@ dependencies = [ "tracing", "url", "uuid", - "webpki-roots", ] [[package]] @@ -4002,12 +3973,6 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - [[package]] name = "url" version = "2.5.4" @@ -4186,15 +4151,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki-roots" -version = "0.26.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29aad86cec885cafd03e8305fd727c418e970a521322c91688414d5b8efba16b" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "whoami" version = "1.6.0" diff --git a/Cargo.toml b/Cargo.toml index c1455ec..be9f69b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,9 @@ dirs = "6.0.0" dotenv = "0.15.0" progress-pile-client = { path = "progress-pile-client", default-features = false } progress-pile-core = { path = "progress-pile-core", default-features = false } -progress-pile-migration = { path = "progress-pile-migration", default-features = false } +progress-pile-migration-client.path = "progress-pile-migration-client" +progress-pile-migration-core.path = "progress-pile-migration-core" +progress-pile-migration-server.path = "progress-pile-migration-server" progress-pile-server.path = "progress-pile-server" serde = { version = "1.0", features = ["derive"] } tempfile = "3.20.0" diff --git a/progress-pile-client/Cargo.toml b/progress-pile-client/Cargo.toml index 9c0e0e1..ee47bf2 100644 --- a/progress-pile-client/Cargo.toml +++ b/progress-pile-client/Cargo.toml @@ -5,7 +5,7 @@ edition = "2024" [features] default = ["desktop"] -desktop = ["dep:clap", "progress-pile-core/desktop", "dep:progress-pile-migration", "dep:sea-orm", "tokio/io-util", "tokio/fs"] +desktop = ["dep:clap", "progress-pile-core/desktop", "dep:progress-pile-migration-client", "dep:sea-orm", "tokio/io-util", "tokio/fs"] web = ["uuid/js"] [dependencies] @@ -14,7 +14,7 @@ chrono-tz.workspace = true clap = { workspace = true, optional = true } dirs.workspace = true progress-pile-core.workspace = true -progress-pile-migration = { workspace = true, features = ["client"], optional = true} +progress-pile-migration-client = { workspace = true, optional = true} sea-orm = { workspace = true, optional = true } serde.workspace = true thiserror.workspace = true diff --git a/progress-pile-client/src/entity/mod.rs b/progress-pile-client/src/entity/mod.rs index b93f7cc..6bb8ab5 100644 --- a/progress-pile-client/src/entity/mod.rs +++ b/progress-pile-client/src/entity/mod.rs @@ -24,7 +24,6 @@ mod tests { use chrono::Local; use progress_pile_core::global::GlobalDatabase; use sea_orm::{entity::*, ConnectOptions, Database, DatabaseConnection}; - use progress_pile_migration::{ClientMigrator, MigratorTrait}; use uuid::Uuid; use crate::error::Error; use crate::global::GLOBAL; diff --git a/progress-pile-client/src/global/database.rs b/progress-pile-client/src/global/database.rs index e2474d7..4ee14e3 100644 --- a/progress-pile-client/src/global/database.rs +++ b/progress-pile-client/src/global/database.rs @@ -1,4 +1,4 @@ -use progress_pile_migration::{ClientMigrator, MigratorTrait}; +use progress_pile_migration_client::{Migrator, MigratorTrait}; use sea_orm::{ConnectOptions, Database, DatabaseConnection}; use crate::error::Error; use tokio::sync::OnceCell; @@ -19,7 +19,7 @@ impl GlobalDatabase for Global { { Ok(self.database.get_or_try_init(|| async { let db = Database::connect(options).await?; - ClientMigrator::up(&db, None).await?; + Migrator::up(&db, None).await?; Ok::(db) }).await?) } diff --git a/progress-pile-migration-client/Cargo.toml b/progress-pile-migration-client/Cargo.toml new file mode 100644 index 0000000..9a10278 --- /dev/null +++ b/progress-pile-migration-client/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "progress-pile-migration-client" +version = "0.1.0" +edition = "2021" +publish = false + +[dependencies] +async-std = { version = "1", features = ["attributes", "tokio1"] } +progress-pile-migration-core.workspace = true + +[dependencies.sea-orm-migration] +version = "1.1.0" +features = [ + # Enable at least one `ASYNC_RUNTIME` and `DATABASE_DRIVER` feature if you want to run migration via CLI. + # View the list of supported features at https://www.sea-ql.org/SeaORM/docs/install-and-config/database-and-async-runtime. + # e.g. + # "runtime-tokio-rustls", # `ASYNC_RUNTIME` feature + # "sqlx-postgres", # `DATABASE_DRIVER` feature +] diff --git a/progress-pile-migration/README.md b/progress-pile-migration-client/README.md similarity index 100% rename from progress-pile-migration/README.md rename to progress-pile-migration-client/README.md diff --git a/progress-pile-migration-client/src/lib.rs b/progress-pile-migration-client/src/lib.rs new file mode 100644 index 0000000..2c605af --- /dev/null +++ b/progress-pile-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/progress-pile-migration-client/src/m20220101_000001_create_table.rs b/progress-pile-migration-client/src/m20220101_000001_create_table.rs new file mode 100644 index 0000000..7ef3d10 --- /dev/null +++ b/progress-pile-migration-client/src/m20220101_000001_create_table.rs @@ -0,0 +1,63 @@ +use progress_pile_migration_core::m20220101_000001_create_table::{ + TableMigration, + ProgressCategory as DefaultProgressCategory, + ProgressEntry as DefaultProgressEntry, + PK_PROGRESS_CATEGORY, + PK_PROGRESS_ENTITY, +}; +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> { + ProgressCategory::up(manager).await?; + ProgressEntry::up(manager).await?; + Ok(()) + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + ProgressEntry::down(manager).await?; + ProgressCategory::down(manager).await?; + Ok(()) + } +} + +#[derive(DeriveIden)] +pub enum ProgressCategory{} + +impl TableMigration for ProgressCategory { + fn table_create_statement() -> TableCreateStatement{ + let mut tcs = DefaultProgressCategory::table_create_statement(); + tcs.primary_key(Index::create().name(PK_PROGRESS_CATEGORY).col(DefaultProgressCategory::Id)); + tcs + } + fn index_create_statements() -> Vec { + DefaultProgressCategory::index_create_statements() + } + fn table_drop_statement() -> TableDropStatement{ + DefaultProgressCategory::table_drop_statement() + } +} + + +#[derive(DeriveIden)] +pub enum ProgressEntry {} + +impl TableMigration for ProgressEntry { + + fn table_create_statement() -> TableCreateStatement{ + let mut tcs: TableCreateStatement = DefaultProgressEntry::table_create_statement(); + tcs.primary_key(Index::create().name(PK_PROGRESS_ENTITY).col(DefaultProgressEntry::Id)); + tcs + } + fn index_create_statements() -> Vec { + DefaultProgressEntry::index_create_statements() + } + fn table_drop_statement() -> TableDropStatement { + DefaultProgressEntry::table_drop_statement() + } +} diff --git a/progress-pile-migration-client/src/main.rs b/progress-pile-migration-client/src/main.rs new file mode 100644 index 0000000..bb53320 --- /dev/null +++ b/progress-pile-migration-client/src/main.rs @@ -0,0 +1,6 @@ +use sea_orm_migration::prelude::*; + +#[async_std::main] +async fn main() { + cli::run_cli(progress_pile_migration_client::Migrator).await; +} diff --git a/progress-pile-migration-core/Cargo.toml b/progress-pile-migration-core/Cargo.toml new file mode 100644 index 0000000..4fc37f4 --- /dev/null +++ b/progress-pile-migration-core/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "progress-pile-migration-core" +version = "0.1.0" +edition = "2021" +publish = false + +[dependencies] +async-std = { version = "1", features = ["attributes", "tokio1"] } +sea-orm-migration = "1.1.0" diff --git a/progress-pile-migration-core/README.md b/progress-pile-migration-core/README.md new file mode 100644 index 0000000..3b438d8 --- /dev/null +++ b/progress-pile-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/progress-pile-migration-core/src/lib.rs b/progress-pile-migration-core/src/lib.rs new file mode 100644 index 0000000..61ffae5 --- /dev/null +++ b/progress-pile-migration-core/src/lib.rs @@ -0,0 +1 @@ +pub mod m20220101_000001_create_table; \ No newline at end of file diff --git a/progress-pile-migration-core/src/m20220101_000001_create_table.rs b/progress-pile-migration-core/src/m20220101_000001_create_table.rs new file mode 100644 index 0000000..c5a148e --- /dev/null +++ b/progress-pile-migration-core/src/m20220101_000001_create_table.rs @@ -0,0 +1,145 @@ +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 ProgressCategory { + Table, + Id, + CreatedAt, + UpdatedAt, + DeletedAt, + Name, +} + +static IDX_PROGRESS_CATEGORY_NAME: &str = "idx_progress_category_name"; +static IDX_PROGRESS_CATEGORY_CREATED_AT: &str = "idx_progress_category_created_at"; +static IDX_PROGRESS_CATEGORY_UPDATED_AT: &str = "idx_progress_category_updated_at"; +static IDX_PROGRESS_CATEGORY_DELETED_AT: &str = "idx_progress_category_deleted_at"; +pub static PK_PROGRESS_CATEGORY: &str = "pk_progress_category"; + +impl TableMigration for ProgressCategory { + + fn table_create_statement() -> TableCreateStatement { + Table::create() + .table(Self::Table) + .if_not_exists() + .col(uuid(Self::Id)) + .col(string(Self::Name)) + .col(timestamp_with_time_zone(Self::CreatedAt)) + .col(timestamp_with_time_zone(Self::UpdatedAt)) + .col(timestamp_with_time_zone_null(Self::DeletedAt)) + .to_owned() + } + fn index_create_statements() -> Vec { + vec![ + Index::create().name(IDX_PROGRESS_CATEGORY_CREATED_AT) + .table(Self::Table) + .col(Self::CreatedAt) + .to_owned(), + Index::create().name(IDX_PROGRESS_CATEGORY_DELETED_AT) + .table(Self::Table) + .col(Self::DeletedAt) + .to_owned(), + Index::create().name(IDX_PROGRESS_CATEGORY_NAME) + .table(Self::Table) + .col(Self::Name) + .to_owned(), + Index::create().name(IDX_PROGRESS_CATEGORY_UPDATED_AT) + .table(Self::Table) + .col(Self::UpdatedAt) + .to_owned(), + ] + } + fn table_drop_statement() -> TableDropStatement { + Table::drop().table(Self::Table).to_owned() + } +} + + +#[derive(DeriveIden)] +pub enum ProgressEntry { + Table, + Id, + ProgressCategoryId, + CreatedAt, + UpdatedAt, + DeletedAt, + ProgressedAt, + Quantity, + Note, +} + +static IDX_PROGRESS_ENTITY_CREATED_AT: &str = "idx_progress_entity_created_at"; +static IDX_PROGRESS_ENTITY_UPDATED_AT: &str = "idx_progress_entity_updated_at"; +static IDX_PROGRESS_ENTITY_DELETED_AT: &str = "idx_progress_entity_deleted_at"; +static IDX_PROGRESS_ENTITY_PROGRESSED_AT: &str = "idx_progress_entity_progressed_at"; +static FK_PROGRESS_ENTITY_PROGRESS_CATEGORY: &str = "fk_progress_entity_progress_category"; +pub static PK_PROGRESS_ENTITY: &str = "pk_progress_entity"; + +impl TableMigration for ProgressEntry { + + fn table_create_statement() -> TableCreateStatement { + Table::create() + .table(Self::Table) + .if_not_exists() + .col(uuid(Self::Id)) + .col(uuid(Self::ProgressCategoryId)) + .col(timestamp_with_time_zone(Self::CreatedAt)) + .col(timestamp_with_time_zone(Self::UpdatedAt)) + .col(timestamp_with_time_zone_null(Self::DeletedAt)) + .col(timestamp_with_time_zone(Self::ProgressedAt)) + .col(integer(Self::Quantity)) + .col(string(Self::Note)) + .foreign_key(ForeignKey::create() + .name(FK_PROGRESS_ENTITY_PROGRESS_CATEGORY) + .from(Self::Table, Self::ProgressCategoryId) + .to(ProgressCategory::Table, ProgressCategory::Id) + .on_delete(ForeignKeyAction::Cascade) + .on_update(ForeignKeyAction::Cascade) + ) + .to_owned() + } + + fn index_create_statements() -> Vec { + vec![ + Index::create().name(IDX_PROGRESS_ENTITY_CREATED_AT) + .table(Self::Table) + .col(Self::CreatedAt) + .to_owned(), + Index::create().name(IDX_PROGRESS_ENTITY_DELETED_AT) + .table(Self::Table) + .col(Self::DeletedAt) + .to_owned(), + Index::create().name(IDX_PROGRESS_ENTITY_PROGRESSED_AT) + .table(Self::Table) + .col(Self::ProgressedAt) + .to_owned(), + Index::create().name(IDX_PROGRESS_ENTITY_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/progress-pile-migration-server/Cargo.toml b/progress-pile-migration-server/Cargo.toml new file mode 100644 index 0000000..f604ba5 --- /dev/null +++ b/progress-pile-migration-server/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "progress-pile-migration-server" +version = "0.1.0" +edition = "2021" +publish = false + +[dependencies] +async-std = { version = "1", features = ["attributes", "tokio1"] } +progress-pile-migration-core.workspace = true + +[dependencies.sea-orm-migration] +version = "1.1.0" +features = [ + # Enable at least one `ASYNC_RUNTIME` and `DATABASE_DRIVER` feature if you want to run migration via CLI. + # View the list of supported features at https://www.sea-ql.org/SeaORM/docs/install-and-config/database-and-async-runtime. + # e.g. + # "runtime-tokio-rustls", # `ASYNC_RUNTIME` feature + # "sqlx-postgres", # `DATABASE_DRIVER` feature +] diff --git a/progress-pile-migration-server/README.md b/progress-pile-migration-server/README.md new file mode 100644 index 0000000..3b438d8 --- /dev/null +++ b/progress-pile-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/progress-pile-migration-server/src/lib.rs b/progress-pile-migration-server/src/lib.rs new file mode 100644 index 0000000..2c605af --- /dev/null +++ b/progress-pile-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/progress-pile-migration-server/src/m20220101_000001_create_table.rs b/progress-pile-migration-server/src/m20220101_000001_create_table.rs new file mode 100644 index 0000000..b193bce --- /dev/null +++ b/progress-pile-migration-server/src/m20220101_000001_create_table.rs @@ -0,0 +1,289 @@ +use progress_pile_migration_core::m20220101_000001_create_table::{ + TableMigration, + ProgressCategory as DefaultProgressCategory, + ProgressEntry as DefaultProgressEntry, + PK_PROGRESS_CATEGORY, + PK_PROGRESS_ENTITY, +}; +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> { + User::up(manager).await?; + AccessToken::up(manager).await?; + ProgressCategory::up(manager).await?; + ProgressEntry::up(manager).await?; + Ok(()) + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + ProgressEntry::down(manager).await?; + ProgressCategory::down(manager).await?; + AccessToken::down(manager).await?; + User::down(manager).await + } +} + +#[derive(DeriveIden)] +pub enum User { + Table, + Id, + CreatedAt, + UpdatedAt, + DeletedAt, + LoginName, + PasswordHash, +} + +static IDX_USER_LOGIN_NAME: &str = "idx_user_login_name"; +static IDX_USER_CREATED_AT: &str = "idx_user_created_at"; +static IDX_USER_UPDATED_AT: &str = "idx_user_updated_at"; +static IDX_USER_DELETED_AT: &str = "idx_user_deleted_at"; + +impl TableMigration for User { + + fn table_create_statement() -> TableCreateStatement{ + Table::create() + .table(Self::Table) + .if_not_exists() + .col(pk_auto(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_uniq(Self::LoginName)) + .col(string(Self::PasswordHash)) + + .to_owned() + } + + fn index_create_statements() -> Vec { + vec![ + Index::create().name(IDX_USER_LOGIN_NAME) + .table(Self::Table) + .col(Self::LoginName) + .to_owned(), + Index::create().name(IDX_USER_CREATED_AT) + .table(Self::Table) + .col((Self::CreatedAt, IndexOrder::Desc)) + .to_owned(), + Index::create().name(IDX_USER_UPDATED_AT) + .table(Self::Table) + .col((Self::UpdatedAt, IndexOrder::Desc)) + .to_owned(), + Index::create().name(IDX_USER_DELETED_AT) + .table(Self::Table) + .col((Self::DeletedAt, IndexOrder::Desc)) + .to_owned(), + ] + } + + fn table_drop_statement() -> TableDropStatement { + Table::drop().table(Self::Table).to_owned() + } +} + +#[derive(DeriveIden)] +pub enum AccessToken{ + Table, + Id, + UserId, + CreatedAt, + UpdatedAt, + ExpiredAt, + TokenValue, + Note, +} + +static IDX_ACCESS_TOKEN_TOKEN_VALUE: &str = "idx_access_token_token_value"; +static IDX_ACCESS_TOKEN_CREATED_AT: &str = "idx_access_token_created_at"; +static IDX_ACCESS_TOKEN_UPDATED_AT: &str = "idx_access_token_updated_at"; +static IDX_ACCESS_TOKEN_EXPIRED_AT: &str = "idx_access_token_expired_at"; +static IDX_ACCESS_TOKEN_USER_ID_CREATED_AT: &str = "idx_access_token_user_id_created_at"; +static IDX_ACCESS_TOKEN_USER_ID_UPDATED_AT: &str = "idx_access_token_user_id_updated_at"; +static IDX_ACCESS_TOKEN_USER_ID_EXPIRED_AT: &str = "idx_access_token_user_id_expired_at"; +static FK_ACCESS_TOKEN_USER: &str = "fk_access_token_user"; + +impl TableMigration for AccessToken { + + fn table_create_statement() -> TableCreateStatement { + Table::create() + .table(Self::Table) + .if_not_exists() + .col(pk_auto(Self::Id)) + .col(integer(Self::UserId)) + .col(timestamp_with_time_zone(Self::CreatedAt)) + .col(timestamp_with_time_zone(Self::UpdatedAt)) + .col(timestamp_with_time_zone_null(Self::ExpiredAt)) + .col(string(Self::TokenValue)) + .col(string(Self::Note)) + .foreign_key(ForeignKey::create() + .name(FK_ACCESS_TOKEN_USER) + .from(Self::Table, Self::UserId) + .to(User::Table, User::Id) + .on_delete(ForeignKeyAction::Cascade) + .on_update(ForeignKeyAction::Cascade) + ) + .to_owned() + } + fn index_create_statements() -> Vec { + vec![ + Index::create().name(IDX_ACCESS_TOKEN_CREATED_AT) + .table(Self::Table) + .col(Self::CreatedAt) + .to_owned(), + Index::create().name(IDX_ACCESS_TOKEN_EXPIRED_AT) + .table(Self::Table) + .col(Self::ExpiredAt) + .to_owned(), + Index::create().name(IDX_ACCESS_TOKEN_TOKEN_VALUE) + .table(Self::Table) + .col(Self::TokenValue) + .to_owned(), + Index::create().name(IDX_ACCESS_TOKEN_UPDATED_AT) + .table(Self::Table) + .col(Self::UpdatedAt) + .to_owned(), + Index::create().name(IDX_ACCESS_TOKEN_USER_ID_CREATED_AT) + .table(Self::Table) + .col(Self::UserId) + .col(Self::CreatedAt) + .to_owned(), + Index::create().name(IDX_ACCESS_TOKEN_USER_ID_EXPIRED_AT) + .table(Self::Table) + .col(Self::UserId) + .col(Self::ExpiredAt) + .to_owned(), + Index::create().name(IDX_ACCESS_TOKEN_USER_ID_UPDATED_AT) + .table(Self::Table) + .col(Self::UserId) + .col(Self::UpdatedAt) + .to_owned(), + ] + } + fn table_drop_statement() -> TableDropStatement { + Table::drop().table(Self::Table).to_owned() + } +} + +#[derive(DeriveIden)] +pub enum ProgressCategory { + Table, + UserId, +} + +static IDX_PROGRESS_CATEGORY_USER_ID_NAME: &str = "idx_progress_category_user_id_name"; +static IDX_PROGRESS_CATEGORY_USER_ID_CREATED_AT: &str = "idx_progress_category_user_id_created_at"; +static IDX_PROGRESS_CATEGORY_USER_ID_UPDATED_AT: &str = "idx_progress_category_user_id_updated_at"; +static IDX_PROGRESS_CATEGORY_USER_ID_DELETED_AT: &str = "idx_progress_category_user_id_deleted_at"; +static FK_PROGRESS_CATEGORY_USER: &str = "fk_progress_category_user"; + +impl TableMigration for ProgressCategory { + + fn table_create_statement() -> TableCreateStatement{ + let mut tcs = DefaultProgressCategory::table_create_statement(); + tcs.col(integer(Self::UserId)); + tcs.foreign_key(ForeignKey::create().name(FK_PROGRESS_CATEGORY_USER).from(Self::Table, Self::UserId) + .to(User::Table, User::Id)); + tcs.primary_key(Index::create().name(PK_PROGRESS_CATEGORY).col(Self::UserId).col(DefaultProgressCategory::Id)); + tcs + } + + fn index_create_statements() -> Vec { + [DefaultProgressCategory::index_create_statements(), vec![ + Index::create().name(IDX_PROGRESS_CATEGORY_USER_ID_CREATED_AT) + .table(Self::Table) + .col(Self::UserId) + .col(DefaultProgressCategory::CreatedAt) + .to_owned(), + Index::create().name(IDX_PROGRESS_CATEGORY_USER_ID_DELETED_AT) + .table(Self::Table) + .col(Self::UserId) + .col(DefaultProgressCategory::DeletedAt) + .to_owned(), + Index::create().name(IDX_PROGRESS_CATEGORY_USER_ID_NAME) + .table(Self::Table) + .col(Self::UserId) + .col(DefaultProgressCategory::Name) + .to_owned(), + Index::create().name(IDX_PROGRESS_CATEGORY_USER_ID_UPDATED_AT) + .table(Self::Table) + .col(Self::UserId) + .col(DefaultProgressCategory::UpdatedAt) + .to_owned(), + ]].concat() + } + fn table_drop_statement() -> TableDropStatement { + DefaultProgressCategory::table_drop_statement() + } + + +} + +#[derive(DeriveIden)] +pub enum ProgressEntry { + Table, + UserId, +} + +static IDX_PROGRESS_ENTITY_USER_ID_CREATED_AT: &str = "idx_progress_entity_user_id_created_at"; +static IDX_PROGRESS_ENTITY_USER_ID_UPDATED_AT: &str = "idx_progress_entity_user_id_updated_at"; +static IDX_PROGRESS_ENTITY_USER_ID_DELETED_AT: &str = "idx_progress_entity_user_id_deleted_at"; +static IDX_PROGRESS_ENTITY_USER_ID_PROGRESSED_AT: &str = "idx_progress_entity_user_id_progressed_at"; +static FK_PROGRESS_ENTITY_PROGRESS_CATEGORY: &str = "fk_progress_entity_progress_category"; +static FK_PROGRESS_ENTITY_USER: &str = "fk_progress_entity_user"; + +impl TableMigration for ProgressEntry { + + fn table_create_statement() -> TableCreateStatement{ + let mut tcs: TableCreateStatement = DefaultProgressEntry::table_create_statement(); + tcs.col(integer(Self::UserId)); + tcs.foreign_key(ForeignKey::create() + .name(FK_PROGRESS_ENTITY_USER) + .from(Self::Table, Self::UserId) + .to(User::Table, User::Id) + ); + tcs.primary_key(Index::create().name(PK_PROGRESS_ENTITY).col(Self::UserId).col(DefaultProgressEntry::Id)); + + tcs + + } + + fn index_create_statements() -> Vec { + let mut default = DefaultProgressEntry::index_create_statements(); + default.append(&mut vec![ + Index::create().name(IDX_PROGRESS_ENTITY_USER_ID_CREATED_AT) + .table(Self::Table) + .col(Self::UserId) + .col(DefaultProgressEntry::CreatedAt) + .to_owned(), + Index::create().name(IDX_PROGRESS_ENTITY_USER_ID_DELETED_AT) + .table(Self::Table) + .col(Self::UserId) + .col(DefaultProgressEntry::DeletedAt) + .to_owned(), + Index::create().name(IDX_PROGRESS_ENTITY_USER_ID_PROGRESSED_AT) + .table(Self::Table) + .col(Self::UserId) + .col(DefaultProgressEntry::ProgressedAt) + .to_owned(), + Index::create().name(IDX_PROGRESS_ENTITY_USER_ID_UPDATED_AT) + .table(Self::Table) + .col(Self::UserId) + .col(DefaultProgressEntry::UpdatedAt) + .to_owned(), + ]); + default + } + + fn table_drop_statement() -> TableDropStatement { + DefaultProgressEntry::table_drop_statement() + } + + +} diff --git a/progress-pile-migration-server/src/main.rs b/progress-pile-migration-server/src/main.rs new file mode 100644 index 0000000..7d916d5 --- /dev/null +++ b/progress-pile-migration-server/src/main.rs @@ -0,0 +1,6 @@ +use sea_orm_migration::prelude::*; + +#[async_std::main] +async fn main() { + cli::run_cli(progress_pile_migration_server::Migrator).await; +} diff --git a/progress-pile-migration/Cargo.toml b/progress-pile-migration/Cargo.toml deleted file mode 100644 index dc8a84a..0000000 --- a/progress-pile-migration/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "progress-pile-migration" -version = "0.1.0" -edition = "2021" -publish = false - -[features] -default = ["client", "server"] -client = [] -server = ["sea-orm-migration/sqlx-postgres"] - -[dependencies] -async-std = { version = "1", features = ["attributes", "tokio1"] } - -[dependencies.sea-orm-migration] -version = "1.1.0" -features = [ - "runtime-tokio-rustls", - "sqlx-sqlite", -] \ No newline at end of file diff --git a/progress-pile-migration/src/lib.rs b/progress-pile-migration/src/lib.rs deleted file mode 100644 index ae14f0e..0000000 --- a/progress-pile-migration/src/lib.rs +++ /dev/null @@ -1,52 +0,0 @@ -pub use sea_orm_migration::prelude::*; - -mod m20220101_000001_create_table; - -#[cfg(feature="client")] -pub struct ClientMigrator; - -#[cfg(feature="client")] -#[async_trait::async_trait] -impl MigratorTrait for ClientMigrator { - fn migrations() -> Vec> { - vec![ - Box::new(m20220101_000001_create_table::ClientMigration), - ] - } -} - -#[cfg(feature="server")] -pub struct ServerMigrator; - -#[cfg(feature="server")] -#[async_trait::async_trait] -impl MigratorTrait for ServerMigrator { - fn migrations() -> Vec> { - vec![ - Box::new(m20220101_000001_create_table::ServerMigration), - ] - } -} - - -#[cfg(test)] -mod tests { - use sea_orm_migration::sea_orm::{ConnectOptions, Database}; - - use super::*; - #[cfg(feature="client")] - #[async_std::test] - async fn client_migration() { - let db = Database::connect(ConnectOptions::new("sqlite::memory:")).await.unwrap(); - ClientMigrator::up(&db, None).await.unwrap(); - ClientMigrator::down(&db, None).await.unwrap(); - } - #[cfg(feature="server")] - - #[async_std::test] - async fn server_migration() { - let db = Database::connect(ConnectOptions::new("sqlite::memory:")).await.unwrap(); - ServerMigrator::up(&db, None).await.unwrap(); - ServerMigrator::down(&db, None).await.unwrap(); - } -} \ No newline at end of file diff --git a/progress-pile-migration/src/m20220101_000001_create_table.rs b/progress-pile-migration/src/m20220101_000001_create_table.rs deleted file mode 100644 index 6066ddd..0000000 --- a/progress-pile-migration/src/m20220101_000001_create_table.rs +++ /dev/null @@ -1,532 +0,0 @@ -use sea_orm_migration::{prelude::*, schema::*}; - -#[cfg(feature="client")] -#[derive(DeriveMigrationName)] -pub struct ClientMigration; - -#[cfg(feature="client")] -#[async_trait::async_trait] -impl MigrationTrait for ClientMigration { - async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - ProgressCategory::up_client(manager).await?; - ProgressEntry::up_client(manager).await?; - Ok(()) - } - - async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - ProgressEntry::down_client(manager).await?; - ProgressCategory::down_client(manager).await?; - Ok(()) - } -} - -#[cfg(feature="server")] -#[derive(DeriveMigrationName)] -pub struct ServerMigration; - -#[cfg(feature="server")] - -#[async_trait::async_trait] -impl MigrationTrait for ServerMigration { - async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - User::up_server(manager).await?; - AccessToken::up_server(manager).await?; - ProgressCategory::up_server(manager).await?; - ProgressEntry::up_server(manager).await?; - Ok(()) - } - - async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - ProgressEntry::down_server(manager).await?; - ProgressCategory::down_server(manager).await?; - AccessToken::down_server(manager).await?; - User::down_server(manager).await - } -} - - - - -pub trait MigrationTableDefault { - - fn table_create_statement_default() -> TableCreateStatement; - fn index_create_statements_default() -> Vec; - fn table_drop_statement_default() -> TableDropStatement; - -} - - - - - -#[cfg(feature="client")] -#[async_trait::async_trait] -pub trait MigrationTableClient { - async fn up_client<'a>(manager: &'a SchemaManager<'a>) -> Result<(), DbErr> { - manager.create_table(Self::table_create_statement_client()).await?; - for statement in Self::index_create_statements_client().into_iter() { - manager.create_index(statement).await? - } - Ok(()) - } - async fn down_client<'a>(manager: &'a SchemaManager<'a>) -> Result<(), DbErr> { - manager.drop_table(Self::table_drop_statement_client()).await?; - Ok(()) - } - fn table_create_statement_client() -> TableCreateStatement; - fn index_create_statements_client() -> Vec; - fn table_drop_statement_client() -> TableDropStatement; -} - - -#[cfg(feature="server")] -#[async_trait::async_trait] -pub trait MigrationTableServer { - - async fn up_server<'a>(manager: &'a SchemaManager<'a>) -> Result<(), DbErr> { - manager.create_table(Self::table_create_statement_server()).await?; - for statement in Self::index_create_statements_server().into_iter() { - manager.create_index(statement).await? - } - Ok(()) - } - - async fn down_server<'a>(manager: &'a SchemaManager<'a>) -> Result<(), DbErr> { - manager.drop_table(Self::table_drop_statement_server()).await?; - Ok(()) - } - - fn table_create_statement_server() -> TableCreateStatement; - fn index_create_statements_server() -> Vec; - fn table_drop_statement_server() -> TableDropStatement; -} - -#[cfg(feature="server")] -#[derive(DeriveIden)] -pub enum User { - Table, - Id, - CreatedAt, - UpdatedAt, - DeletedAt, - LoginName, - PasswordHash, -} - -#[cfg(feature="server")] -static IDX_USER_LOGIN_NAME: &str = "idx_user_login_name"; -#[cfg(feature="server")] -static IDX_USER_CREATED_AT: &str = "idx_user_created_at"; -#[cfg(feature="server")] -static IDX_USER_UPDATED_AT: &str = "idx_user_updated_at"; -#[cfg(feature="server")] -static IDX_USER_DELETED_AT: &str = "idx_user_deleted_at"; - -#[cfg(feature="server")] -impl MigrationTableServer for User { - - fn table_create_statement_server() -> TableCreateStatement{ - Table::create() - .table(Self::Table) - .if_not_exists() - .col(pk_auto(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_uniq(Self::LoginName)) - .col(string(Self::PasswordHash)) - - .to_owned() - } - - fn index_create_statements_server() -> Vec { - vec![ - Index::create().name(IDX_USER_LOGIN_NAME) - .table(Self::Table) - .col(Self::LoginName) - .to_owned(), - Index::create().name(IDX_USER_CREATED_AT) - .table(Self::Table) - .col((Self::CreatedAt, IndexOrder::Desc)) - .to_owned(), - Index::create().name(IDX_USER_UPDATED_AT) - .table(Self::Table) - .col((Self::UpdatedAt, IndexOrder::Desc)) - .to_owned(), - Index::create().name(IDX_USER_DELETED_AT) - .table(Self::Table) - .col((Self::DeletedAt, IndexOrder::Desc)) - .to_owned(), - ] - } - - fn table_drop_statement_server() -> TableDropStatement { - Table::drop().table(Self::Table).to_owned() - } -} - -#[cfg(feature="server")] -#[derive(DeriveIden)] -pub enum AccessToken{ - Table, - Id, - UserId, - CreatedAt, - UpdatedAt, - ExpiredAt, - TokenValue, - Note, -} - -#[cfg(feature="server")] -static IDX_ACCESS_TOKEN_TOKEN_VALUE: &str = "idx_access_token_token_value"; -#[cfg(feature="server")] -static IDX_ACCESS_TOKEN_CREATED_AT: &str = "idx_access_token_created_at"; -#[cfg(feature="server")] -static IDX_ACCESS_TOKEN_UPDATED_AT: &str = "idx_access_token_updated_at"; -#[cfg(feature="server")] -static IDX_ACCESS_TOKEN_EXPIRED_AT: &str = "idx_access_token_expired_at"; -#[cfg(feature="server")] -static IDX_ACCESS_TOKEN_USER_ID_CREATED_AT: &str = "idx_access_token_user_id_created_at"; -#[cfg(feature="server")] -static IDX_ACCESS_TOKEN_USER_ID_UPDATED_AT: &str = "idx_access_token_user_id_updated_at"; -#[cfg(feature="server")] -static IDX_ACCESS_TOKEN_USER_ID_EXPIRED_AT: &str = "idx_access_token_user_id_expired_at"; -#[cfg(feature="server")] -static FK_ACCESS_TOKEN_USER: &str = "fk_access_token_user"; - -#[cfg(feature="server")] -impl MigrationTableServer for AccessToken { - - fn table_create_statement_server() -> TableCreateStatement { - Table::create() - .table(Self::Table) - .if_not_exists() - .col(pk_auto(Self::Id)) - .col(integer(Self::UserId)) - .col(timestamp_with_time_zone(Self::CreatedAt)) - .col(timestamp_with_time_zone(Self::UpdatedAt)) - .col(timestamp_with_time_zone_null(Self::ExpiredAt)) - .col(string(Self::TokenValue)) - .col(string(Self::Note)) - .foreign_key(ForeignKey::create() - .name(FK_ACCESS_TOKEN_USER) - .from(Self::Table, Self::UserId) - .to(User::Table, User::Id) - .on_delete(ForeignKeyAction::Cascade) - .on_update(ForeignKeyAction::Cascade) - ) - .to_owned() - } - fn index_create_statements_server() -> Vec { - vec![ - Index::create().name(IDX_ACCESS_TOKEN_CREATED_AT) - .table(Self::Table) - .col(Self::CreatedAt) - .to_owned(), - Index::create().name(IDX_ACCESS_TOKEN_EXPIRED_AT) - .table(Self::Table) - .col(Self::ExpiredAt) - .to_owned(), - Index::create().name(IDX_ACCESS_TOKEN_TOKEN_VALUE) - .table(Self::Table) - .col(Self::TokenValue) - .to_owned(), - Index::create().name(IDX_ACCESS_TOKEN_UPDATED_AT) - .table(Self::Table) - .col(Self::UpdatedAt) - .to_owned(), - Index::create().name(IDX_ACCESS_TOKEN_USER_ID_CREATED_AT) - .table(Self::Table) - .col(Self::UserId) - .col(Self::CreatedAt) - .to_owned(), - Index::create().name(IDX_ACCESS_TOKEN_USER_ID_EXPIRED_AT) - .table(Self::Table) - .col(Self::UserId) - .col(Self::ExpiredAt) - .to_owned(), - Index::create().name(IDX_ACCESS_TOKEN_USER_ID_UPDATED_AT) - .table(Self::Table) - .col(Self::UserId) - .col(Self::UpdatedAt) - .to_owned(), - ] - } - fn table_drop_statement_server() -> TableDropStatement { - Table::drop().table(Self::Table).to_owned() - } -} - -#[derive(DeriveIden)] -pub enum ProgressCategory { - Table, - #[cfg(feature="server")] - UserId, - Id, - CreatedAt, - UpdatedAt, - DeletedAt, - Name, -} - -static IDX_PROGRESS_CATEGORY_NAME: &str = "idx_progress_category_name"; -static IDX_PROGRESS_CATEGORY_CREATED_AT: &str = "idx_progress_category_created_at"; -static IDX_PROGRESS_CATEGORY_UPDATED_AT: &str = "idx_progress_category_updated_at"; -static IDX_PROGRESS_CATEGORY_DELETED_AT: &str = "idx_progress_category_deleted_at"; -#[cfg(feature="server")] -static IDX_PROGRESS_CATEGORY_USER_ID_NAME: &str = "idx_progress_category_user_id_name"; -#[cfg(feature="server")] -static IDX_PROGRESS_CATEGORY_USER_ID_CREATED_AT: &str = "idx_progress_category_user_id_created_at"; -#[cfg(feature="server")] -static IDX_PROGRESS_CATEGORY_USER_ID_UPDATED_AT: &str = "idx_progress_category_user_id_updated_at"; -#[cfg(feature="server")] -static IDX_PROGRESS_CATEGORY_USER_ID_DELETED_AT: &str = "idx_progress_category_user_id_deleted_at"; -#[cfg(feature="server")] -static FK_PROGRESS_CATEGORY_USER: &str = "fk_progress_category_user"; -static PK_PROGRESS_CATEGORY: &str = "pk_progress_category"; - -impl MigrationTableDefault for ProgressCategory { - - fn table_create_statement_default() -> TableCreateStatement { - Table::create() - .table(Self::Table) - .if_not_exists() - .col(string(Self::Name)) - .col(timestamp_with_time_zone(Self::CreatedAt)) - .col(timestamp_with_time_zone(Self::UpdatedAt)) - .col(timestamp_with_time_zone_null(Self::DeletedAt)) - .to_owned() - } - fn index_create_statements_default() -> Vec { - vec![ - Index::create().name(IDX_PROGRESS_CATEGORY_CREATED_AT) - .table(Self::Table) - .col(Self::CreatedAt) - .to_owned(), - Index::create().name(IDX_PROGRESS_CATEGORY_DELETED_AT) - .table(Self::Table) - .col(Self::DeletedAt) - .to_owned(), - Index::create().name(IDX_PROGRESS_CATEGORY_NAME) - .table(Self::Table) - .col(Self::Name) - .to_owned(), - Index::create().name(IDX_PROGRESS_CATEGORY_UPDATED_AT) - .table(Self::Table) - .col(Self::UpdatedAt) - .to_owned(), - ] - } - fn table_drop_statement_default() -> TableDropStatement { - Table::drop().table(Self::Table).to_owned() - } -} - -#[cfg(feature="client")] -impl MigrationTableClient for ProgressCategory { - fn table_create_statement_client() -> TableCreateStatement{ - let mut tcs = Self::table_create_statement_default(); - tcs.col(pk_uuid(Self::Id)); - tcs - } - fn index_create_statements_client() -> Vec { - Self::index_create_statements_default() - } - fn table_drop_statement_client() -> TableDropStatement{ - Self::table_drop_statement_default() - } -} - -#[cfg(feature="server")] -impl MigrationTableServer for ProgressCategory { - - fn table_create_statement_server() -> TableCreateStatement{ - let mut tcs = Self::table_create_statement_default(); - tcs.col(uuid(Self::Id)); - - tcs.col(integer(Self::UserId)); - tcs.foreign_key(ForeignKey::create().name(FK_PROGRESS_CATEGORY_USER).from(Self::Table, Self::UserId) - .to(User::Table, User::Id)); - tcs.primary_key(Index::create().name(PK_PROGRESS_CATEGORY).col(Self::UserId).col(Self::Id)); - tcs - } - - fn index_create_statements_server() -> Vec { - [Self::index_create_statements_default(), vec![ - Index::create().name(IDX_PROGRESS_CATEGORY_USER_ID_CREATED_AT) - .table(Self::Table) - .col(Self::UserId) - .col(Self::CreatedAt) - .to_owned(), - Index::create().name(IDX_PROGRESS_CATEGORY_USER_ID_DELETED_AT) - .table(Self::Table) - .col(Self::UserId) - .col(Self::DeletedAt) - .to_owned(), - Index::create().name(IDX_PROGRESS_CATEGORY_USER_ID_NAME) - .table(Self::Table) - .col(Self::UserId) - .col(Self::Name) - .to_owned(), - Index::create().name(IDX_PROGRESS_CATEGORY_USER_ID_UPDATED_AT) - .table(Self::Table) - .col(Self::UserId) - .col(Self::UpdatedAt) - .to_owned(), - ]].concat() - } - fn table_drop_statement_server() -> TableDropStatement { - Self::table_drop_statement_default() - } - - -} - -#[derive(DeriveIden)] -pub enum ProgressEntry { - Table, - #[cfg(feature="server")] - UserId, - Id, - ProgressCategoryId, - CreatedAt, - UpdatedAt, - DeletedAt, - ProgressedAt, - Quantity, - Note, -} - -static IDX_PROGRESS_ENTITY_CREATED_AT: &str = "idx_progress_entity_created_at"; -static IDX_PROGRESS_ENTITY_UPDATED_AT: &str = "idx_progress_entity_updated_at"; -static IDX_PROGRESS_ENTITY_DELETED_AT: &str = "idx_progress_entity_deleted_at"; -static IDX_PROGRESS_ENTITY_PROGRESSED_AT: &str = "idx_progress_entity_progressed_at"; -#[cfg(feature="server")] -static IDX_PROGRESS_ENTITY_USER_ID_CREATED_AT: &str = "idx_progress_entity_user_id_created_at"; -#[cfg(feature="server")] -static IDX_PROGRESS_ENTITY_USER_ID_UPDATED_AT: &str = "idx_progress_entity_user_id_updated_at"; -#[cfg(feature="server")] -static IDX_PROGRESS_ENTITY_USER_ID_DELETED_AT: &str = "idx_progress_entity_user_id_deleted_at"; -#[cfg(feature="server")] -static IDX_PROGRESS_ENTITY_USER_ID_PROGRESSED_AT: &str = "idx_progress_entity_user_id_progressed_at"; -static FK_PROGRESS_ENTITY_PROGRESS_CATEGORY: &str = "fk_progress_entity_progress_category"; -#[cfg(feature="server")] -static FK_PROGRESS_ENTITY_USER: &str = "fk_progress_entity_user"; -static PK_PROGRESS_ENTITY: &str = "pk_progress_entity"; - -impl MigrationTableDefault for ProgressEntry { - - fn table_create_statement_default() -> TableCreateStatement { - Table::create() - .table(Self::Table) - .if_not_exists() - .col(uuid(Self::Id)) - .col(uuid(Self::ProgressCategoryId)) - .col(timestamp_with_time_zone(Self::CreatedAt)) - .col(timestamp_with_time_zone(Self::UpdatedAt)) - .col(timestamp_with_time_zone_null(Self::DeletedAt)) - .col(timestamp_with_time_zone(Self::ProgressedAt)) - .col(integer(Self::Quantity)) - .col(string(Self::Note)) - .foreign_key(ForeignKey::create() - .name(FK_PROGRESS_ENTITY_PROGRESS_CATEGORY) - .from(Self::Table, Self::ProgressCategoryId) - .to(ProgressCategory::Table, ProgressCategory::Id) - .on_delete(ForeignKeyAction::Cascade) - .on_update(ForeignKeyAction::Cascade) - ) - .to_owned() - } - - fn index_create_statements_default() -> Vec { - vec![ - Index::create().name(IDX_PROGRESS_ENTITY_CREATED_AT) - .table(Self::Table) - .col(Self::CreatedAt) - .to_owned(), - Index::create().name(IDX_PROGRESS_ENTITY_DELETED_AT) - .table(Self::Table) - .col(Self::DeletedAt) - .to_owned(), - Index::create().name(IDX_PROGRESS_ENTITY_PROGRESSED_AT) - .table(Self::Table) - .col(Self::ProgressedAt) - .to_owned(), - Index::create().name(IDX_PROGRESS_ENTITY_UPDATED_AT) - .table(Self::Table) - .col(Self::UpdatedAt) - .to_owned(), - ] - } - - fn table_drop_statement_default() -> TableDropStatement { - Table::drop().table(Self::Table).to_owned() - } -} -#[cfg(feature="client")] -impl MigrationTableClient for ProgressEntry { - - fn table_create_statement_client() -> TableCreateStatement{ - let mut tcs: TableCreateStatement = Self::table_create_statement_default(); - tcs.primary_key(Index::create().name(PK_PROGRESS_ENTITY).col(Self::Id)); - tcs - } - fn index_create_statements_client() -> Vec { - Self::index_create_statements_default() - } - fn table_drop_statement_client() -> TableDropStatement { - Self::table_drop_statement_default() - } -} - -#[cfg(feature = "server")] -impl MigrationTableServer for ProgressEntry { - - fn table_create_statement_server() -> TableCreateStatement{ - let mut tcs: TableCreateStatement = Self::table_create_statement_default(); - tcs.col(integer(Self::UserId)); - tcs.foreign_key(ForeignKey::create() - .name(FK_PROGRESS_ENTITY_USER) - .from(Self::Table, Self::UserId) - .to(User::Table, User::Id) - ); - tcs.primary_key(Index::create().name(PK_PROGRESS_ENTITY).col(Self::UserId).col(Self::Id)); - - tcs - - } - - fn index_create_statements_server() -> Vec { - let mut default = Self::index_create_statements_default(); - default.append(&mut vec![ - Index::create().name(IDX_PROGRESS_ENTITY_USER_ID_CREATED_AT) - .table(Self::Table) - .col(Self::UserId) - .col(Self::CreatedAt) - .to_owned(), - Index::create().name(IDX_PROGRESS_ENTITY_USER_ID_DELETED_AT) - .table(Self::Table) - .col(Self::UserId) - .col(Self::DeletedAt) - .to_owned(), - Index::create().name(IDX_PROGRESS_ENTITY_USER_ID_PROGRESSED_AT) - .table(Self::Table) - .col(Self::UserId) - .col(Self::ProgressedAt) - .to_owned(), - Index::create().name(IDX_PROGRESS_ENTITY_USER_ID_UPDATED_AT) - .table(Self::Table) - .col(Self::UserId) - .col(Self::UpdatedAt) - .to_owned(), - ]); - default - } - - fn table_drop_statement_server() -> TableDropStatement { - Self::table_drop_statement_default() - } - - -} diff --git a/progress-pile-server/Cargo.toml b/progress-pile-server/Cargo.toml index 475b00b..27e79df 100644 --- a/progress-pile-server/Cargo.toml +++ b/progress-pile-server/Cargo.toml @@ -10,8 +10,8 @@ argon2 = "0.5.3" async-graphql.workspace = true axum = "0.8.4" clap = {workspace = true, features = ["derive"]} -progress-pile-core = {workspace = true} -progress-pile-migration = { workspace = true, features = ["server"] } +progress-pile-core = {workspace = true, features = ["desktop"]} +progress-pile-migration-server.workspace = true chrono = {workspace = true} sea-orm = { workspace = true, features = ["sqlx-postgres"] } serde.workspace = true diff --git a/progress-pile-server/src/entity/mod.rs b/progress-pile-server/src/entity/mod.rs index 9e7685e..4ea063a 100644 --- a/progress-pile-server/src/entity/mod.rs +++ b/progress-pile-server/src/entity/mod.rs @@ -45,7 +45,6 @@ mod tests { use std::time::Duration; use chrono::{offset, FixedOffset, Local, TimeZone}; use sea_orm::{entity::*, query::*, ConnectOptions, Database}; - use progress_pile_migration::{ServerMigrator, MigratorTrait}; use crate::{entity::*, global::GLOBAL}; #[tokio::test] diff --git a/progress-pile-server/src/global/database.rs b/progress-pile-server/src/global/database.rs index cb451d0..dd95c3e 100644 --- a/progress-pile-server/src/global/database.rs +++ b/progress-pile-server/src/global/database.rs @@ -1,4 +1,4 @@ -use progress_pile_migration::{ServerMigrator, MigratorTrait}; +use progress_pile_migration_server::{Migrator, MigratorTrait}; use sea_orm::{ConnectOptions, Database, DatabaseConnection}; use crate::error::Error; use tokio::sync::OnceCell; @@ -19,7 +19,7 @@ impl GlobalDatabase for Global { { Ok(self.database.get_or_try_init(|| async { let db = Database::connect(options).await?; - ServerMigrator::up(&db, None).await?; + Migrator::up(&db, None).await?; Ok::(db) }).await?) }