diff --git a/Cargo.lock b/Cargo.lock index bbdba88..07d21e8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -356,9 +356,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +checksum = "16c74e56284d2188cabb6ad99603d1ace887a5d7e7b695d01b728155ed9ed427" dependencies = [ "concurrent-queue", "event-listener-strategy", @@ -4169,9 +4169,9 @@ checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] name = "libfuzzer-sys" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" +checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404" dependencies = [ "arbitrary", "cc", @@ -10426,9 +10426,9 @@ dependencies = [ [[package]] name = "zune-jpeg" -version = "0.4.18" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7384255a918371b5af158218d131530f694de9ad3815ebdd0453a940485cb0fa" +checksum = "2c9e525af0a6a658e031e95f14b7f889976b74a11ba0eca5a5fc9ac8a1c43a6a" dependencies = [ "zune-core", ] diff --git a/Cargo.toml b/Cargo.toml index 89cb03a..6d1da71 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,9 +13,6 @@ members = [ resolver = "2" [profile.dev] -debug = 0 -# https://github.com/rust-lang/rust/issues/141540 -incremental = true # Then only change rust-analyzer incremental # [simd not supported by cranelift](https://github.com/rust-lang/rustc_codegen_cranelift/issues/171) # codegen-backend = "cranelift" diff --git a/apps/recorder/src/graphql/domains/cron.rs b/apps/recorder/src/graphql/domains/cron.rs index c57be46..e77bd69 100644 --- a/apps/recorder/src/graphql/domains/cron.rs +++ b/apps/recorder/src/graphql/domains/cron.rs @@ -17,8 +17,8 @@ fn skip_columns_for_entity_input(context: &mut BuilderContext) { for column in cron::Column::iter() { if matches!( column, - cron::Column::SubscriberTask - | cron::Column::SystemTask + cron::Column::SubscriberTaskCron + | cron::Column::SystemTaskCron | cron::Column::CronExpr | cron::Column::Enabled | cron::Column::TimeoutMs @@ -45,8 +45,11 @@ fn skip_columns_for_entity_input(context: &mut BuilderContext) { pub fn register_cron_to_schema_context(context: &mut BuilderContext) { restrict_subscriber_for_entity::(context, &cron::Column::SubscriberId); - restrict_subscriber_tasks_for_entity::(context, &cron::Column::SubscriberTask); - restrict_system_tasks_for_entity::(context, &cron::Column::SystemTask); + restrict_subscriber_tasks_for_entity::( + context, + &cron::Column::SubscriberTaskCron, + ); + restrict_system_tasks_for_entity::(context, &cron::Column::SystemTaskCron); skip_columns_for_entity_input(context); } diff --git a/apps/recorder/src/graphql/domains/system_tasks.rs b/apps/recorder/src/graphql/domains/system_tasks.rs index 78c09bd..d173235 100644 --- a/apps/recorder/src/graphql/domains/system_tasks.rs +++ b/apps/recorder/src/graphql/domains/system_tasks.rs @@ -7,7 +7,8 @@ use sea_orm::{ QuerySelect, QueryTrait, prelude::Expr, sea_query::Query, }; use seaography::{ - Builder as SeaographyBuilder, BuilderContext, SeaographyError, prepare_active_model, + Builder as SeaographyBuilder, BuilderContext, GuardAction, SeaographyError, + prepare_active_model, }; use ts_rs::TS; @@ -59,6 +60,14 @@ where restrict_jsonb_filter_input_for_entity::(context, column); convert_jsonb_output_for_entity::(context, column, Some(Case::Camel)); let entity_column_name = get_entity_and_column_name::(context, column); + context.guards.field_guards.insert( + entity_column_name.clone(), + Box::new(|_resolver_ctx| { + GuardAction::Block(Some( + "SystemTask can not be created by subscribers now".to_string(), + )) + }), + ); context.types.input_type_overwrites.insert( entity_column_name.clone(), @@ -112,6 +121,7 @@ pub fn register_system_tasks_to_schema_builder( .description(system_tasks::SystemTask::decl()), ); builder.register_enumeration::(); + builder.register_enumeration::(); builder = register_entity_default_readonly!(builder, system_tasks); let builder_context = builder.context; diff --git a/apps/recorder/src/migrations/defs.rs b/apps/recorder/src/migrations/defs.rs index 113df9e..117e2b6 100644 --- a/apps/recorder/src/migrations/defs.rs +++ b/apps/recorder/src/migrations/defs.rs @@ -189,8 +189,8 @@ pub enum Cron { MaxAttempts, Priority, Status, - SubscriberTask, - SystemTask, + SubscriberTaskCron, + SystemTaskCron, } #[derive(sea_query::Iden)] @@ -317,6 +317,26 @@ pub trait CustomSchemaManagerExt { Ok(()) } + async fn create_foreign_key_if_not_exists< + T: IntoIden + 'static + Send, + S: IntoIden + 'static + Send, + >( + &self, + from_tbl: T, + foreign_key: S, + stmt: ForeignKeyCreateStatement, + ) -> Result<(), DbErr>; + + async fn drop_foreign_key_if_exists< + T: IntoIden + 'static + Send, + S: IntoIden + 'static + Send, + >( + &self, + from_tbl: T, + foreign_key: S, + stmt: ForeignKeyDropStatement, + ) -> Result<(), DbErr>; + async fn create_postgres_enum_for_active_enum< E: IntoTypeRef + IntoIden + Send + Clone, I: IntoIterator + Send, @@ -403,6 +423,71 @@ impl CustomSchemaManagerExt for SchemaManager<'_> { Ok(()) } + async fn create_foreign_key_if_not_exists< + T: IntoIden + 'static + Send, + S: IntoIden + 'static + Send, + >( + &self, + from_tbl: T, + foreign_key: S, + stmt: ForeignKeyCreateStatement, + ) -> Result<(), DbErr> { + let from_tbl = from_tbl.into_iden().to_string(); + let foreign_key = foreign_key.into_iden().to_string(); + let db = self + .get_connection() + .query_one(Statement::from_string( + self.get_database_backend(), + format!( + " + SELECT CONSTRAINT_NAME + FROM information_schema.KEY_COLUMN_USAGE + WHERE TABLE_NAME = '{from_tbl}' AND CONSTRAINT_NAME = '{foreign_key}' + " + ), + )) + .await?; + + if db.is_some() { + return Ok(()); + } + + self.create_foreign_key(stmt).await?; + Ok(()) + } + + async fn drop_foreign_key_if_exists< + T: IntoIden + 'static + Send, + S: IntoIden + 'static + Send, + >( + &self, + from_tbl: T, + foreign_key: S, + stmt: ForeignKeyDropStatement, + ) -> Result<(), DbErr> { + let from_tbl = from_tbl.into_iden().to_string(); + let foreign_key = foreign_key.into_iden().to_string(); + let db = self + .get_connection() + .query_one(Statement::from_string( + self.get_database_backend(), + format!( + " + SELECT CONSTRAINT_NAME + FROM information_schema.KEY_COLUMN_USAGE + WHERE TABLE_NAME = '{from_tbl}' AND CONSTRAINT_NAME = '{foreign_key}' + " + ), + )) + .await?; + + if db.is_some() { + self.drop_foreign_key(stmt).await?; + } + + Ok(()) + } + async fn create_postgres_enum_for_active_enum< E: IntoTypeRef + IntoIden + Send + Clone, I: IntoIterator + Send, diff --git a/apps/recorder/src/migrations/m20241231_000001_auth.rs b/apps/recorder/src/migrations/m20241231_000001_auth.rs index 2029da9..c554cb2 100644 --- a/apps/recorder/src/migrations/m20241231_000001_auth.rs +++ b/apps/recorder/src/migrations/m20241231_000001_auth.rs @@ -90,6 +90,11 @@ impl MigrationTrait for Migration { SimpleExpr::from(AuthType::Basic).as_enum(AuthTypeEnum), seed_subscriber_id.into(), ]) + .on_conflict( + OnConflict::columns([Auth::Pid, Auth::AuthType]) + .do_nothing() + .to_owned(), + ) .to_owned(), ) .await?; diff --git a/apps/recorder/src/migrations/m20250501_021523_credential_3rd.rs b/apps/recorder/src/migrations/m20250501_021523_credential_3rd.rs index 51dab7f..fde6c3a 100644 --- a/apps/recorder/src/migrations/m20250501_021523_credential_3rd.rs +++ b/apps/recorder/src/migrations/m20250501_021523_credential_3rd.rs @@ -72,16 +72,22 @@ impl MigrationTrait for Migration { Table::alter() .table(Subscriptions::Table) .add_column_if_not_exists(integer_null(Subscriptions::CredentialId)) - .add_foreign_key( - TableForeignKey::new() - .name("fk_subscriptions_credential_id") - .from_tbl(Subscriptions::Table) - .from_col(Subscriptions::CredentialId) - .to_tbl(Credential3rd::Table) - .to_col(Credential3rd::Id) - .on_update(ForeignKeyAction::Cascade) - .on_delete(ForeignKeyAction::SetNull), - ) + .to_owned(), + ) + .await?; + + manager + .create_foreign_key_if_not_exists( + Subscriptions::Table, + "fk_subscriptions_credential_id", + ForeignKeyCreateStatement::new() + .name("fk_subscriptions_credential_id") + .from_tbl(Subscriptions::Table) + .from_col(Subscriptions::CredentialId) + .to_tbl(Credential3rd::Table) + .to_col(Credential3rd::Id) + .on_update(ForeignKeyAction::Cascade) + .on_delete(ForeignKeyAction::SetNull) .to_owned(), ) .await?; diff --git a/apps/recorder/src/migrations/m20250520_021135_add_tasks.rs b/apps/recorder/src/migrations/m20250520_021135_add_tasks.rs index bf2164d..0919819 100644 --- a/apps/recorder/src/migrations/m20250520_021135_add_tasks.rs +++ b/apps/recorder/src/migrations/m20250520_021135_add_tasks.rs @@ -23,7 +23,7 @@ impl MigrationTrait for Migration { .table((ApalisSchema::Schema, ApalisJobs::Table)) .add_column_if_not_exists(integer_null(ApalisJobs::SubscriberId)) .add_column_if_not_exists(integer_null(ApalisJobs::SubscriptionId)) - .add_column_if_not_exists(string_null(ApalisJobs::TaskType)) + .add_column_if_not_exists(text_null(ApalisJobs::TaskType)) .add_foreign_key( TableForeignKey::new() .name("fk_apalis_jobs_subscriber_id") diff --git a/apps/recorder/src/migrations/m20250629_065628_add_cron.rs b/apps/recorder/src/migrations/m20250629_065628_add_cron.rs index ed1cee7..d8537f3 100644 --- a/apps/recorder/src/migrations/m20250629_065628_add_cron.rs +++ b/apps/recorder/src/migrations/m20250629_065628_add_cron.rs @@ -56,8 +56,8 @@ impl MigrationTrait for Migration { CronStatusEnum, CronStatus::iden_values(), )) - .col(json_binary_null(Cron::SubscriberTask)) - .col(json_binary_null(Cron::SystemTask)) + .col(json_binary_null(Cron::SubscriberTaskCron)) + .col(json_binary_null(Cron::SystemTaskCron)) .foreign_key( ForeignKey::create() .name("fk_cron_subscriber_id") @@ -102,25 +102,25 @@ impl MigrationTrait for Migration { new_subscriber_task_subscription_id integer; new_system_task_subscriber_id integer; BEGIN - new_subscriber_task_subscriber_id = (NEW.{subscriber_task} ->> 'subscriber_id')::integer; - new_subscriber_task_subscription_id = (NEW.{subscriber_task} ->> 'subscription_id')::integer; - new_system_task_subscriber_id = (NEW.{system_task} ->> 'subscriber_id')::integer; - IF new_subscriber_task_subscriber_id != (OLD.{subscriber_task} ->> 'subscriber_id')::integer AND new_subscriber_task_subscriber_id != NEW.{subscriber_id} THEN + 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 NEW.{subscriber_id} = new_subscriber_task_subscriber_id; END IF; - IF new_subscriber_task_subscription_id != (OLD.{subscriber_task} ->> 'subscription_id')::integer AND new_subscriber_task_subscription_id != NEW.{subscription_id} THEN + IF new_subscriber_task_subscription_id != (OLD.{subscriber_task_cron} ->> 'subscription_id')::integer AND new_subscriber_task_subscription_id != NEW.{subscription_id} THEN NEW.{subscription_id} = new_subscriber_task_subscription_id; END IF; - IF new_system_task_subscriber_id != (OLD.{system_task} ->> 'subscriber_id')::integer AND new_system_task_subscriber_id != NEW.{subscriber_id} THEN + IF new_system_task_subscriber_id != (OLD.{system_task_cron} ->> 'subscriber_id')::integer AND new_system_task_subscriber_id != NEW.{subscriber_id} THEN NEW.{subscriber_id} = new_system_task_subscriber_id; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql;"#, - subscriber_task = &Cron::SubscriberTask.to_string(), + subscriber_task_cron = &Cron::SubscriberTaskCron.to_string(), subscriber_id = &Cron::SubscriberId.to_string(), subscription_id = &Cron::SubscriptionId.to_string(), - system_task = &Cron::SystemTask.to_string(), + system_task_cron = &Cron::SystemTaskCron.to_string(), )).await?; db.execute_unprepared(&format!( diff --git a/apps/recorder/src/models/cron/mod.rs b/apps/recorder/src/models/cron/mod.rs index 90b6a3e..cb721da 100644 --- a/apps/recorder/src/models/cron/mod.rs +++ b/apps/recorder/src/models/cron/mod.rs @@ -1,5 +1,4 @@ mod core; -mod registry; pub use core::{ CHECK_AND_TRIGGER_DUE_CRONS_FUNCTION_NAME, CRON_DUE_EVENT, @@ -71,8 +70,8 @@ pub struct Model { pub status: CronStatus, #[sea_orm(default_expr = "true")] pub enabled: bool, - pub subscriber_task: Option, - pub system_task: Option, + pub subscriber_task_cron: Option, + pub system_task_cron: Option, } #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] @@ -152,19 +151,19 @@ impl ActiveModelBehavior for ActiveModel { self.next_run = Set(Some(next_run)); } if let ActiveValue::Set(Some(subscriber_id)) = self.subscriber_id - && let ActiveValue::Set(Some(ref subscriber_task)) = self.subscriber_task + && let ActiveValue::Set(Some(ref subscriber_task)) = self.subscriber_task_cron && subscriber_task.get_subscriber_id() != subscriber_id { return Err(DbErr::Custom( - "Cron subscriber_id does not match subscriber_task.subscriber_id".to_string(), + "Cron subscriber_id does not match subscriber_task_cron.subscriber_id".to_string(), )); } if let ActiveValue::Set(Some(subscriber_id)) = self.subscriber_id - && let ActiveValue::Set(Some(ref system_task)) = self.system_task + && let ActiveValue::Set(Some(ref system_task)) = self.system_task_cron && system_task.get_subscriber_id() != Some(subscriber_id) { return Err(DbErr::Custom( - "Cron subscriber_id does not match system_task.subscriber_id".to_string(), + "Cron subscriber_id does not match system_task_cron.subscriber_id".to_string(), )); } @@ -248,14 +247,14 @@ impl Model { } async fn exec_cron(&self, ctx: &dyn AppContextTrait) -> RecorderResult<()> { - if let Some(subscriber_task) = self.subscriber_task.as_ref() { + if let Some(subscriber_task) = self.subscriber_task_cron.as_ref() { let task_service = ctx.task(); let mut new_subscriber_task = subscriber_task.clone(); new_subscriber_task.set_cron_id(Some(self.id)); task_service .add_subscriber_task(new_subscriber_task) .await?; - } else if let Some(system_task) = self.system_task.as_ref() { + } else if let Some(system_task) = self.system_task_cron.as_ref() { let task_service = ctx.task(); let mut new_system_task = system_task.clone(); new_system_task.set_cron_id(Some(self.id)); diff --git a/apps/recorder/src/models/cron/registry.rs b/apps/recorder/src/models/cron/registry.rs deleted file mode 100644 index 8b13789..0000000 --- a/apps/recorder/src/models/cron/registry.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/recorder/src/task/service.rs b/apps/recorder/src/task/service.rs index d22ba64..5896cfc 100644 --- a/apps/recorder/src/task/service.rs +++ b/apps/recorder/src/task/service.rs @@ -302,7 +302,10 @@ mod tests { use tracing::Level; use super::*; - use crate::test_utils::{app::TestingPreset, tracing::try_init_testing_tracing}; + use crate::test_utils::{ + // app::TestingPreset, + tracing::try_init_testing_tracing, + }; #[fixture] fn before_each() { @@ -312,13 +315,6 @@ mod tests { #[rstest] #[tokio::test] async fn test_cron_due_listening(before_each: ()) -> RecorderResult<()> { - let mut preset = TestingPreset::default().await?; - let app_ctx = preset.app_ctx.clone(); - - let db = app_ctx.db(); - - todo!(); - - Ok(()) + todo!() } } diff --git a/apps/webui/src/infra/graphql/gql/graphql.ts b/apps/webui/src/infra/graphql/gql/graphql.ts index 050c1d8..55d9cf7 100644 --- a/apps/webui/src/infra/graphql/gql/graphql.ts +++ b/apps/webui/src/infra/graphql/gql/graphql.ts @@ -21,6 +21,8 @@ export type Scalars = { JsonbFilterInput: { input: any; output: any; } /** type SubscriberTaskType = { "taskType": "sync_one_subscription_feeds_incremental" } & SyncOneSubscriptionFeedsIncrementalTask | { "taskType": "sync_one_subscription_feeds_full" } & SyncOneSubscriptionFeedsFullTask | { "taskType": "sync_one_subscription_sources" } & SyncOneSubscriptionSourcesTask; */ SubscriberTaskType: { input: SubscriberTaskInput; output: SubscriberTaskType; } + /** type SystemTaskType = { "taskType": "optimize_image" } & OptimizeImageTask; */ + SystemTaskType: { input: any; output: any; } }; export type Bangumi = { @@ -354,13 +356,30 @@ export type Cron = { status: CronStatusEnum; subscriber?: Maybe; subscriberId?: Maybe; - subscriberTask?: Maybe; + subscriberTask: SubscriberTasksConnection; + subscriberTaskCron?: Maybe; subscription?: Maybe; subscriptionId?: Maybe; + systemTask: SystemTasksConnection; + systemTaskCron?: Maybe; timeoutMs: Scalars['Int']['output']; updatedAt: Scalars['String']['output']; }; + +export type CronSubscriberTaskArgs = { + filter?: InputMaybe; + orderBy?: InputMaybe; + pagination?: InputMaybe; +}; + + +export type CronSystemTaskArgs = { + filter?: InputMaybe; + orderBy?: InputMaybe; + pagination?: InputMaybe; +}; + export type CronBasic = { __typename?: 'CronBasic'; attempts: Scalars['Int']['output']; @@ -377,8 +396,9 @@ export type CronBasic = { priority: Scalars['Int']['output']; status: CronStatusEnum; subscriberId?: Maybe; - subscriberTask?: Maybe; + subscriberTaskCron?: Maybe; subscriptionId?: Maybe; + systemTaskCron?: Maybe; timeoutMs: Scalars['Int']['output']; updatedAt: Scalars['String']['output']; }; @@ -414,8 +434,9 @@ export type CronFilterInput = { priority?: InputMaybe; status?: InputMaybe; subscriberId?: InputMaybe; - subscriberTask?: InputMaybe; + subscriberTaskCron?: InputMaybe; subscriptionId?: InputMaybe; + systemTaskCron?: InputMaybe; timeoutMs?: InputMaybe; updatedAt?: InputMaybe; }; @@ -424,7 +445,8 @@ export type CronInsertInput = { cronExpr: Scalars['String']['input']; enabled?: InputMaybe; maxAttempts?: InputMaybe; - subscriberTask?: InputMaybe; + subscriberTaskCron?: InputMaybe; + systemTaskCron?: InputMaybe; timeoutMs?: InputMaybe; }; @@ -443,8 +465,9 @@ export type CronOrderInput = { priority?: InputMaybe; status?: InputMaybe; subscriberId?: InputMaybe; - subscriberTask?: InputMaybe; + subscriberTaskCron?: InputMaybe; subscriptionId?: InputMaybe; + systemTaskCron?: InputMaybe; timeoutMs?: InputMaybe; updatedAt?: InputMaybe; }; @@ -1170,6 +1193,9 @@ export type Mutation = { subscriptionsCreateOne: SubscriptionsBasic; subscriptionsDelete: Scalars['Int']['output']; subscriptionsUpdate: Array; + systemTasksCreateOne: SystemTasksBasic; + systemTasksDelete: Scalars['Int']['output']; + systemTasksRetryOne: SystemTasksBasic; }; @@ -1402,6 +1428,21 @@ export type MutationSubscriptionsUpdateArgs = { filter?: InputMaybe; }; + +export type MutationSystemTasksCreateOneArgs = { + data: SystemTasksInsertInput; +}; + + +export type MutationSystemTasksDeleteArgs = { + filter?: InputMaybe; +}; + + +export type MutationSystemTasksRetryOneArgs = { + filter?: InputMaybe; +}; + export type OffsetInput = { limit: Scalars['Int']['input']; offset: Scalars['Int']['input']; @@ -1455,6 +1496,7 @@ export type Query = { subscriptionBangumi: SubscriptionBangumiConnection; subscriptionEpisode: SubscriptionEpisodeConnection; subscriptions: SubscriptionsConnection; + systemTasks: SystemTasksConnection; }; @@ -1546,6 +1588,13 @@ export type QuerySubscriptionsArgs = { pagination?: InputMaybe; }; + +export type QuerySystemTasksArgs = { + filter?: InputMaybe; + orderBy?: InputMaybe; + pagination?: InputMaybe; +}; + export type StringFilterInput = { between?: InputMaybe>; contains?: InputMaybe; @@ -1590,6 +1639,8 @@ export type SubscriberTaskTypeEnum = typeof SubscriberTaskTypeEnum[keyof typeof export type SubscriberTasks = { __typename?: 'SubscriberTasks'; attempts: Scalars['Int']['output']; + cron?: Maybe; + cronId?: Maybe; doneAt?: Maybe; id: Scalars['String']['output']; job: Scalars['SubscriberTaskType']['output']; @@ -1610,6 +1661,7 @@ export type SubscriberTasks = { export type SubscriberTasksBasic = { __typename?: 'SubscriberTasksBasic'; attempts: Scalars['Int']['output']; + cronId?: Maybe; doneAt?: Maybe; id: Scalars['String']['output']; job: Scalars['SubscriberTaskType']['output']; @@ -1642,6 +1694,7 @@ export type SubscriberTasksEdge = { export type SubscriberTasksFilterInput = { and?: InputMaybe>; attempts?: InputMaybe; + cronId?: InputMaybe; doneAt?: InputMaybe; id?: InputMaybe; job?: InputMaybe; @@ -1665,6 +1718,7 @@ export type SubscriberTasksInsertInput = { export type SubscriberTasksOrderInput = { attempts?: InputMaybe; + cronId?: InputMaybe; doneAt?: InputMaybe; id?: InputMaybe; job?: InputMaybe; @@ -1693,6 +1747,7 @@ export type Subscribers = { id: Scalars['Int']['output']; subscriberTask: SubscriberTasksConnection; subscription: SubscriptionsConnection; + systemTask: SystemTasksConnection; updatedAt: Scalars['String']['output']; }; @@ -1745,6 +1800,13 @@ export type SubscribersSubscriptionArgs = { pagination?: InputMaybe; }; + +export type SubscribersSystemTaskArgs = { + filter?: InputMaybe; + orderBy?: InputMaybe; + pagination?: InputMaybe; +}; + export type SubscribersConnection = { __typename?: 'SubscribersConnection'; edges: Array; @@ -2056,6 +2118,114 @@ export type SubscriptionsUpdateInput = { updatedAt?: InputMaybe; }; +export const SystemTaskStatusEnum = { + Done: 'Done', + Failed: 'Failed', + Killed: 'Killed', + Pending: 'Pending', + Running: 'Running', + Scheduled: 'Scheduled' +} as const; + +export type SystemTaskStatusEnum = typeof SystemTaskStatusEnum[keyof typeof SystemTaskStatusEnum]; +export const SystemTaskTypeEnum = { + OptimizeImage: 'optimize_image' +} as const; + +export type SystemTaskTypeEnum = typeof SystemTaskTypeEnum[keyof typeof SystemTaskTypeEnum]; +export type SystemTasks = { + __typename?: 'SystemTasks'; + attempts: Scalars['Int']['output']; + cron?: Maybe; + cronId?: Maybe; + doneAt?: Maybe; + id: Scalars['String']['output']; + job: Scalars['SystemTaskType']['output']; + lastError?: Maybe; + lockAt?: Maybe; + lockBy?: Maybe; + maxAttempts: Scalars['Int']['output']; + priority: Scalars['Int']['output']; + runAt: Scalars['String']['output']; + status: SystemTaskStatusEnum; + subscriber?: Maybe; + subscriberId?: Maybe; + taskType: SystemTaskTypeEnum; +}; + +export type SystemTasksBasic = { + __typename?: 'SystemTasksBasic'; + attempts: Scalars['Int']['output']; + cronId?: Maybe; + doneAt?: Maybe; + id: Scalars['String']['output']; + job: Scalars['SystemTaskType']['output']; + lastError?: Maybe; + lockAt?: Maybe; + lockBy?: Maybe; + maxAttempts: Scalars['Int']['output']; + priority: Scalars['Int']['output']; + runAt: Scalars['String']['output']; + status: SystemTaskStatusEnum; + subscriberId?: Maybe; + taskType: SystemTaskTypeEnum; +}; + +export type SystemTasksConnection = { + __typename?: 'SystemTasksConnection'; + edges: Array; + nodes: Array; + pageInfo: PageInfo; + paginationInfo?: Maybe; +}; + +export type SystemTasksEdge = { + __typename?: 'SystemTasksEdge'; + cursor: Scalars['String']['output']; + node: SystemTasks; +}; + +export type SystemTasksFilterInput = { + and?: InputMaybe>; + attempts?: InputMaybe; + cronId?: InputMaybe; + doneAt?: InputMaybe; + id?: InputMaybe; + job?: InputMaybe; + lastError?: InputMaybe; + lockAt?: InputMaybe; + lockBy?: InputMaybe; + maxAttempts?: InputMaybe; + or?: InputMaybe>; + priority?: InputMaybe; + runAt?: InputMaybe; + status?: InputMaybe; + subscriberId?: InputMaybe; + taskType?: InputMaybe; +}; + +export type SystemTasksInsertInput = { + job: Scalars['SystemTaskType']['input']; + subscriberId?: InputMaybe; +}; + +export type SystemTasksOrderInput = { + attempts?: InputMaybe; + cronId?: InputMaybe; + doneAt?: InputMaybe; + id?: InputMaybe; + job?: InputMaybe; + lastError?: InputMaybe; + lockAt?: InputMaybe; + lockBy?: InputMaybe; + maxAttempts?: InputMaybe; + priority?: InputMaybe; + runAt?: InputMaybe; + status?: InputMaybe; + subscriberId?: InputMaybe; + taskType?: InputMaybe; +}; + export type TextFilterInput = { between?: InputMaybe>; eq?: InputMaybe; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 75b7f10..69d6496 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -351,10 +351,10 @@ importers: devDependencies: '@vitejs/plugin-react': specifier: ^4.5.2 - version: 4.5.2(vite@5.4.11(@types/node@24.0.10)(lightningcss@1.30.1)(sass@1.77.4)(terser@5.41.0)) + version: 4.5.2(vite@5.4.11(@types/node@24.0.10)(lightningcss@1.30.1)(sass@1.77.4)(terser@5.43.1)) vitest: specifier: ^3.2.3 - version: 3.2.3(@types/node@24.0.10)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))(lightningcss@1.30.1)(sass@1.77.4)(terser@5.41.0) + version: 3.2.3(@types/node@24.0.10)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))(lightningcss@1.30.1)(sass@1.77.4)(terser@5.43.1) packages: @@ -6189,11 +6189,6 @@ packages: uglify-js: optional: true - terser@5.41.0: - resolution: {integrity: sha512-H406eLPXpZbAX14+B8psIuvIr8+3c+2hkuYzpMkoE0ij+NdsVATbA78vb8neA/eqrj7rywa2pIkdmWRsXW6wmw==} - engines: {node: '>=10'} - hasBin: true - terser@5.43.1: resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} engines: {node: '>=10'} @@ -9841,7 +9836,7 @@ snapshots: dependencies: '@types/node': 24.0.10 - '@vitejs/plugin-react@4.5.2(vite@5.4.11(@types/node@24.0.10)(lightningcss@1.30.1)(sass@1.77.4)(terser@5.41.0))': + '@vitejs/plugin-react@4.5.2(vite@5.4.11(@types/node@24.0.10)(lightningcss@1.30.1)(sass@1.77.4)(terser@5.43.1))': dependencies: '@babel/core': 7.27.4 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.4) @@ -9849,7 +9844,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.11 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 5.4.11(@types/node@24.0.10)(lightningcss@1.30.1)(sass@1.77.4)(terser@5.41.0) + vite: 5.4.11(@types/node@24.0.10)(lightningcss@1.30.1)(sass@1.77.4)(terser@5.43.1) transitivePeerDependencies: - supports-color @@ -9861,13 +9856,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.3(vite@5.4.11(@types/node@24.0.10)(lightningcss@1.30.1)(sass@1.77.4)(terser@5.41.0))': + '@vitest/mocker@3.2.3(vite@5.4.11(@types/node@24.0.10)(lightningcss@1.30.1)(sass@1.77.4)(terser@5.43.1))': dependencies: '@vitest/spy': 3.2.3 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.11(@types/node@24.0.10)(lightningcss@1.30.1)(sass@1.77.4)(terser@5.41.0) + vite: 5.4.11(@types/node@24.0.10)(lightningcss@1.30.1)(sass@1.77.4)(terser@5.43.1) '@vitest/pretty-format@3.2.3': dependencies: @@ -13182,14 +13177,6 @@ snapshots: webpack: 5.97.1 optional: true - terser@5.41.0: - dependencies: - '@jridgewell/source-map': 0.3.10 - acorn: 8.15.0 - commander: 2.20.3 - source-map-support: 0.5.21 - optional: true - terser@5.43.1: dependencies: '@jridgewell/source-map': 0.3.10 @@ -13466,13 +13453,13 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite-node@3.2.3(@types/node@24.0.10)(lightningcss@1.30.1)(sass@1.77.4)(terser@5.41.0): + vite-node@3.2.3(@types/node@24.0.10)(lightningcss@1.30.1)(sass@1.77.4)(terser@5.43.1): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 5.4.11(@types/node@24.0.10)(lightningcss@1.30.1)(sass@1.77.4)(terser@5.41.0) + vite: 5.4.11(@types/node@24.0.10)(lightningcss@1.30.1)(sass@1.77.4)(terser@5.43.1) transitivePeerDependencies: - '@types/node' - less @@ -13484,18 +13471,6 @@ snapshots: - supports-color - terser - vite@5.4.11(@types/node@24.0.10)(lightningcss@1.30.1)(sass@1.77.4)(terser@5.41.0): - dependencies: - esbuild: 0.21.5 - postcss: 8.5.5 - rollup: 4.29.1 - optionalDependencies: - '@types/node': 24.0.10 - fsevents: 2.3.3 - lightningcss: 1.30.1 - sass: 1.77.4 - terser: 5.41.0 - vite@5.4.11(@types/node@24.0.10)(lightningcss@1.30.1)(sass@1.77.4)(terser@5.43.1): dependencies: esbuild: 0.21.5 @@ -13507,13 +13482,12 @@ snapshots: lightningcss: 1.30.1 sass: 1.77.4 terser: 5.43.1 - optional: true - vitest@3.2.3(@types/node@24.0.10)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))(lightningcss@1.30.1)(sass@1.77.4)(terser@5.41.0): + vitest@3.2.3(@types/node@24.0.10)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))(lightningcss@1.30.1)(sass@1.77.4)(terser@5.43.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.3 - '@vitest/mocker': 3.2.3(vite@5.4.11(@types/node@24.0.10)(lightningcss@1.30.1)(sass@1.77.4)(terser@5.41.0)) + '@vitest/mocker': 3.2.3(vite@5.4.11(@types/node@24.0.10)(lightningcss@1.30.1)(sass@1.77.4)(terser@5.43.1)) '@vitest/pretty-format': 3.2.3 '@vitest/runner': 3.2.3 '@vitest/snapshot': 3.2.3 @@ -13531,8 +13505,8 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.0 tinyrainbow: 2.0.0 - vite: 5.4.11(@types/node@24.0.10)(lightningcss@1.30.1)(sass@1.77.4)(terser@5.41.0) - vite-node: 3.2.3(@types/node@24.0.10)(lightningcss@1.30.1)(sass@1.77.4)(terser@5.41.0) + vite: 5.4.11(@types/node@24.0.10)(lightningcss@1.30.1)(sass@1.77.4)(terser@5.43.1) + vite-node: 3.2.3(@types/node@24.0.10)(lightningcss@1.30.1)(sass@1.77.4)(terser@5.43.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.0.10