diff --git a/entity/src/transaction.rs b/entity/src/transaction.rs index 3ba4dcc..b8c25e9 100644 --- a/entity/src/transaction.rs +++ b/entity/src/transaction.rs @@ -11,7 +11,7 @@ pub struct Model { pub transaction_type: String, pub total_amount: Decimal, pub timestamp: DateTime, - pub title: String, + pub title: Option, pub emoji: Option, pub notes: Option, pub receipt: Option, diff --git a/justfile b/justfile new file mode 100755 index 0000000..46d5425 --- /dev/null +++ b/justfile @@ -0,0 +1,12 @@ +#!/usr/bin/env just --justfile + +generate-migration: + sea-orm-cli migrate generate $1 + +migrate: + sea-orm-cli migrate up + +generate-entities: + sea-orm-cli generate entity --with-serde both \ + -l -o entity/src \ + --ignore-tables monzo_ingestion_seaql_migrations diff --git a/migration/src/lib.rs b/migration/src/lib.rs index 7811a95..03529c4 100644 --- a/migration/src/lib.rs +++ b/migration/src/lib.rs @@ -2,6 +2,7 @@ pub use sea_orm_migration::prelude::*; pub mod m20230904_141851_create_monzo_tables; mod m20240529_195030_add_transaction_identity_hash; +mod m20240603_162500_make_title_optional; pub struct Migrator; @@ -15,6 +16,7 @@ impl MigratorTrait for Migrator { vec![ Box::new(m20230904_141851_create_monzo_tables::Migration), Box::new(m20240529_195030_add_transaction_identity_hash::Migration), + Box::new(m20240603_162500_make_title_optional::Migration), ] } } diff --git a/migration/src/m20240603_162500_make_title_optional.rs b/migration/src/m20240603_162500_make_title_optional.rs new file mode 100644 index 0000000..8e8d45e --- /dev/null +++ b/migration/src/m20240603_162500_make_title_optional.rs @@ -0,0 +1,47 @@ +use sea_orm_migration::prelude::*; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager.alter_table( + TableAlterStatement::new() + .table(Transaction::Table) + .modify_column(ColumnDef::new(Transaction::Title).string().null()) + .to_owned() + ).await?; + + // Set all empty string titles to null + manager.get_connection().execute_unprepared(r#" + update transaction + set title = null + where title = '' + "#).await?; + + Ok(()) + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + // Set all null titles to empty string when reverting + manager.get_connection().execute_unprepared(r#" + update transaction + set title = '' + where title is null + "#).await?; + + manager.alter_table( + TableAlterStatement::new() + .table(Transaction::Table) + .modify_column(ColumnDef::new(Transaction::Title).string().not_null()) + .to_owned() + ).await + } +} + +#[derive(DeriveIden)] +enum Transaction { + Table, + Title, +}