Split migration to client, server and core
This commit is contained in:
parent
a0356c5ed0
commit
de3708a291
25 changed files with 695 additions and 680 deletions
86
Cargo.lock
generated
86
Cargo.lock
generated
|
@ -2664,7 +2664,7 @@ dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
"dirs",
|
"dirs",
|
||||||
"progress-pile-core",
|
"progress-pile-core",
|
||||||
"progress-pile-migration",
|
"progress-pile-migration-client",
|
||||||
"sea-orm",
|
"sea-orm",
|
||||||
"serde",
|
"serde",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
|
@ -2704,10 +2704,28 @@ dependencies = [
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "progress-pile-migration"
|
name = "progress-pile-migration-client"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-std",
|
"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",
|
"sea-orm-migration",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -2722,7 +2740,7 @@ dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"clap",
|
"clap",
|
||||||
"progress-pile-core",
|
"progress-pile-core",
|
||||||
"progress-pile-migration",
|
"progress-pile-migration-server",
|
||||||
"rand 0.9.1",
|
"rand 0.9.1",
|
||||||
"sea-orm",
|
"sea-orm",
|
||||||
"serde",
|
"serde",
|
||||||
|
@ -2901,20 +2919,6 @@ version = "0.8.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
|
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]]
|
[[package]]
|
||||||
name = "rsa"
|
name = "rsa"
|
||||||
version = "0.9.8"
|
version = "0.9.8"
|
||||||
|
@ -2967,37 +2971,6 @@ dependencies = [
|
||||||
"windows-sys 0.59.0",
|
"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]]
|
[[package]]
|
||||||
name = "rustversion"
|
name = "rustversion"
|
||||||
version = "1.0.20"
|
version = "1.0.20"
|
||||||
|
@ -3396,7 +3369,6 @@ dependencies = [
|
||||||
"native-tls",
|
"native-tls",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"rustls",
|
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"sha2",
|
"sha2",
|
||||||
|
@ -3407,7 +3379,6 @@ dependencies = [
|
||||||
"tracing",
|
"tracing",
|
||||||
"url",
|
"url",
|
||||||
"uuid",
|
"uuid",
|
||||||
"webpki-roots",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -4002,12 +3973,6 @@ version = "0.2.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
|
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "untrusted"
|
|
||||||
version = "0.9.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "url"
|
name = "url"
|
||||||
version = "2.5.4"
|
version = "2.5.4"
|
||||||
|
@ -4186,15 +4151,6 @@ dependencies = [
|
||||||
"wasm-bindgen",
|
"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]]
|
[[package]]
|
||||||
name = "whoami"
|
name = "whoami"
|
||||||
version = "1.6.0"
|
version = "1.6.0"
|
||||||
|
|
|
@ -10,7 +10,9 @@ dirs = "6.0.0"
|
||||||
dotenv = "0.15.0"
|
dotenv = "0.15.0"
|
||||||
progress-pile-client = { path = "progress-pile-client", default-features = false }
|
progress-pile-client = { path = "progress-pile-client", default-features = false }
|
||||||
progress-pile-core = { path = "progress-pile-core", 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"
|
progress-pile-server.path = "progress-pile-server"
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
tempfile = "3.20.0"
|
tempfile = "3.20.0"
|
||||||
|
|
|
@ -5,7 +5,7 @@ edition = "2024"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["desktop"]
|
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"]
|
web = ["uuid/js"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
@ -14,7 +14,7 @@ chrono-tz.workspace = true
|
||||||
clap = { workspace = true, optional = true }
|
clap = { workspace = true, optional = true }
|
||||||
dirs.workspace = true
|
dirs.workspace = true
|
||||||
progress-pile-core.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 }
|
sea-orm = { workspace = true, optional = true }
|
||||||
serde.workspace = true
|
serde.workspace = true
|
||||||
thiserror.workspace = true
|
thiserror.workspace = true
|
||||||
|
|
|
@ -24,7 +24,6 @@ mod tests {
|
||||||
use chrono::Local;
|
use chrono::Local;
|
||||||
use progress_pile_core::global::GlobalDatabase;
|
use progress_pile_core::global::GlobalDatabase;
|
||||||
use sea_orm::{entity::*, ConnectOptions, Database, DatabaseConnection};
|
use sea_orm::{entity::*, ConnectOptions, Database, DatabaseConnection};
|
||||||
use progress_pile_migration::{ClientMigrator, MigratorTrait};
|
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
use crate::error::Error;
|
use crate::error::Error;
|
||||||
use crate::global::GLOBAL;
|
use crate::global::GLOBAL;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use progress_pile_migration::{ClientMigrator, MigratorTrait};
|
use progress_pile_migration_client::{Migrator, MigratorTrait};
|
||||||
use sea_orm::{ConnectOptions, Database, DatabaseConnection};
|
use sea_orm::{ConnectOptions, Database, DatabaseConnection};
|
||||||
use crate::error::Error;
|
use crate::error::Error;
|
||||||
use tokio::sync::OnceCell;
|
use tokio::sync::OnceCell;
|
||||||
|
@ -19,7 +19,7 @@ impl GlobalDatabase for Global {
|
||||||
{
|
{
|
||||||
Ok(self.database.get_or_try_init(|| async {
|
Ok(self.database.get_or_try_init(|| async {
|
||||||
let db = Database::connect(options).await?;
|
let db = Database::connect(options).await?;
|
||||||
ClientMigrator::up(&db, None).await?;
|
Migrator::up(&db, None).await?;
|
||||||
Ok::<DatabaseConnection, Error>(db)
|
Ok::<DatabaseConnection, Error>(db)
|
||||||
}).await?)
|
}).await?)
|
||||||
}
|
}
|
||||||
|
|
19
progress-pile-migration-client/Cargo.toml
Normal file
19
progress-pile-migration-client/Cargo.toml
Normal file
|
@ -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
|
||||||
|
]
|
12
progress-pile-migration-client/src/lib.rs
Normal file
12
progress-pile-migration-client/src/lib.rs
Normal file
|
@ -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<Box<dyn MigrationTrait>> {
|
||||||
|
vec![Box::new(m20220101_000001_create_table::Migration)]
|
||||||
|
}
|
||||||
|
}
|
|
@ -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<IndexCreateStatement> {
|
||||||
|
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<IndexCreateStatement> {
|
||||||
|
DefaultProgressEntry::index_create_statements()
|
||||||
|
}
|
||||||
|
fn table_drop_statement() -> TableDropStatement {
|
||||||
|
DefaultProgressEntry::table_drop_statement()
|
||||||
|
}
|
||||||
|
}
|
6
progress-pile-migration-client/src/main.rs
Normal file
6
progress-pile-migration-client/src/main.rs
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
use sea_orm_migration::prelude::*;
|
||||||
|
|
||||||
|
#[async_std::main]
|
||||||
|
async fn main() {
|
||||||
|
cli::run_cli(progress_pile_migration_client::Migrator).await;
|
||||||
|
}
|
9
progress-pile-migration-core/Cargo.toml
Normal file
9
progress-pile-migration-core/Cargo.toml
Normal file
|
@ -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"
|
41
progress-pile-migration-core/README.md
Normal file
41
progress-pile-migration-core/README.md
Normal file
|
@ -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
|
||||||
|
```
|
1
progress-pile-migration-core/src/lib.rs
Normal file
1
progress-pile-migration-core/src/lib.rs
Normal file
|
@ -0,0 +1 @@
|
||||||
|
pub mod m20220101_000001_create_table;
|
|
@ -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<IndexCreateStatement>;
|
||||||
|
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<IndexCreateStatement> {
|
||||||
|
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<IndexCreateStatement> {
|
||||||
|
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()
|
||||||
|
}
|
||||||
|
}
|
19
progress-pile-migration-server/Cargo.toml
Normal file
19
progress-pile-migration-server/Cargo.toml
Normal file
|
@ -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
|
||||||
|
]
|
41
progress-pile-migration-server/README.md
Normal file
41
progress-pile-migration-server/README.md
Normal file
|
@ -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
|
||||||
|
```
|
12
progress-pile-migration-server/src/lib.rs
Normal file
12
progress-pile-migration-server/src/lib.rs
Normal file
|
@ -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<Box<dyn MigrationTrait>> {
|
||||||
|
vec![Box::new(m20220101_000001_create_table::Migration)]
|
||||||
|
}
|
||||||
|
}
|
|
@ -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<IndexCreateStatement> {
|
||||||
|
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<IndexCreateStatement> {
|
||||||
|
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<IndexCreateStatement> {
|
||||||
|
[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<IndexCreateStatement> {
|
||||||
|
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()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
6
progress-pile-migration-server/src/main.rs
Normal file
6
progress-pile-migration-server/src/main.rs
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
use sea_orm_migration::prelude::*;
|
||||||
|
|
||||||
|
#[async_std::main]
|
||||||
|
async fn main() {
|
||||||
|
cli::run_cli(progress_pile_migration_server::Migrator).await;
|
||||||
|
}
|
|
@ -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",
|
|
||||||
]
|
|
|
@ -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<Box<dyn MigrationTrait>> {
|
|
||||||
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<Box<dyn MigrationTrait>> {
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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<IndexCreateStatement>;
|
|
||||||
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<IndexCreateStatement>;
|
|
||||||
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<IndexCreateStatement>;
|
|
||||||
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<IndexCreateStatement> {
|
|
||||||
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<IndexCreateStatement> {
|
|
||||||
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<IndexCreateStatement> {
|
|
||||||
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<IndexCreateStatement> {
|
|
||||||
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<IndexCreateStatement> {
|
|
||||||
[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<IndexCreateStatement> {
|
|
||||||
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<IndexCreateStatement> {
|
|
||||||
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<IndexCreateStatement> {
|
|
||||||
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()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -10,8 +10,8 @@ argon2 = "0.5.3"
|
||||||
async-graphql.workspace = true
|
async-graphql.workspace = true
|
||||||
axum = "0.8.4"
|
axum = "0.8.4"
|
||||||
clap = {workspace = true, features = ["derive"]}
|
clap = {workspace = true, features = ["derive"]}
|
||||||
progress-pile-core = {workspace = true}
|
progress-pile-core = {workspace = true, features = ["desktop"]}
|
||||||
progress-pile-migration = { workspace = true, features = ["server"] }
|
progress-pile-migration-server.workspace = true
|
||||||
chrono = {workspace = true}
|
chrono = {workspace = true}
|
||||||
sea-orm = { workspace = true, features = ["sqlx-postgres"] }
|
sea-orm = { workspace = true, features = ["sqlx-postgres"] }
|
||||||
serde.workspace = true
|
serde.workspace = true
|
||||||
|
|
|
@ -45,7 +45,6 @@ mod tests {
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use chrono::{offset, FixedOffset, Local, TimeZone};
|
use chrono::{offset, FixedOffset, Local, TimeZone};
|
||||||
use sea_orm::{entity::*, query::*, ConnectOptions, Database};
|
use sea_orm::{entity::*, query::*, ConnectOptions, Database};
|
||||||
use progress_pile_migration::{ServerMigrator, MigratorTrait};
|
|
||||||
use crate::{entity::*, global::GLOBAL};
|
use crate::{entity::*, global::GLOBAL};
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use progress_pile_migration::{ServerMigrator, MigratorTrait};
|
use progress_pile_migration_server::{Migrator, MigratorTrait};
|
||||||
use sea_orm::{ConnectOptions, Database, DatabaseConnection};
|
use sea_orm::{ConnectOptions, Database, DatabaseConnection};
|
||||||
use crate::error::Error;
|
use crate::error::Error;
|
||||||
use tokio::sync::OnceCell;
|
use tokio::sync::OnceCell;
|
||||||
|
@ -19,7 +19,7 @@ impl GlobalDatabase for Global {
|
||||||
{
|
{
|
||||||
Ok(self.database.get_or_try_init(|| async {
|
Ok(self.database.get_or_try_init(|| async {
|
||||||
let db = Database::connect(options).await?;
|
let db = Database::connect(options).await?;
|
||||||
ServerMigrator::up(&db, None).await?;
|
Migrator::up(&db, None).await?;
|
||||||
Ok::<DatabaseConnection, Error>(db)
|
Ok::<DatabaseConnection, Error>(db)
|
||||||
}).await?)
|
}).await?)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue