diff --git a/apps/recorder/src/migrations/defs.rs b/apps/recorder/src/migrations/defs.rs index 117e2b6..1f1514d 100644 --- a/apps/recorder/src/migrations/defs.rs +++ b/apps/recorder/src/migrations/defs.rs @@ -318,7 +318,7 @@ pub trait CustomSchemaManagerExt { } async fn create_foreign_key_if_not_exists< - T: IntoIden + 'static + Send, + T: ToString + 'static + Send, S: IntoIden + 'static + Send, >( &self, @@ -328,7 +328,7 @@ pub trait CustomSchemaManagerExt { ) -> Result<(), DbErr>; async fn drop_foreign_key_if_exists< - T: IntoIden + 'static + Send, + T: ToString + 'static + Send, S: IntoIden + 'static + Send, >( &self, @@ -424,7 +424,7 @@ impl CustomSchemaManagerExt for SchemaManager<'_> { } async fn create_foreign_key_if_not_exists< - T: IntoIden + 'static + Send, + T: ToString + 'static + Send, S: IntoIden + 'static + Send, >( &self, @@ -432,7 +432,7 @@ impl CustomSchemaManagerExt for SchemaManager<'_> { foreign_key: S, stmt: ForeignKeyCreateStatement, ) -> Result<(), DbErr> { - let from_tbl = from_tbl.into_iden().to_string(); + let from_tbl = from_tbl.to_string(); let foreign_key = foreign_key.into_iden().to_string(); let db = self .get_connection() @@ -442,7 +442,7 @@ impl CustomSchemaManagerExt for SchemaManager<'_> { " SELECT CONSTRAINT_NAME FROM information_schema.KEY_COLUMN_USAGE - WHERE TABLE_NAME = '{from_tbl}' AND CONSTRAINT_NAME = '{foreign_key}' + WHERE TABLE_NAME = {from_tbl} AND CONSTRAINT_NAME = '{foreign_key}' " ), )) @@ -457,7 +457,7 @@ impl CustomSchemaManagerExt for SchemaManager<'_> { } async fn drop_foreign_key_if_exists< - T: IntoIden + 'static + Send, + T: ToString + 'static + Send, S: IntoIden + 'static + Send, >( &self, @@ -465,7 +465,7 @@ impl CustomSchemaManagerExt for SchemaManager<'_> { foreign_key: S, stmt: ForeignKeyDropStatement, ) -> Result<(), DbErr> { - let from_tbl = from_tbl.into_iden().to_string(); + let from_tbl = from_tbl.to_string(); let foreign_key = foreign_key.into_iden().to_string(); let db = self .get_connection() @@ -475,7 +475,7 @@ impl CustomSchemaManagerExt for SchemaManager<'_> { " SELECT CONSTRAINT_NAME FROM information_schema.KEY_COLUMN_USAGE - WHERE TABLE_NAME = '{from_tbl}' AND CONSTRAINT_NAME = '{foreign_key}' + WHERE TABLE_NAME = {from_tbl} AND CONSTRAINT_NAME = '{foreign_key}' " ), )) diff --git a/apps/recorder/src/migrations/m20250501_021523_credential_3rd.rs b/apps/recorder/src/migrations/m20250501_021523_credential_3rd.rs index fde6c3a..2c34071 100644 --- a/apps/recorder/src/migrations/m20250501_021523_credential_3rd.rs +++ b/apps/recorder/src/migrations/m20250501_021523_credential_3rd.rs @@ -78,7 +78,7 @@ impl MigrationTrait for Migration { manager .create_foreign_key_if_not_exists( - Subscriptions::Table, + Subscriptions::Table.to_string(), "fk_subscriptions_credential_id", ForeignKeyCreateStatement::new() .name("fk_subscriptions_credential_id") diff --git a/apps/recorder/src/migrations/m20250520_021135_add_tasks.rs b/apps/recorder/src/migrations/m20250520_021135_add_tasks.rs index 0919819..10c6aa1 100644 --- a/apps/recorder/src/migrations/m20250520_021135_add_tasks.rs +++ b/apps/recorder/src/migrations/m20250520_021135_add_tasks.rs @@ -61,7 +61,7 @@ impl MigrationTrait for Migration { )).await?; db.execute_unprepared(&format!( - r#"CREATE OR REPLACE FUNCTION {SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_FUNCTION_NAME}() RETURNS trigger AS $$ + r#"CREATE OR REPLACE FUNCTION {apalis_schema}.{SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_FUNCTION_NAME}() RETURNS trigger AS $$ DECLARE new_job_subscriber_id integer; new_job_subscription_id integer; @@ -70,18 +70,19 @@ impl MigrationTrait for Migration { new_job_subscriber_id = (NEW.{job} ->> '{subscriber_id}')::integer; new_job_subscription_id = (NEW.{job} ->> '{subscription_id}')::integer; new_job_task_type = (NEW.{job} ->> '{task_type}')::text; - IF new_job_subscriber_id != (OLD.{job} ->> '{subscriber_id}')::integer AND new_job_subscriber_id != NEW.{subscriber_id} THEN + IF new_job_subscriber_id IS DISTINCT FROM (OLD.{job} ->> '{subscriber_id}')::integer AND new_job_subscriber_id IS DISTINCT FROM NEW.{subscriber_id} THEN NEW.{subscriber_id} = new_job_subscriber_id; END IF; - IF new_job_subscription_id != (OLD.{job} ->> '{subscription_id}')::integer AND new_job_subscription_id != NEW.{subscription_id} THEN + IF new_job_subscription_id IS DISTINCT FROM (OLD.{job} ->> '{subscription_id}')::integer AND new_job_subscription_id IS DISTINCT FROM NEW.{subscription_id} THEN NEW.{subscription_id} = new_job_subscription_id; END IF; - IF new_job_task_type != (OLD.{job} ->> '{task_type}')::text AND new_job_task_type != NEW.{task_type} THEN + IF new_job_task_type IS DISTINCT FROM (OLD.{job} ->> '{task_type}')::text AND new_job_task_type IS DISTINCT FROM NEW.{task_type} THEN NEW.{task_type} = new_job_task_type; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql;"#, + apalis_schema = ApalisSchema::Schema.to_string(), job = ApalisJobs::Job.to_string(), subscriber_id = ApalisJobs::SubscriberId.to_string(), subscription_id = ApalisJobs::SubscriptionId.to_string(), @@ -92,7 +93,7 @@ impl MigrationTrait for Migration { r#"CREATE OR REPLACE TRIGGER {SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_TRIGGER_NAME} BEFORE INSERT OR UPDATE ON {apalis_schema}.{apalis_table} FOR EACH ROW - EXECUTE FUNCTION {SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_FUNCTION_NAME}();"#, + EXECUTE FUNCTION {apalis_schema}.{SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_FUNCTION_NAME}();"#, apalis_schema = ApalisSchema::Schema.to_string(), apalis_table = ApalisJobs::Table.to_string() )) @@ -198,7 +199,8 @@ impl MigrationTrait for Migration { )).await?; db.execute_unprepared(&format!( - r#"DROP FUNCTION IF EXISTS {SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_FUNCTION_NAME}()"#, + r#"DROP FUNCTION IF EXISTS {apalis_schema}.{SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_FUNCTION_NAME}()"#, + apalis_schema = ApalisSchema::Schema.to_string(), )) .await?; diff --git a/apps/recorder/src/migrations/m20250622_020819_bangumi_and_episode_type.rs b/apps/recorder/src/migrations/m20250622_020819_bangumi_and_episode_type.rs index 3c033d3..723c514 100644 --- a/apps/recorder/src/migrations/m20250622_020819_bangumi_and_episode_type.rs +++ b/apps/recorder/src/migrations/m20250622_020819_bangumi_and_episode_type.rs @@ -15,6 +15,8 @@ pub struct Migration; #[async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + let db = manager.get_connection(); + create_postgres_enum_for_active_enum!(manager, EpisodeTypeEnum, EpisodeType::Mikan).await?; { @@ -29,11 +31,17 @@ impl MigrationTrait for Migration { BangumiTypeEnum, BangumiType::iden_values(), )) - .drop_column(Bangumi::SavePath) .to_owned(), ) .await?; + db.execute_unprepared(&format!( + r#"ALTER TABLE {bangumi} DROP COLUMN IF EXISTS {save_path}"#, + bangumi = Bangumi::Table.to_string(), + save_path = Bangumi::SavePath.to_string(), + )) + .await?; + manager .exec_stmt( UpdateStatement::new() @@ -83,11 +91,17 @@ impl MigrationTrait for Migration { .add_column_if_not_exists(big_integer_null( Episodes::EnclosureContentLength, )) - .drop_column(Episodes::SavePath) .to_owned(), ) .await?; + db.execute_unprepared(&format!( + r#"ALTER TABLE {episodes} DROP COLUMN IF EXISTS {save_path}"#, + episodes = Episodes::Table.to_string(), + save_path = Episodes::SavePath.to_string(), + )) + .await?; + manager .exec_stmt( UpdateStatement::new() @@ -120,10 +134,34 @@ impl MigrationTrait for Migration { } async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .alter_table( + Table::alter() + .table(Bangumi::Table) + .add_column_if_not_exists(text_null(Bangumi::SavePath)) + .drop_column(Bangumi::BangumiType) + .to_owned(), + ) + .await?; + manager .drop_postgres_enum_for_active_enum(BangumiTypeEnum) .await?; + manager + .alter_table( + Table::alter() + .table(Episodes::Table) + .add_column_if_not_exists(text_null(Episodes::SavePath)) + .drop_column(Episodes::EpisodeType) + .drop_column(Episodes::EnclosureMagnetLink) + .drop_column(Episodes::EnclosureTorrentLink) + .drop_column(Episodes::EnclosurePubDate) + .drop_column(Episodes::EnclosureContentLength) + .to_owned(), + ) + .await?; + manager .drop_postgres_enum_for_active_enum(EpisodeTypeEnum) .await?; diff --git a/apps/recorder/src/migrations/m20250629_065628_add_cron.rs b/apps/recorder/src/migrations/m20250629_065628_add_cron.rs index d8537f3..5f421a5 100644 --- a/apps/recorder/src/migrations/m20250629_065628_add_cron.rs +++ b/apps/recorder/src/migrations/m20250629_065628_add_cron.rs @@ -105,13 +105,13 @@ impl MigrationTrait for Migration { new_subscriber_task_subscriber_id = (NEW.{subscriber_task_cron} ->> 'subscriber_id')::integer; new_subscriber_task_subscription_id = (NEW.{subscriber_task_cron} ->> 'subscription_id')::integer; new_system_task_subscriber_id = (NEW.{system_task_cron} ->> 'subscriber_id')::integer; - IF new_subscriber_task_subscriber_id != (OLD.{subscriber_task_cron} ->> 'subscriber_id')::integer AND new_subscriber_task_subscriber_id != NEW.{subscriber_id} THEN + IF new_subscriber_task_subscriber_id IS DISTINCT FROM (OLD.{subscriber_task_cron} ->> 'subscriber_id')::integer AND new_subscriber_task_subscriber_id IS DISTINCT FROM NEW.{subscriber_id} THEN NEW.{subscriber_id} = new_subscriber_task_subscriber_id; END IF; - IF new_subscriber_task_subscription_id != (OLD.{subscriber_task_cron} ->> 'subscription_id')::integer AND new_subscriber_task_subscription_id != NEW.{subscription_id} THEN + IF new_subscriber_task_subscription_id IS DISTINCT FROM (OLD.{subscriber_task_cron} ->> 'subscription_id')::integer AND new_subscriber_task_subscription_id IS DISTINCT FROM NEW.{subscription_id} THEN NEW.{subscription_id} = new_subscriber_task_subscription_id; END IF; - IF new_system_task_subscriber_id != (OLD.{system_task_cron} ->> 'subscriber_id')::integer AND new_system_task_subscriber_id != NEW.{subscriber_id} THEN + IF new_system_task_subscriber_id IS DISTINCT FROM (OLD.{system_task_cron} ->> 'subscriber_id')::integer AND new_system_task_subscriber_id IS DISTINCT FROM NEW.{subscriber_id} THEN NEW.{subscriber_id} = new_system_task_subscriber_id; END IF; RETURN NEW; @@ -154,8 +154,8 @@ impl MigrationTrait for Migration { OLD.{next_run} IS NULL OR OLD.{next_run} > CURRENT_TIMESTAMP OR OLD.{enabled} = false - OR OLD.{status} != '{pending}' - OR OLD.{attempts} != NEW.{attempts} + OR OLD.{status} IS DISTINCT FROM '{pending}' + OR OLD.{attempts} IS DISTINCT FROM NEW.{attempts} ) THEN PERFORM pg_notify('{CRON_DUE_EVENT}', row_to_json(NEW)::text); @@ -341,7 +341,7 @@ impl MigrationTrait for Migration { .await?; db.execute_unprepared(&format!( - r#"CREATE OR REPLACE FUNCTION {SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_FUNCTION_NAME}() RETURNS trigger AS $$ + r#"CREATE OR REPLACE FUNCTION {apalis_schema}.{SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_FUNCTION_NAME}() RETURNS trigger AS $$ DECLARE new_job_subscriber_id integer; new_job_subscription_id integer; @@ -352,21 +352,22 @@ impl MigrationTrait for Migration { new_job_subscription_id = (NEW.{job} ->> '{subscription_id}')::integer; new_job_cron_id = (NEW.{job} ->> '{cron_id}')::integer; new_job_task_type = (NEW.{job} ->> '{task_type}')::text; - IF new_job_subscriber_id != (OLD.{job} ->> '{subscriber_id}')::integer AND new_job_subscriber_id != NEW.{subscriber_id} THEN + IF new_job_subscriber_id IS DISTINCT FROM (OLD.{job} ->> '{subscriber_id}')::integer AND new_job_subscriber_id IS DISTINCT FROM NEW.{subscriber_id} THEN NEW.{subscriber_id} = new_job_subscriber_id; END IF; - IF new_job_subscription_id != (OLD.{job} ->> '{subscription_id}')::integer AND new_job_subscription_id != NEW.{subscription_id} THEN + IF new_job_subscription_id IS DISTINCT FROM (OLD.{job} ->> '{subscription_id}')::integer AND new_job_subscription_id IS DISTINCT FROM NEW.{subscription_id} THEN NEW.{subscription_id} = new_job_subscription_id; END IF; - IF new_job_cron_id != (OLD.{job} ->> '{cron_id}')::integer AND new_job_cron_id != NEW.{cron_id} THEN + IF new_job_cron_id IS DISTINCT FROM (OLD.{job} ->> '{cron_id}')::integer AND new_job_cron_id IS DISTINCT FROM NEW.{cron_id} THEN NEW.{cron_id} = new_job_cron_id; END IF; - IF new_job_task_type != (OLD.{job} ->> '{task_type}')::text AND new_job_task_type != NEW.{task_type} THEN + IF new_job_task_type IS DISTINCT FROM (OLD.{job} ->> '{task_type}')::text AND new_job_task_type IS DISTINCT FROM NEW.{task_type} THEN NEW.{task_type} = new_job_task_type; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql;"#, + apalis_schema = ApalisSchema::Schema.to_string(), job = ApalisJobs::Job.to_string(), subscriber_id = ApalisJobs::SubscriberId.to_string(), subscription_id = ApalisJobs::SubscriptionId.to_string(), @@ -381,7 +382,7 @@ impl MigrationTrait for Migration { let db = manager.get_connection(); db.execute_unprepared(&format!( - r#"CREATE OR REPLACE FUNCTION {SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_FUNCTION_NAME}() RETURNS trigger AS $$ + r#"CREATE OR REPLACE FUNCTION {apalis_schema}.{SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_FUNCTION_NAME}() RETURNS trigger AS $$ DECLARE new_job_subscriber_id integer; new_job_subscription_id integer; @@ -390,18 +391,19 @@ impl MigrationTrait for Migration { new_job_subscriber_id = (NEW.{job} ->> '{subscriber_id}')::integer; new_job_subscription_id = (NEW.{job} ->> '{subscription_id}')::integer; new_job_task_type = (NEW.{job} ->> '{task_type}')::text; - IF new_job_subscriber_id != (OLD.{job} ->> '{subscriber_id}')::integer AND new_job_subscriber_id != NEW.{subscriber_id} THEN + IF new_job_subscriber_id IS DISTINCT FROM (OLD.{job} ->> '{subscriber_id}')::integer AND new_job_subscriber_id IS DISTINCT FROM NEW.{subscriber_id} THEN NEW.{subscriber_id} = new_job_subscriber_id; END IF; - IF new_job_subscription_id != (OLD.{job} ->> '{subscription_id}')::integer AND new_job_subscription_id != NEW.{subscription_id} THEN + IF new_job_subscription_id IS DISTINCT FROM (OLD.{job} ->> '{subscription_id}')::integer AND new_job_subscription_id IS DISTINCT FROM NEW.{subscription_id} THEN NEW.{subscription_id} = new_job_subscription_id; END IF; - IF new_job_task_type != (OLD.{job} ->> '{task_type}')::text AND new_job_task_type != NEW.{task_type} THEN + IF new_job_task_type IS DISTINCT FROM (OLD.{job} ->> '{task_type}')::text AND new_job_task_type IS DISTINCT FROM NEW.{task_type} THEN NEW.{task_type} = new_job_task_type; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql;"#, + apalis_schema = ApalisSchema::Schema.to_string(), job = ApalisJobs::Job.to_string(), subscriber_id = ApalisJobs::SubscriberId.to_string(), subscription_id = ApalisJobs::SubscriptionId.to_string(),