fix: temp save
This commit is contained in:
parent
bacfe99ef2
commit
d06acde882
12
.vscode/settings.json
vendored
12
.vscode/settings.json
vendored
@ -40,13 +40,9 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"rust-analyzer.cargo.features": "all",
|
"rust-analyzer.cargo.features": "all",
|
||||||
"rust-analyzer.testExplorer": true
|
"rust-analyzer.testExplorer": true,
|
||||||
// https://github.com/rust-lang/rust/issues/141540
|
// https://github.com/rust-lang/rust/issues/141540
|
||||||
// "rust-analyzer.cargo.targetDir": "target/rust-analyzer",
|
"rust-analyzer.runnables.extraEnv": {
|
||||||
// "rust-analyzer.check.extraEnv": {
|
"CARGO_INCREMENTAL": "0",
|
||||||
// "CARGO_TARGET_DIR": "target/rust-analyzer"
|
}
|
||||||
// },
|
|
||||||
// "rust-analyzer.cargo.extraEnv": {
|
|
||||||
// "CARGO_TARGET_DIR": "target/analyzer"
|
|
||||||
// }
|
|
||||||
}
|
}
|
7
Cargo.lock
generated
7
Cargo.lock
generated
@ -7791,16 +7791,15 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b"
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "seaography"
|
name = "seaography"
|
||||||
version = "1.1.4"
|
version = "1.1.4"
|
||||||
source = "git+https://github.com/dumtruck/seaography.git?rev=a787c3a#a787c3ab83cf1f8275894e1bc1ca3c766b54674b"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-graphql",
|
"async-graphql",
|
||||||
"fnv",
|
"fnv",
|
||||||
"heck 0.4.1",
|
"heck 0.5.0",
|
||||||
"itertools 0.12.1",
|
"itertools 0.14.0",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"sea-orm",
|
"sea-orm",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"thiserror 1.0.69",
|
"thiserror 2.0.12",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -15,7 +15,7 @@ resolver = "2"
|
|||||||
[profile.dev]
|
[profile.dev]
|
||||||
debug = 0
|
debug = 0
|
||||||
# https://github.com/rust-lang/rust/issues/141540
|
# https://github.com/rust-lang/rust/issues/141540
|
||||||
incremental = false
|
incremental = true # Then only change rust-analyzer incremental
|
||||||
# [simd not supported by cranelift](https://github.com/rust-lang/rustc_codegen_cranelift/issues/171)
|
# [simd not supported by cranelift](https://github.com/rust-lang/rustc_codegen_cranelift/issues/171)
|
||||||
# codegen-backend = "cranelift"
|
# codegen-backend = "cranelift"
|
||||||
|
|
||||||
@ -87,4 +87,6 @@ nanoid = "0.4.0"
|
|||||||
webp = "0.3.0"
|
webp = "0.3.0"
|
||||||
|
|
||||||
[patch.crates-io]
|
[patch.crates-io]
|
||||||
seaography = { git = "https://github.com/dumtruck/seaography.git", rev = "a787c3a" }
|
# seaography = { git = "https://github.com/dumtruck/seaography.git", rev = "395d50f" }
|
||||||
|
|
||||||
|
seaography = { path = "../seaography" }
|
||||||
|
6
apps/recorder/bindings/SubscriberTask.ts
Normal file
6
apps/recorder/bindings/SubscriberTask.ts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
|
||||||
|
import type { SyncOneSubscriptionFeedsFullTask } from "./SyncOneSubscriptionFeedsFullTask";
|
||||||
|
import type { SyncOneSubscriptionFeedsIncrementalTask } from "./SyncOneSubscriptionFeedsIncrementalTask";
|
||||||
|
import type { SyncOneSubscriptionSourcesTask } from "./SyncOneSubscriptionSourcesTask";
|
||||||
|
|
||||||
|
export type SubscriberTask = { "taskType": "sync_one_subscription_feeds_incremental" } & SyncOneSubscriptionFeedsIncrementalTask | { "taskType": "sync_one_subscription_feeds_full" } & SyncOneSubscriptionFeedsFullTask | { "taskType": "sync_one_subscription_sources" } & SyncOneSubscriptionSourcesTask;
|
@ -0,0 +1,3 @@
|
|||||||
|
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
|
||||||
|
|
||||||
|
export type SyncOneSubscriptionFeedsFullTask = { subscriptionId: number, subscriberId: number, cronId: number | null, };
|
@ -0,0 +1,3 @@
|
|||||||
|
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
|
||||||
|
|
||||||
|
export type SyncOneSubscriptionFeedsIncrementalTask = { subscriptionId: number, subscriberId: number, cronId: number | null, };
|
3
apps/recorder/bindings/SyncOneSubscriptionSourcesTask.ts
Normal file
3
apps/recorder/bindings/SyncOneSubscriptionSourcesTask.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
|
||||||
|
|
||||||
|
export type SyncOneSubscriptionSourcesTask = { subscriptionId: number, subscriberId: number, cronId: number | null, };
|
6
apps/recorder/package.json
Normal file
6
apps/recorder/package.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"name": "recorder",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"private": true,
|
||||||
|
"type": "module"
|
||||||
|
}
|
@ -101,14 +101,14 @@ pub fn register_credential3rd_to_schema_builder(
|
|||||||
.schema
|
.schema
|
||||||
.register(Credential3rdCheckAvailableInfo::generate_output_object());
|
.register(Credential3rdCheckAvailableInfo::generate_output_object());
|
||||||
|
|
||||||
let builder_context = builder.context;
|
let builder_context = &builder.context;
|
||||||
{
|
{
|
||||||
let check_available_mutation_name = get_entity_custom_mutation_field_name::<
|
let check_available_mutation_name = get_entity_custom_mutation_field_name::<
|
||||||
credential_3rd::Entity,
|
credential_3rd::Entity,
|
||||||
>(builder_context, "CheckAvailable");
|
>(&builder_context, "CheckAvailable");
|
||||||
let check_available_mutation =
|
let check_available_mutation =
|
||||||
generate_entity_filtered_mutation_field::<credential_3rd::Entity, _, _>(
|
generate_entity_filtered_mutation_field::<credential_3rd::Entity, _, _>(
|
||||||
builder_context,
|
builder_context.clone(),
|
||||||
check_available_mutation_name,
|
check_available_mutation_name,
|
||||||
TypeRef::named_nn(Credential3rdCheckAvailableInfo::object_type_name()),
|
TypeRef::named_nn(Credential3rdCheckAvailableInfo::object_type_name()),
|
||||||
Arc::new(|_resolver_ctx, app_ctx, filters| {
|
Arc::new(|_resolver_ctx, app_ctx, filters| {
|
||||||
|
@ -4,17 +4,13 @@ use seaography::{Builder as SeaographyBuilder, BuilderContext};
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
graphql::{
|
graphql::{
|
||||||
domains::subscribers::restrict_subscriber_for_entity,
|
domains::{
|
||||||
infra::{
|
subscriber_tasks::restrict_subscriber_tasks_for_entity,
|
||||||
custom::register_entity_default_writable,
|
subscribers::restrict_subscriber_for_entity,
|
||||||
json::{
|
|
||||||
convert_jsonb_output_for_entity, restrict_jsonb_filter_input_for_entity,
|
|
||||||
try_convert_jsonb_input_for_entity,
|
|
||||||
},
|
},
|
||||||
name::get_entity_and_column_name,
|
infra::{custom::register_entity_default_writable, name::get_entity_and_column_name},
|
||||||
},
|
},
|
||||||
},
|
models::cron,
|
||||||
models::{cron, subscriber_tasks},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
fn skip_columns_for_entity_input(context: &mut BuilderContext) {
|
fn skip_columns_for_entity_input(context: &mut BuilderContext) {
|
||||||
@ -22,7 +18,6 @@ fn skip_columns_for_entity_input(context: &mut BuilderContext) {
|
|||||||
if matches!(
|
if matches!(
|
||||||
column,
|
column,
|
||||||
cron::Column::SubscriberTask
|
cron::Column::SubscriberTask
|
||||||
| cron::Column::Id
|
|
||||||
| cron::Column::CronExpr
|
| cron::Column::CronExpr
|
||||||
| cron::Column::Enabled
|
| cron::Column::Enabled
|
||||||
| cron::Column::TimeoutMs
|
| cron::Column::TimeoutMs
|
||||||
@ -49,16 +44,9 @@ fn skip_columns_for_entity_input(context: &mut BuilderContext) {
|
|||||||
pub fn register_cron_to_schema_context(context: &mut BuilderContext) {
|
pub fn register_cron_to_schema_context(context: &mut BuilderContext) {
|
||||||
restrict_subscriber_for_entity::<cron::Entity>(context, &cron::Column::SubscriberId);
|
restrict_subscriber_for_entity::<cron::Entity>(context, &cron::Column::SubscriberId);
|
||||||
|
|
||||||
restrict_jsonb_filter_input_for_entity::<cron::Entity>(context, &cron::Column::SubscriberTask);
|
restrict_subscriber_tasks_for_entity::<cron::Entity>(
|
||||||
convert_jsonb_output_for_entity::<cron::Entity>(
|
|
||||||
context,
|
context,
|
||||||
&cron::Column::SubscriberTask,
|
&cron::Column::SubscriberTask,
|
||||||
Some(Case::Camel),
|
|
||||||
);
|
|
||||||
try_convert_jsonb_input_for_entity::<cron::Entity, Option<subscriber_tasks::SubscriberTask>>(
|
|
||||||
context,
|
|
||||||
&cron::Column::SubscriberTask,
|
|
||||||
subscriber_tasks::subscriber_task_schema(),
|
|
||||||
Some(Case::Snake),
|
Some(Case::Snake),
|
||||||
);
|
);
|
||||||
skip_columns_for_entity_input(context);
|
skip_columns_for_entity_input(context);
|
||||||
|
@ -29,7 +29,7 @@ pub fn register_feeds_to_schema_context(context: &mut BuilderContext) {
|
|||||||
|
|
||||||
context.types.input_none_conversions.insert(
|
context.types.input_none_conversions.insert(
|
||||||
get_entity_and_column_name::<feeds::Entity>(context, &feeds::Column::Token),
|
get_entity_and_column_name::<feeds::Entity>(context, &feeds::Column::Token),
|
||||||
Box::new(
|
Arc::new(
|
||||||
move |context: &ResolverContext| -> SeaResult<Option<SeaValue>> {
|
move |context: &ResolverContext| -> SeaResult<Option<SeaValue>> {
|
||||||
let field_name = context.field().name();
|
let field_name = context.field().name();
|
||||||
if field_name == entity_create_one_mutation_field_name.as_str()
|
if field_name == entity_create_one_mutation_field_name.as_str()
|
||||||
|
@ -3,15 +3,15 @@ use std::{ops::Deref, sync::Arc};
|
|||||||
use async_graphql::dynamic::{FieldValue, TypeRef};
|
use async_graphql::dynamic::{FieldValue, TypeRef};
|
||||||
use convert_case::Case;
|
use convert_case::Case;
|
||||||
use sea_orm::{
|
use sea_orm::{
|
||||||
ColumnTrait, ConnectionTrait, EntityTrait, Iterable, QueryFilter, QuerySelect, QueryTrait,
|
ActiveModelBehavior, ColumnTrait, ConnectionTrait, EntityTrait, Iterable, QueryFilter,
|
||||||
prelude::Expr, sea_query::Query,
|
QuerySelect, QueryTrait, prelude::Expr, sea_query::Query,
|
||||||
};
|
};
|
||||||
use seaography::{
|
use seaography::{
|
||||||
Builder as SeaographyBuilder, BuilderContext, EntityInputBuilder, EntityObjectBuilder,
|
Builder as SeaographyBuilder, BuilderContext, SeaographyError, prepare_active_model,
|
||||||
SeaographyError, prepare_active_model,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
app::AppContextTrait,
|
||||||
auth::AuthUserInfo,
|
auth::AuthUserInfo,
|
||||||
errors::RecorderError,
|
errors::RecorderError,
|
||||||
graphql::{
|
graphql::{
|
||||||
@ -64,8 +64,12 @@ pub fn restrict_subscriber_tasks_for_entity<T>(
|
|||||||
let entity_column_name = get_entity_and_column_name::<T>(context, column);
|
let entity_column_name = get_entity_and_column_name::<T>(context, column);
|
||||||
context.types.input_conversions.insert(
|
context.types.input_conversions.insert(
|
||||||
entity_column_name.clone(),
|
entity_column_name.clone(),
|
||||||
Box::new(move |resolve_context, accessor| {
|
Arc::new(move |resolve_context, value_accessor| {
|
||||||
let mut json_value = accessor.as_value().clone().into_json().map_err(|err| {
|
let mut json_value = value_accessor
|
||||||
|
.as_value()
|
||||||
|
.clone()
|
||||||
|
.into_json()
|
||||||
|
.map_err(|err| {
|
||||||
SeaographyError::TypeConversionError(
|
SeaographyError::TypeConversionError(
|
||||||
err.to_string(),
|
err.to_string(),
|
||||||
format!("Json - {entity_column_name}"),
|
format!("Json - {entity_column_name}"),
|
||||||
@ -107,6 +111,11 @@ pub fn register_subscriber_tasks_to_schema_context(context: &mut BuilderContext)
|
|||||||
context,
|
context,
|
||||||
&subscriber_tasks::Column::SubscriberId,
|
&subscriber_tasks::Column::SubscriberId,
|
||||||
);
|
);
|
||||||
|
restrict_subscriber_tasks_for_entity::<subscriber_tasks::Entity>(
|
||||||
|
context,
|
||||||
|
&subscriber_tasks::Column::Job,
|
||||||
|
Some(Case::Snake),
|
||||||
|
);
|
||||||
|
|
||||||
skip_columns_for_entity_input(context);
|
skip_columns_for_entity_input(context);
|
||||||
}
|
}
|
||||||
@ -118,18 +127,18 @@ pub fn register_subscriber_tasks_to_schema_builder(
|
|||||||
builder.register_enumeration::<subscriber_tasks::SubscriberTaskStatus>();
|
builder.register_enumeration::<subscriber_tasks::SubscriberTaskStatus>();
|
||||||
|
|
||||||
builder = register_entity_default_readonly!(builder, subscriber_tasks);
|
builder = register_entity_default_readonly!(builder, subscriber_tasks);
|
||||||
|
let builder_context = builder.context.clone();
|
||||||
|
|
||||||
let builder_context = builder.context;
|
|
||||||
{
|
{
|
||||||
builder
|
builder
|
||||||
.outputs
|
.outputs
|
||||||
.push(generate_entity_default_basic_entity_object::<
|
.push(generate_entity_default_basic_entity_object::<
|
||||||
subscriber_tasks::Entity,
|
subscriber_tasks::Entity,
|
||||||
>(builder_context));
|
>(builder_context.clone()));
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
let delete_mutation = generate_entity_delete_mutation_field::<subscriber_tasks::Entity>(
|
let delete_mutation = generate_entity_delete_mutation_field::<subscriber_tasks::Entity>(
|
||||||
builder_context,
|
builder_context.clone(),
|
||||||
Arc::new(|_resolver_ctx, app_ctx, filters| {
|
Arc::new(|_resolver_ctx, app_ctx, filters| {
|
||||||
Box::pin(async move {
|
Box::pin(async move {
|
||||||
let db = app_ctx.db();
|
let db = app_ctx.db();
|
||||||
@ -160,13 +169,13 @@ pub fn register_subscriber_tasks_to_schema_builder(
|
|||||||
{
|
{
|
||||||
let entity_retry_one_mutation_name = get_entity_custom_mutation_field_name::<
|
let entity_retry_one_mutation_name = get_entity_custom_mutation_field_name::<
|
||||||
subscriber_tasks::Entity,
|
subscriber_tasks::Entity,
|
||||||
>(builder_context, "RetryOne");
|
>(&builder_context, "RetryOne");
|
||||||
let retry_one_mutation =
|
let retry_one_mutation =
|
||||||
generate_entity_filtered_mutation_field::<subscriber_tasks::Entity, _, _>(
|
generate_entity_filtered_mutation_field::<subscriber_tasks::Entity, _, _>(
|
||||||
builder_context,
|
builder_context.clone(),
|
||||||
entity_retry_one_mutation_name,
|
entity_retry_one_mutation_name,
|
||||||
TypeRef::named_nn(get_entity_basic_type_name::<subscriber_tasks::Entity>(
|
TypeRef::named_nn(get_entity_basic_type_name::<subscriber_tasks::Entity>(
|
||||||
builder_context,
|
&builder_context,
|
||||||
)),
|
)),
|
||||||
Arc::new(|_resolver_ctx, app_ctx, filters| {
|
Arc::new(|_resolver_ctx, app_ctx, filters| {
|
||||||
Box::pin(async move {
|
Box::pin(async move {
|
||||||
@ -205,32 +214,23 @@ pub fn register_subscriber_tasks_to_schema_builder(
|
|||||||
.inputs
|
.inputs
|
||||||
.push(generate_entity_default_insert_input_object::<
|
.push(generate_entity_default_insert_input_object::<
|
||||||
subscriber_tasks::Entity,
|
subscriber_tasks::Entity,
|
||||||
>(builder_context));
|
>(&builder.context));
|
||||||
let create_one_mutation =
|
let create_one_mutation =
|
||||||
generate_entity_create_one_mutation_field::<subscriber_tasks::Entity, TypeRef>(
|
generate_entity_create_one_mutation_field::<subscriber_tasks::Entity>(
|
||||||
builder_context,
|
builder.context.clone(),
|
||||||
None,
|
Arc::new(move |resolver_ctx, app_ctx, input_object| {
|
||||||
Arc::new(|_resolver_ctx, app_ctx, input_object| {
|
|
||||||
let entity_input_builder = EntityInputBuilder {
|
|
||||||
context: builder_context,
|
|
||||||
};
|
|
||||||
let entity_object_builder = EntityObjectBuilder {
|
|
||||||
context: builder_context,
|
|
||||||
};
|
|
||||||
|
|
||||||
let active_model: Result<subscriber_tasks::ActiveModel, _> =
|
let active_model: Result<subscriber_tasks::ActiveModel, _> =
|
||||||
prepare_active_model(
|
prepare_active_model(&builder_context.clone(), &input_object, resolver_ctx);
|
||||||
&entity_input_builder,
|
|
||||||
&entity_object_builder,
|
|
||||||
&input_object,
|
|
||||||
_resolver_ctx,
|
|
||||||
);
|
|
||||||
|
|
||||||
Box::pin(async move {
|
Box::pin(async move {
|
||||||
let task_service = app_ctx.task();
|
let task_service = app_ctx.task();
|
||||||
|
|
||||||
let active_model = active_model?;
|
let active_model = active_model?;
|
||||||
|
|
||||||
|
let db = app_ctx.db();
|
||||||
|
|
||||||
|
let active_model = active_model.before_save(db, true).await?;
|
||||||
|
|
||||||
let task = active_model.job.unwrap();
|
let task = active_model.job.unwrap();
|
||||||
let subscriber_id = active_model.subscriber_id.unwrap();
|
let subscriber_id = active_model.subscriber_id.unwrap();
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ where
|
|||||||
T: EntityTrait,
|
T: EntityTrait,
|
||||||
<T as EntityTrait>::Model: Sync,
|
<T as EntityTrait>::Model: Sync,
|
||||||
{
|
{
|
||||||
Box::new(move |context: &ResolverContext| -> GuardAction {
|
Arc::new(move |context: &ResolverContext| -> GuardAction {
|
||||||
match context.ctx.data::<AuthUserInfo>() {
|
match context.ctx.data::<AuthUserInfo>() {
|
||||||
Ok(_) => GuardAction::Allow,
|
Ok(_) => GuardAction::Allow,
|
||||||
Err(err) => GuardAction::Block(Some(err.message)),
|
Err(err) => GuardAction::Block(Some(err.message)),
|
||||||
@ -106,7 +106,7 @@ where
|
|||||||
let entity_update_mutation_data_field_name =
|
let entity_update_mutation_data_field_name =
|
||||||
Arc::new(get_entity_update_mutation_data_field_name(context).to_string());
|
Arc::new(get_entity_update_mutation_data_field_name(context).to_string());
|
||||||
|
|
||||||
Box::new(move |context: &ResolverContext| -> GuardAction {
|
Arc::new(move |context: &ResolverContext| -> GuardAction {
|
||||||
match context.ctx.data::<AuthUserInfo>() {
|
match context.ctx.data::<AuthUserInfo>() {
|
||||||
Ok(user_info) => {
|
Ok(user_info) => {
|
||||||
let subscriber_id = user_info.subscriber_auth.subscriber_id;
|
let subscriber_id = user_info.subscriber_auth.subscriber_id;
|
||||||
@ -253,7 +253,7 @@ where
|
|||||||
Arc::new(get_entity_create_one_mutation_field_name::<T>(context));
|
Arc::new(get_entity_create_one_mutation_field_name::<T>(context));
|
||||||
let entity_create_batch_mutation_field_name =
|
let entity_create_batch_mutation_field_name =
|
||||||
Arc::new(get_entity_create_batch_mutation_field_name::<T>(context));
|
Arc::new(get_entity_create_batch_mutation_field_name::<T>(context));
|
||||||
Box::new(
|
Arc::new(
|
||||||
move |context: &ResolverContext| -> SeaResult<Option<SeaValue>> {
|
move |context: &ResolverContext| -> SeaResult<Option<SeaValue>> {
|
||||||
let field_name = context.field().name();
|
let field_name = context.field().name();
|
||||||
if field_name == entity_create_one_mutation_field_name.as_str()
|
if field_name == entity_create_one_mutation_field_name.as_str()
|
||||||
@ -318,13 +318,11 @@ pub fn register_subscribers_to_schema_context(context: &mut BuilderContext) {
|
|||||||
|
|
||||||
pub fn register_subscribers_to_schema_builder(mut builder: SeaographyBuilder) -> SeaographyBuilder {
|
pub fn register_subscribers_to_schema_builder(mut builder: SeaographyBuilder) -> SeaographyBuilder {
|
||||||
{
|
{
|
||||||
let filter_types_map_helper = FilterTypesMapHelper {
|
|
||||||
context: builder.context,
|
|
||||||
};
|
|
||||||
|
|
||||||
builder.schema = builder
|
builder.schema = builder
|
||||||
.schema
|
.schema
|
||||||
.register(filter_types_map_helper.generate_filter_input(&SUBSCRIBER_ID_FILTER_INFO));
|
.register(FilterTypesMapHelper::generate_filter_input(
|
||||||
|
&SUBSCRIBER_ID_FILTER_INFO,
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
builder = register_entity_default_readonly!(builder, subscribers);
|
builder = register_entity_default_readonly!(builder, subscribers);
|
||||||
|
@ -1,23 +1,11 @@
|
|||||||
use std::sync::Arc;
|
|
||||||
|
|
||||||
use async_graphql::dynamic::{FieldValue, TypeRef};
|
|
||||||
use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
|
|
||||||
use seaography::{Builder as SeaographyBuilder, BuilderContext};
|
use seaography::{Builder as SeaographyBuilder, BuilderContext};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
errors::RecorderError,
|
|
||||||
graphql::{
|
graphql::{
|
||||||
domains::subscribers::restrict_subscriber_for_entity,
|
domains::subscribers::restrict_subscriber_for_entity, infra,
|
||||||
infra::{
|
infra::custom::register_entity_default_writable,
|
||||||
custom::{generate_entity_filtered_mutation_field, register_entity_default_writable},
|
|
||||||
name::{get_entity_basic_type_name, get_entity_custom_mutation_field_name},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
models::{subscriber_tasks, subscriptions},
|
|
||||||
task::{
|
|
||||||
SyncOneSubscriptionFeedsFullTask, SyncOneSubscriptionFeedsIncrementalTask,
|
|
||||||
SyncOneSubscriptionSourcesTask,
|
|
||||||
},
|
},
|
||||||
|
models::subscriptions,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn register_subscriptions_to_schema_context(context: &mut BuilderContext) {
|
pub fn register_subscriptions_to_schema_context(context: &mut BuilderContext) {
|
||||||
@ -32,162 +20,5 @@ pub fn register_subscriptions_to_schema_builder(
|
|||||||
) -> SeaographyBuilder {
|
) -> SeaographyBuilder {
|
||||||
builder.register_enumeration::<subscriptions::SubscriptionCategory>();
|
builder.register_enumeration::<subscriptions::SubscriptionCategory>();
|
||||||
builder = register_entity_default_writable!(builder, subscriptions, false);
|
builder = register_entity_default_writable!(builder, subscriptions, false);
|
||||||
|
|
||||||
let context = builder.context;
|
|
||||||
|
|
||||||
{
|
|
||||||
let sync_one_feeds_incremental_mutation_name = get_entity_custom_mutation_field_name::<
|
|
||||||
subscriptions::Entity,
|
|
||||||
>(context, "SyncOneFeedsIncremental");
|
|
||||||
|
|
||||||
let sync_one_feeds_incremental_mutation =
|
|
||||||
generate_entity_filtered_mutation_field::<subscriptions::Entity, _, _>(
|
|
||||||
builder.context,
|
|
||||||
sync_one_feeds_incremental_mutation_name,
|
|
||||||
TypeRef::named_nn(get_entity_basic_type_name::<subscriber_tasks::Entity>(
|
|
||||||
context,
|
|
||||||
)),
|
|
||||||
Arc::new(|_resolver_ctx, app_ctx, filters| {
|
|
||||||
Box::pin(async move {
|
|
||||||
let db = app_ctx.db();
|
|
||||||
|
|
||||||
let subscription_model = subscriptions::Entity::find()
|
|
||||||
.filter(filters)
|
|
||||||
.one(db)
|
|
||||||
.await?
|
|
||||||
.ok_or_else(|| {
|
|
||||||
RecorderError::from_entity_not_found::<subscriptions::Entity>()
|
|
||||||
})?;
|
|
||||||
|
|
||||||
let task_service = app_ctx.task();
|
|
||||||
|
|
||||||
let task_id = task_service
|
|
||||||
.add_subscriber_task(
|
|
||||||
SyncOneSubscriptionFeedsIncrementalTask::builder()
|
|
||||||
.subscriber_id(subscription_model.subscriber_id)
|
|
||||||
.subscription_id(subscription_model.id)
|
|
||||||
.build()
|
|
||||||
.into(),
|
|
||||||
)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
let task_model = subscriber_tasks::Entity::find()
|
|
||||||
.filter(subscriber_tasks::Column::Id.eq(task_id.to_string()))
|
|
||||||
.one(db)
|
|
||||||
.await?
|
|
||||||
.ok_or_else(|| {
|
|
||||||
RecorderError::from_entity_not_found::<subscriber_tasks::Entity>()
|
|
||||||
})?;
|
|
||||||
|
|
||||||
Ok(Some(FieldValue::owned_any(task_model)))
|
|
||||||
})
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
builder.mutations.push(sync_one_feeds_incremental_mutation);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
let sync_one_feeds_full_mutation_name = get_entity_custom_mutation_field_name::<
|
|
||||||
subscriptions::Entity,
|
|
||||||
>(builder.context, "SyncOneFeedsFull");
|
|
||||||
let sync_one_feeds_full_mutation =
|
|
||||||
generate_entity_filtered_mutation_field::<subscriptions::Entity, _, _>(
|
|
||||||
builder.context,
|
|
||||||
sync_one_feeds_full_mutation_name,
|
|
||||||
TypeRef::named_nn(get_entity_basic_type_name::<subscriber_tasks::Entity>(
|
|
||||||
context,
|
|
||||||
)),
|
|
||||||
Arc::new(|_resolver_ctx, app_ctx, filters| {
|
|
||||||
Box::pin(async move {
|
|
||||||
let db = app_ctx.db();
|
|
||||||
|
|
||||||
let subscription_model = subscriptions::Entity::find()
|
|
||||||
.filter(filters)
|
|
||||||
.one(db)
|
|
||||||
.await?
|
|
||||||
.ok_or_else(|| {
|
|
||||||
RecorderError::from_entity_not_found::<subscriptions::Entity>()
|
|
||||||
})?;
|
|
||||||
|
|
||||||
let task_service = app_ctx.task();
|
|
||||||
|
|
||||||
let task_id = task_service
|
|
||||||
.add_subscriber_task(
|
|
||||||
SyncOneSubscriptionFeedsFullTask::builder()
|
|
||||||
.subscriber_id(subscription_model.subscriber_id)
|
|
||||||
.subscription_id(subscription_model.id)
|
|
||||||
.build()
|
|
||||||
.into(),
|
|
||||||
)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
let task_model = subscriber_tasks::Entity::find()
|
|
||||||
.filter(subscriber_tasks::Column::Id.eq(task_id.to_string()))
|
|
||||||
.one(db)
|
|
||||||
.await?
|
|
||||||
.ok_or_else(|| {
|
|
||||||
RecorderError::from_entity_not_found::<subscriber_tasks::Entity>()
|
|
||||||
})?;
|
|
||||||
|
|
||||||
Ok(Some(FieldValue::owned_any(task_model)))
|
|
||||||
})
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
builder.mutations.push(sync_one_feeds_full_mutation);
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
let sync_one_sources_mutation_name = get_entity_custom_mutation_field_name::<
|
|
||||||
subscriptions::Entity,
|
|
||||||
>(context, "SyncOneSources");
|
|
||||||
|
|
||||||
let sync_one_sources_mutation =
|
|
||||||
generate_entity_filtered_mutation_field::<subscriptions::Entity, _, _>(
|
|
||||||
builder.context,
|
|
||||||
sync_one_sources_mutation_name,
|
|
||||||
TypeRef::named_nn(get_entity_basic_type_name::<subscriber_tasks::Entity>(
|
|
||||||
context,
|
|
||||||
)),
|
|
||||||
Arc::new(|_resolver_ctx, app_ctx, filters| {
|
|
||||||
Box::pin(async move {
|
|
||||||
let db = app_ctx.db();
|
|
||||||
|
|
||||||
let subscription_model = subscriptions::Entity::find()
|
|
||||||
.filter(filters)
|
|
||||||
.one(db)
|
|
||||||
.await?
|
|
||||||
.ok_or_else(|| {
|
|
||||||
RecorderError::from_entity_not_found::<subscriptions::Entity>()
|
|
||||||
})?;
|
|
||||||
|
|
||||||
let task_service = app_ctx.task();
|
|
||||||
|
|
||||||
let task_id = task_service
|
|
||||||
.add_subscriber_task(
|
|
||||||
SyncOneSubscriptionSourcesTask::builder()
|
|
||||||
.subscriber_id(subscription_model.subscriber_id)
|
|
||||||
.subscription_id(subscription_model.id)
|
|
||||||
.build()
|
|
||||||
.into(),
|
|
||||||
)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
let task_model = subscriber_tasks::Entity::find()
|
|
||||||
.filter(subscriber_tasks::Column::Id.eq(task_id.to_string()))
|
|
||||||
.one(db)
|
|
||||||
.await?
|
|
||||||
.ok_or_else(|| {
|
|
||||||
RecorderError::from_entity_not_found::<subscriber_tasks::Entity>()
|
|
||||||
})?;
|
|
||||||
|
|
||||||
Ok(Some(FieldValue::owned_any(task_model)))
|
|
||||||
})
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
builder.mutations.push(sync_one_sources_mutation);
|
|
||||||
}
|
|
||||||
|
|
||||||
builder
|
builder
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@ pub fn register_crypto_column_input_conversion_to_schema_context<T>(
|
|||||||
{
|
{
|
||||||
context.types.input_conversions.insert(
|
context.types.input_conversions.insert(
|
||||||
get_entity_and_column_name::<T>(context, column),
|
get_entity_and_column_name::<T>(context, column),
|
||||||
Box::new(
|
Arc::new(
|
||||||
move |_resolve_context: &ResolverContext<'_>,
|
move |_resolve_context: &ResolverContext<'_>,
|
||||||
value: &ValueAccessor|
|
value: &ValueAccessor|
|
||||||
-> SeaResult<sea_orm::Value> {
|
-> SeaResult<sea_orm::Value> {
|
||||||
@ -38,7 +38,7 @@ pub fn register_crypto_column_output_conversion_to_schema_context<T>(
|
|||||||
{
|
{
|
||||||
context.types.output_conversions.insert(
|
context.types.output_conversions.insert(
|
||||||
get_entity_and_column_name::<T>(context, column),
|
get_entity_and_column_name::<T>(context, column),
|
||||||
Box::new(
|
Arc::new(
|
||||||
move |value: &sea_orm::Value| -> SeaResult<async_graphql::Value> {
|
move |value: &sea_orm::Value| -> SeaResult<async_graphql::Value> {
|
||||||
if let SeaValue::String(s) = value {
|
if let SeaValue::String(s) = value {
|
||||||
if let Some(s) = s {
|
if let Some(s) = s {
|
||||||
|
@ -4,27 +4,20 @@ use async_graphql::dynamic::{
|
|||||||
Field, FieldFuture, FieldValue, InputObject, InputValue, Object, ObjectAccessor,
|
Field, FieldFuture, FieldValue, InputObject, InputValue, Object, ObjectAccessor,
|
||||||
ResolverContext, TypeRef,
|
ResolverContext, TypeRef,
|
||||||
};
|
};
|
||||||
use sea_orm::{
|
use sea_orm::{ActiveModelTrait, Condition, EntityTrait, IntoActiveModel};
|
||||||
ActiveModelTrait, Condition, EntityTrait, IntoActiveModel, QueryFilter, TransactionTrait,
|
|
||||||
};
|
|
||||||
use seaography::{
|
use seaography::{
|
||||||
Builder as SeaographyBuilder, BuilderContext, GuardAction, RelationBuilder,
|
Builder as SeaographyBuilder, BuilderContext, EntityCreateBatchMutationBuilder,
|
||||||
get_filter_conditions, prepare_active_model,
|
EntityCreateOneMutationBuilder, EntityDeleteMutationBuilder, EntityInputBuilder,
|
||||||
|
EntityObjectBuilder, EntityUpdateMutationBuilder, GuardAction, RelationBuilder,
|
||||||
|
get_filter_conditions,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
app::AppContextTrait,
|
app::AppContextTrait,
|
||||||
errors::RecorderResult,
|
errors::RecorderResult,
|
||||||
graphql::infra::name::{
|
graphql::infra::name::{
|
||||||
get_entity_and_column_name_from_column_str, get_entity_basic_type_name,
|
get_entity_filter_input_type_name, get_entity_name,
|
||||||
get_entity_create_batch_mutation_data_field_name,
|
get_entity_renormalized_filter_field_name,
|
||||||
get_entity_create_batch_mutation_field_name,
|
|
||||||
get_entity_create_one_mutation_data_field_name, get_entity_create_one_mutation_field_name,
|
|
||||||
get_entity_delete_mutation_field_name, get_entity_delete_mutation_filter_field_name,
|
|
||||||
get_entity_filter_input_type_name, get_entity_insert_data_input_type_name, get_entity_name,
|
|
||||||
get_entity_renormalized_filter_field_name, get_entity_update_data_input_type_name,
|
|
||||||
get_entity_update_mutation_data_field_name, get_entity_update_mutation_field_name,
|
|
||||||
get_entity_update_mutation_filter_field_name,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -80,50 +73,47 @@ pub type DeleteMutationFn = Arc<
|
|||||||
+ Sync,
|
+ Sync,
|
||||||
>;
|
>;
|
||||||
|
|
||||||
pub fn generate_entity_default_insert_input_object<T>(
|
pub fn generate_entity_default_insert_input_object<T>(context: &BuilderContext) -> InputObject
|
||||||
builder_context: &'static BuilderContext,
|
where
|
||||||
|
T: EntityTrait,
|
||||||
|
<T as EntityTrait>::Model: Sync,
|
||||||
|
{
|
||||||
|
EntityInputBuilder::insert_input_object::<T>(context)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn generate_entity_default_update_input_object<T>(context: &BuilderContext) -> InputObject
|
||||||
|
where
|
||||||
|
T: EntityTrait,
|
||||||
|
<T as EntityTrait>::Model: Sync,
|
||||||
|
{
|
||||||
|
EntityInputBuilder::update_input_object::<T>(context)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn generate_entity_default_basic_entity_object<T>(context: Arc<BuilderContext>) -> Object
|
||||||
|
where
|
||||||
|
T: EntityTrait,
|
||||||
|
<T as EntityTrait>::Model: Sync,
|
||||||
|
{
|
||||||
|
EntityObjectBuilder::basic_to_object::<T>(context)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn generate_entity_input_object<T>(
|
||||||
|
context: &'static BuilderContext,
|
||||||
|
is_insert: bool,
|
||||||
) -> InputObject
|
) -> InputObject
|
||||||
where
|
where
|
||||||
T: EntityTrait,
|
T: EntityTrait,
|
||||||
<T as EntityTrait>::Model: Sync,
|
<T as EntityTrait>::Model: Sync,
|
||||||
{
|
{
|
||||||
let entity_input_builder = seaography::EntityInputBuilder {
|
if is_insert {
|
||||||
context: builder_context,
|
EntityInputBuilder::insert_input_object::<T>(context)
|
||||||
};
|
} else {
|
||||||
|
EntityInputBuilder::update_input_object::<T>(context)
|
||||||
entity_input_builder.insert_input_object::<T>()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn generate_entity_default_update_input_object<T>(
|
|
||||||
builder_context: &'static BuilderContext,
|
|
||||||
) -> InputObject
|
|
||||||
where
|
|
||||||
T: EntityTrait,
|
|
||||||
<T as EntityTrait>::Model: Sync,
|
|
||||||
{
|
|
||||||
let entity_input_builder = seaography::EntityInputBuilder {
|
|
||||||
context: builder_context,
|
|
||||||
};
|
|
||||||
|
|
||||||
entity_input_builder.update_input_object::<T>()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn generate_entity_default_basic_entity_object<T>(
|
|
||||||
builder_context: &'static BuilderContext,
|
|
||||||
) -> Object
|
|
||||||
where
|
|
||||||
T: EntityTrait,
|
|
||||||
<T as EntityTrait>::Model: Sync,
|
|
||||||
{
|
|
||||||
let entity_object_builder = seaography::EntityObjectBuilder {
|
|
||||||
context: builder_context,
|
|
||||||
};
|
|
||||||
|
|
||||||
entity_object_builder.basic_to_object::<T>()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn generate_entity_filtered_mutation_field<E, N, R>(
|
pub fn generate_entity_filtered_mutation_field<E, N, R>(
|
||||||
builder_context: &'static BuilderContext,
|
builder_context: Arc<BuilderContext>,
|
||||||
field_name: N,
|
field_name: N,
|
||||||
type_ref: R,
|
type_ref: R,
|
||||||
mutation_fn: FilterMutationFn,
|
mutation_fn: FilterMutationFn,
|
||||||
@ -134,19 +124,28 @@ where
|
|||||||
N: Into<String>,
|
N: Into<String>,
|
||||||
R: Into<TypeRef>,
|
R: Into<TypeRef>,
|
||||||
{
|
{
|
||||||
let object_name: String = get_entity_name::<E>(builder_context);
|
let object_name: String = get_entity_name::<E>(&builder_context);
|
||||||
|
|
||||||
let guard = builder_context.guards.entity_guards.get(&object_name);
|
let guard = builder_context
|
||||||
|
.guards
|
||||||
|
.entity_guards
|
||||||
|
.get(&object_name)
|
||||||
|
.cloned();
|
||||||
|
|
||||||
|
let filter_input_value = InputValue::new(
|
||||||
|
get_entity_renormalized_filter_field_name(),
|
||||||
|
TypeRef::named(get_entity_filter_input_type_name::<E>(&builder_context)),
|
||||||
|
);
|
||||||
|
|
||||||
Field::new(field_name, type_ref, move |ctx| {
|
Field::new(field_name, type_ref, move |ctx| {
|
||||||
let mutation_fn = mutation_fn.clone();
|
let mutation_fn = mutation_fn.clone();
|
||||||
FieldFuture::new(async move {
|
let builder_context = builder_context.clone();
|
||||||
let guard_flag = if let Some(guard) = guard {
|
let guard_flag = if let Some(guard) = guard.as_ref() {
|
||||||
(*guard)(&ctx)
|
(*guard)(&ctx)
|
||||||
} else {
|
} else {
|
||||||
GuardAction::Allow
|
GuardAction::Allow
|
||||||
};
|
};
|
||||||
|
FieldFuture::new(async move {
|
||||||
if let GuardAction::Block(reason) = guard_flag {
|
if let GuardAction::Block(reason) = guard_flag {
|
||||||
return Err::<Option<_>, async_graphql::Error>(async_graphql::Error::new(
|
return Err::<Option<_>, async_graphql::Error>(async_graphql::Error::new(
|
||||||
reason.unwrap_or("Entity guard triggered.".into()),
|
reason.unwrap_or("Entity guard triggered.".into()),
|
||||||
@ -157,7 +156,7 @@ where
|
|||||||
|
|
||||||
let filters = ctx.args.get(get_entity_renormalized_filter_field_name());
|
let filters = ctx.args.get(get_entity_renormalized_filter_field_name());
|
||||||
|
|
||||||
let filters = get_filter_conditions::<E>(&ctx, builder_context, filters);
|
let filters = get_filter_conditions::<E>(&ctx, &builder_context, filters);
|
||||||
|
|
||||||
let result = mutation_fn(&ctx, app_ctx.clone(), filters)
|
let result = mutation_fn(&ctx, app_ctx.clone(), filters)
|
||||||
.await
|
.await
|
||||||
@ -166,146 +165,30 @@ where
|
|||||||
Ok(result)
|
Ok(result)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.argument(InputValue::new(
|
.argument(filter_input_value)
|
||||||
get_entity_renormalized_filter_field_name(),
|
|
||||||
TypeRef::named(get_entity_filter_input_type_name::<E>(builder_context)),
|
|
||||||
))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn generate_entity_create_one_mutation_field<E, ID>(
|
pub fn generate_entity_create_one_mutation_field<E>(
|
||||||
builder_context: &'static BuilderContext,
|
builder_context: Arc<BuilderContext>,
|
||||||
input_data_type_ref: Option<ID>,
|
|
||||||
mutation_fn: CreateOneMutationFn<E::Model>,
|
mutation_fn: CreateOneMutationFn<E::Model>,
|
||||||
) -> Field
|
) -> Field
|
||||||
where
|
where
|
||||||
E: EntityTrait,
|
E: EntityTrait,
|
||||||
<E as EntityTrait>::Model: Sync,
|
<E as EntityTrait>::Model: Sync,
|
||||||
ID: Into<TypeRef>,
|
|
||||||
{
|
{
|
||||||
let guard = builder_context
|
EntityCreateOneMutationBuilder::to_field_with_mutation_fn::<E>(
|
||||||
.guards
|
builder_context.clone(),
|
||||||
.entity_guards
|
Arc::new(move |resolver_ctx, input_object| {
|
||||||
.get(&get_entity_name::<E>(builder_context));
|
let result = resolver_ctx
|
||||||
let field_guards = &builder_context.guards.field_guards;
|
.data::<Arc<dyn AppContextTrait>>()
|
||||||
|
.map(|app_ctx| mutation_fn(&resolver_ctx, app_ctx.clone(), input_object));
|
||||||
Field::new(
|
Box::pin(async move { result?.await.map_err(async_graphql::Error::new_with_source) })
|
||||||
get_entity_create_one_mutation_field_name::<E>(builder_context),
|
|
||||||
TypeRef::named_nn(get_entity_basic_type_name::<E>(builder_context)),
|
|
||||||
move |ctx| {
|
|
||||||
let mutation_fn = mutation_fn.clone();
|
|
||||||
FieldFuture::new(async move {
|
|
||||||
let guard_flag = if let Some(guard) = guard {
|
|
||||||
(*guard)(&ctx)
|
|
||||||
} else {
|
|
||||||
GuardAction::Allow
|
|
||||||
};
|
|
||||||
|
|
||||||
if let GuardAction::Block(reason) = guard_flag {
|
|
||||||
return Err::<Option<_>, async_graphql::Error>(async_graphql::Error::new(
|
|
||||||
reason.unwrap_or("Entity guard triggered.".into()),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
let app_ctx = ctx.data::<Arc<dyn AppContextTrait>>()?;
|
|
||||||
|
|
||||||
let value_accessor = ctx
|
|
||||||
.args
|
|
||||||
.get(get_entity_create_one_mutation_data_field_name(
|
|
||||||
builder_context,
|
|
||||||
))
|
|
||||||
.unwrap();
|
|
||||||
let input_object = value_accessor.object()?;
|
|
||||||
|
|
||||||
for (column, _) in input_object.iter() {
|
|
||||||
let field_guard = field_guards.get(
|
|
||||||
&get_entity_and_column_name_from_column_str::<E>(builder_context, column),
|
|
||||||
);
|
|
||||||
let field_guard_flag = if let Some(field_guard) = field_guard {
|
|
||||||
(*field_guard)(&ctx)
|
|
||||||
} else {
|
|
||||||
GuardAction::Allow
|
|
||||||
};
|
|
||||||
if let GuardAction::Block(reason) = field_guard_flag {
|
|
||||||
return match reason {
|
|
||||||
Some(reason) => Err::<Option<_>, async_graphql::Error>(
|
|
||||||
async_graphql::Error::new(reason),
|
|
||||||
),
|
|
||||||
None => Err::<Option<_>, async_graphql::Error>(
|
|
||||||
async_graphql::Error::new("Field guard triggered."),
|
|
||||||
),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let result = mutation_fn(&ctx, app_ctx.clone(), input_object)
|
|
||||||
.await
|
|
||||||
.map_err(async_graphql::Error::new_with_source)?;
|
|
||||||
|
|
||||||
Ok(Some(FieldValue::owned_any(result)))
|
|
||||||
})
|
|
||||||
},
|
|
||||||
)
|
|
||||||
.argument(InputValue::new(
|
|
||||||
get_entity_create_one_mutation_data_field_name(builder_context),
|
|
||||||
input_data_type_ref.map(|t| t.into()).unwrap_or_else(|| {
|
|
||||||
TypeRef::named_nn(get_entity_insert_data_input_type_name::<E>(builder_context))
|
|
||||||
}),
|
}),
|
||||||
))
|
)
|
||||||
}
|
|
||||||
|
|
||||||
pub fn generate_entity_default_create_one_mutation_fn<T, A>(
|
|
||||||
builder_context: &'static BuilderContext,
|
|
||||||
active_model_hooks: bool,
|
|
||||||
) -> CreateOneMutationFn<T::Model>
|
|
||||||
where
|
|
||||||
T: EntityTrait,
|
|
||||||
<T as EntityTrait>::Model: Sync + IntoActiveModel<A>,
|
|
||||||
A: ActiveModelTrait<Entity = T> + sea_orm::ActiveModelBehavior + std::marker::Send + 'static,
|
|
||||||
{
|
|
||||||
Arc::new(move |resolve_context, app_ctx, input_object| {
|
|
||||||
let entity_input_builder = seaography::EntityInputBuilder {
|
|
||||||
context: builder_context,
|
|
||||||
};
|
|
||||||
let entity_object_builder = seaography::EntityObjectBuilder {
|
|
||||||
context: builder_context,
|
|
||||||
};
|
|
||||||
let active_model = prepare_active_model::<T, A>(
|
|
||||||
&entity_input_builder,
|
|
||||||
&entity_object_builder,
|
|
||||||
&input_object,
|
|
||||||
resolve_context,
|
|
||||||
);
|
|
||||||
|
|
||||||
Box::pin(async move {
|
|
||||||
if active_model_hooks {
|
|
||||||
let transaction = app_ctx.db().begin().await?;
|
|
||||||
|
|
||||||
let active_model = active_model?;
|
|
||||||
|
|
||||||
let active_model = active_model.before_save(&transaction, true).await?;
|
|
||||||
|
|
||||||
let result: T::Model = active_model.insert(&transaction).await?;
|
|
||||||
|
|
||||||
let result = A::after_save(result, &transaction, true).await?;
|
|
||||||
|
|
||||||
transaction.commit().await?;
|
|
||||||
|
|
||||||
Ok(result)
|
|
||||||
} else {
|
|
||||||
let db = app_ctx.db();
|
|
||||||
|
|
||||||
let active_model = active_model?;
|
|
||||||
|
|
||||||
let result: T::Model = active_model.insert(db).await?;
|
|
||||||
|
|
||||||
Ok(result)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn generate_entity_default_create_one_mutation_field<E, A>(
|
pub fn generate_entity_default_create_one_mutation_field<E, A>(
|
||||||
builder_context: &'static BuilderContext,
|
builder_context: Arc<BuilderContext>,
|
||||||
active_model_hooks: bool,
|
active_model_hooks: bool,
|
||||||
) -> Field
|
) -> Field
|
||||||
where
|
where
|
||||||
@ -314,174 +197,30 @@ where
|
|||||||
<E as EntityTrait>::Model: IntoActiveModel<A>,
|
<E as EntityTrait>::Model: IntoActiveModel<A>,
|
||||||
A: ActiveModelTrait<Entity = E> + sea_orm::ActiveModelBehavior + std::marker::Send + 'static,
|
A: ActiveModelTrait<Entity = E> + sea_orm::ActiveModelBehavior + std::marker::Send + 'static,
|
||||||
{
|
{
|
||||||
generate_entity_create_one_mutation_field::<E, TypeRef>(
|
EntityCreateOneMutationBuilder::to_field::<E, A>(builder_context, active_model_hooks)
|
||||||
builder_context,
|
|
||||||
None,
|
|
||||||
generate_entity_default_create_one_mutation_fn::<E, A>(builder_context, active_model_hooks),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn generate_entity_create_batch_mutation_field<E, ID>(
|
pub fn generate_entity_create_batch_mutation_field<E, ID>(
|
||||||
builder_context: &'static BuilderContext,
|
builder_context: Arc<BuilderContext>,
|
||||||
input_data_type_ref: Option<ID>,
|
|
||||||
mutation_fn: CreateBatchMutationFn<E::Model>,
|
mutation_fn: CreateBatchMutationFn<E::Model>,
|
||||||
) -> Field
|
) -> Field
|
||||||
where
|
where
|
||||||
E: EntityTrait,
|
E: EntityTrait,
|
||||||
<E as EntityTrait>::Model: Sync,
|
<E as EntityTrait>::Model: Sync,
|
||||||
ID: Into<TypeRef>,
|
|
||||||
{
|
{
|
||||||
let object_name: String = get_entity_name::<E>(builder_context);
|
EntityCreateBatchMutationBuilder::to_field_with_mutation_fn::<E>(
|
||||||
let guard = builder_context.guards.entity_guards.get(&object_name);
|
|
||||||
let field_guards = &builder_context.guards.field_guards;
|
|
||||||
|
|
||||||
Field::new(
|
|
||||||
get_entity_create_batch_mutation_field_name::<E>(builder_context),
|
|
||||||
TypeRef::named_nn_list_nn(get_entity_basic_type_name::<E>(builder_context)),
|
|
||||||
move |ctx| {
|
|
||||||
let mutation_fn = mutation_fn.clone();
|
|
||||||
FieldFuture::new(async move {
|
|
||||||
let guard_flag = if let Some(guard) = guard {
|
|
||||||
(*guard)(&ctx)
|
|
||||||
} else {
|
|
||||||
GuardAction::Allow
|
|
||||||
};
|
|
||||||
|
|
||||||
if let GuardAction::Block(reason) = guard_flag {
|
|
||||||
return match reason {
|
|
||||||
Some(reason) => Err::<Option<_>, async_graphql::Error>(
|
|
||||||
async_graphql::Error::new(reason),
|
|
||||||
),
|
|
||||||
None => Err::<Option<_>, async_graphql::Error>(async_graphql::Error::new(
|
|
||||||
"Entity guard triggered.",
|
|
||||||
)),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut input_objects: Vec<ObjectAccessor<'_>> = vec![];
|
|
||||||
let list = ctx
|
|
||||||
.args
|
|
||||||
.get(get_entity_create_batch_mutation_data_field_name(
|
|
||||||
builder_context,
|
builder_context,
|
||||||
))
|
Arc::new(move |resolver_ctx, input_objects| {
|
||||||
.unwrap()
|
let result = resolver_ctx
|
||||||
.list()?;
|
.data::<Arc<dyn AppContextTrait>>()
|
||||||
for input in list.iter() {
|
.map(|app_ctx| mutation_fn(&resolver_ctx, app_ctx.clone(), input_objects));
|
||||||
let input_object = input.object()?;
|
Box::pin(async move { result?.await.map_err(async_graphql::Error::new_with_source) })
|
||||||
for (column, _) in input_object.iter() {
|
|
||||||
let field_guard =
|
|
||||||
field_guards.get(&get_entity_and_column_name_from_column_str::<E>(
|
|
||||||
builder_context,
|
|
||||||
column,
|
|
||||||
));
|
|
||||||
let field_guard_flag = if let Some(field_guard) = field_guard {
|
|
||||||
(*field_guard)(&ctx)
|
|
||||||
} else {
|
|
||||||
GuardAction::Allow
|
|
||||||
};
|
|
||||||
if let GuardAction::Block(reason) = field_guard_flag {
|
|
||||||
return match reason {
|
|
||||||
Some(reason) => Err::<Option<_>, async_graphql::Error>(
|
|
||||||
async_graphql::Error::new(reason),
|
|
||||||
),
|
|
||||||
None => Err::<Option<_>, async_graphql::Error>(
|
|
||||||
async_graphql::Error::new("Field guard triggered."),
|
|
||||||
),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
input_objects.push(input_object);
|
|
||||||
}
|
|
||||||
|
|
||||||
let app_ctx = ctx.data::<Arc<dyn AppContextTrait>>()?;
|
|
||||||
|
|
||||||
let results = mutation_fn(&ctx, app_ctx.clone(), input_objects)
|
|
||||||
.await
|
|
||||||
.map_err(async_graphql::Error::new_with_source)?;
|
|
||||||
|
|
||||||
Ok(Some(FieldValue::list(
|
|
||||||
results.into_iter().map(FieldValue::owned_any),
|
|
||||||
)))
|
|
||||||
})
|
|
||||||
},
|
|
||||||
)
|
|
||||||
.argument(InputValue::new(
|
|
||||||
get_entity_create_batch_mutation_data_field_name(builder_context),
|
|
||||||
input_data_type_ref.map(|t| t.into()).unwrap_or_else(|| {
|
|
||||||
TypeRef::named_nn_list_nn(get_entity_insert_data_input_type_name::<E>(builder_context))
|
|
||||||
}),
|
}),
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn generate_entity_default_create_batch_mutation_fn<E, A>(
|
|
||||||
builder_context: &'static BuilderContext,
|
|
||||||
active_model_hooks: bool,
|
|
||||||
) -> CreateBatchMutationFn<E::Model>
|
|
||||||
where
|
|
||||||
E: EntityTrait,
|
|
||||||
<E as EntityTrait>::Model: Sync,
|
|
||||||
<E as EntityTrait>::Model: IntoActiveModel<A>,
|
|
||||||
A: ActiveModelTrait<Entity = E> + sea_orm::ActiveModelBehavior + std::marker::Send + 'static,
|
|
||||||
{
|
|
||||||
Arc::new(move |resolve_context, app_ctx, input_objects| {
|
|
||||||
let entity_input_builder = seaography::EntityInputBuilder {
|
|
||||||
context: builder_context,
|
|
||||||
};
|
|
||||||
let entity_object_builder = seaography::EntityObjectBuilder {
|
|
||||||
context: builder_context,
|
|
||||||
};
|
|
||||||
let active_models = input_objects
|
|
||||||
.into_iter()
|
|
||||||
.map(|input_object| {
|
|
||||||
prepare_active_model::<E, A>(
|
|
||||||
&entity_input_builder,
|
|
||||||
&entity_object_builder,
|
|
||||||
&input_object,
|
|
||||||
resolve_context,
|
|
||||||
)
|
)
|
||||||
})
|
|
||||||
.collect::<Result<Vec<_>, _>>();
|
|
||||||
|
|
||||||
Box::pin(async move {
|
|
||||||
if active_model_hooks {
|
|
||||||
let transaction = app_ctx.db().begin().await?;
|
|
||||||
|
|
||||||
let mut before_save_models = vec![];
|
|
||||||
|
|
||||||
for active_model in active_models? {
|
|
||||||
let before_save_model = active_model.before_save(&transaction, false).await?;
|
|
||||||
before_save_models.push(before_save_model);
|
|
||||||
}
|
|
||||||
|
|
||||||
let models: Vec<E::Model> = E::insert_many(before_save_models)
|
|
||||||
.exec_with_returning_many(&transaction)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
let mut result = vec![];
|
|
||||||
for model in models {
|
|
||||||
let after_save_model = A::after_save(model, &transaction, false).await?;
|
|
||||||
result.push(after_save_model);
|
|
||||||
}
|
|
||||||
|
|
||||||
transaction.commit().await?;
|
|
||||||
|
|
||||||
Ok(result)
|
|
||||||
} else {
|
|
||||||
let db = app_ctx.db();
|
|
||||||
let active_models = active_models?;
|
|
||||||
let results: Vec<E::Model> = E::insert_many(active_models)
|
|
||||||
.exec_with_returning_many(db)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
Ok(results)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn generate_entity_default_create_batch_mutation_field<E, A>(
|
pub fn generate_entity_default_create_batch_mutation_field<E, A>(
|
||||||
builder_context: &'static BuilderContext,
|
builder_context: Arc<BuilderContext>,
|
||||||
active_model_hooks: bool,
|
active_model_hooks: bool,
|
||||||
) -> Field
|
) -> Field
|
||||||
where
|
where
|
||||||
@ -490,178 +229,37 @@ where
|
|||||||
<E as EntityTrait>::Model: IntoActiveModel<A>,
|
<E as EntityTrait>::Model: IntoActiveModel<A>,
|
||||||
A: ActiveModelTrait<Entity = E> + sea_orm::ActiveModelBehavior + std::marker::Send + 'static,
|
A: ActiveModelTrait<Entity = E> + sea_orm::ActiveModelBehavior + std::marker::Send + 'static,
|
||||||
{
|
{
|
||||||
generate_entity_create_batch_mutation_field::<E, TypeRef>(
|
EntityCreateBatchMutationBuilder::to_field::<E, A>(builder_context, active_model_hooks)
|
||||||
builder_context,
|
|
||||||
None,
|
|
||||||
generate_entity_default_create_batch_mutation_fn::<E, A>(
|
|
||||||
builder_context,
|
|
||||||
active_model_hooks,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn generate_entity_update_mutation_field<E, I>(
|
pub fn generate_entity_update_mutation_field<E>(
|
||||||
builder_context: &'static BuilderContext,
|
builder_context: Arc<BuilderContext>,
|
||||||
input_data_type_ref: Option<I>,
|
|
||||||
mutation_fn: UpdateMutationFn<E::Model>,
|
mutation_fn: UpdateMutationFn<E::Model>,
|
||||||
) -> Field
|
) -> Field
|
||||||
where
|
where
|
||||||
E: EntityTrait,
|
E: EntityTrait,
|
||||||
<E as EntityTrait>::Model: Sync,
|
<E as EntityTrait>::Model: Sync,
|
||||||
I: Into<TypeRef>,
|
|
||||||
{
|
{
|
||||||
let guard = builder_context
|
EntityUpdateMutationBuilder::to_field_with_mutation_fn::<E>(
|
||||||
.guards
|
builder_context.clone(),
|
||||||
.entity_guards
|
Arc::new(move |resolver_ctx, filters, input_object| {
|
||||||
.get(&get_entity_name::<E>(builder_context));
|
let result = resolver_ctx
|
||||||
let field_guards = &builder_context.guards.field_guards;
|
.data::<Arc<dyn AppContextTrait>>()
|
||||||
|
.map(|app_ctx| {
|
||||||
Field::new(
|
mutation_fn(
|
||||||
get_entity_update_mutation_field_name::<E>(builder_context),
|
&resolver_ctx,
|
||||||
TypeRef::named_nn_list_nn(get_entity_basic_type_name::<E>(builder_context)),
|
app_ctx.clone(),
|
||||||
move |ctx| {
|
get_filter_conditions::<E>(&resolver_ctx, &builder_context, filters),
|
||||||
let mutation_fn = mutation_fn.clone();
|
input_object,
|
||||||
FieldFuture::new(async move {
|
|
||||||
let guard_flag = if let Some(guard) = guard {
|
|
||||||
(*guard)(&ctx)
|
|
||||||
} else {
|
|
||||||
GuardAction::Allow
|
|
||||||
};
|
|
||||||
|
|
||||||
if let GuardAction::Block(reason) = guard_flag {
|
|
||||||
return match reason {
|
|
||||||
Some(reason) => Err::<Option<_>, async_graphql::Error>(
|
|
||||||
async_graphql::Error::new(reason),
|
|
||||||
),
|
|
||||||
None => Err::<Option<_>, async_graphql::Error>(async_graphql::Error::new(
|
|
||||||
"Entity guard triggered.",
|
|
||||||
)),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
let app_ctx = ctx.data::<Arc<dyn AppContextTrait>>()?;
|
|
||||||
|
|
||||||
let filters = ctx.args.get(get_entity_update_mutation_filter_field_name(
|
|
||||||
builder_context,
|
|
||||||
));
|
|
||||||
let filter_condition = get_filter_conditions::<E>(&ctx, builder_context, filters);
|
|
||||||
|
|
||||||
let value_accessor = ctx
|
|
||||||
.args
|
|
||||||
.get(get_entity_update_mutation_data_field_name(builder_context))
|
|
||||||
.unwrap();
|
|
||||||
let input_object = value_accessor.object()?;
|
|
||||||
|
|
||||||
for (column, _) in input_object.iter() {
|
|
||||||
let field_guard = field_guards.get(
|
|
||||||
&get_entity_and_column_name_from_column_str::<E>(builder_context, column),
|
|
||||||
);
|
|
||||||
let field_guard_flag = if let Some(field_guard) = field_guard {
|
|
||||||
(*field_guard)(&ctx)
|
|
||||||
} else {
|
|
||||||
GuardAction::Allow
|
|
||||||
};
|
|
||||||
if let GuardAction::Block(reason) = field_guard_flag {
|
|
||||||
return match reason {
|
|
||||||
Some(reason) => Err::<Option<_>, async_graphql::Error>(
|
|
||||||
async_graphql::Error::new(reason),
|
|
||||||
),
|
|
||||||
None => Err::<Option<_>, async_graphql::Error>(
|
|
||||||
async_graphql::Error::new("Field guard triggered."),
|
|
||||||
),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let result = mutation_fn(&ctx, app_ctx.clone(), filter_condition, input_object)
|
|
||||||
.await
|
|
||||||
.map_err(async_graphql::Error::new_with_source)?;
|
|
||||||
|
|
||||||
Ok(Some(FieldValue::list(
|
|
||||||
result.into_iter().map(FieldValue::owned_any),
|
|
||||||
)))
|
|
||||||
})
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
.argument(InputValue::new(
|
});
|
||||||
get_entity_update_mutation_data_field_name(builder_context),
|
Box::pin(async move { result?.await.map_err(async_graphql::Error::new_with_source) })
|
||||||
input_data_type_ref.map(|t| t.into()).unwrap_or_else(|| {
|
|
||||||
TypeRef::named_nn(get_entity_update_data_input_type_name::<E>(builder_context))
|
|
||||||
}),
|
}),
|
||||||
))
|
|
||||||
.argument(InputValue::new(
|
|
||||||
get_entity_update_mutation_filter_field_name(builder_context),
|
|
||||||
TypeRef::named(get_entity_filter_input_type_name::<E>(builder_context)),
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn generate_entity_default_update_mutation_fn<T, A>(
|
|
||||||
builder_context: &'static BuilderContext,
|
|
||||||
active_model_hooks: bool,
|
|
||||||
) -> UpdateMutationFn<T::Model>
|
|
||||||
where
|
|
||||||
T: EntityTrait,
|
|
||||||
<T as EntityTrait>::Model: Sync + IntoActiveModel<A>,
|
|
||||||
A: ActiveModelTrait<Entity = T> + sea_orm::ActiveModelBehavior + std::marker::Send + 'static,
|
|
||||||
{
|
|
||||||
Arc::new(
|
|
||||||
move |resolve_context, app_ctx, filter_condition, input_object| {
|
|
||||||
let entity_input_builder = seaography::EntityInputBuilder {
|
|
||||||
context: builder_context,
|
|
||||||
};
|
|
||||||
let entity_object_builder = seaography::EntityObjectBuilder {
|
|
||||||
context: builder_context,
|
|
||||||
};
|
|
||||||
|
|
||||||
let active_model = prepare_active_model::<T, A>(
|
|
||||||
&entity_input_builder,
|
|
||||||
&entity_object_builder,
|
|
||||||
&input_object,
|
|
||||||
resolve_context,
|
|
||||||
);
|
|
||||||
|
|
||||||
Box::pin(async move {
|
|
||||||
if active_model_hooks {
|
|
||||||
let transaction = app_ctx.db().begin().await?;
|
|
||||||
|
|
||||||
let active_model = active_model?;
|
|
||||||
|
|
||||||
let active_model = active_model.before_save(&transaction, false).await?;
|
|
||||||
|
|
||||||
let models = T::update_many()
|
|
||||||
.set(active_model)
|
|
||||||
.filter(filter_condition.clone())
|
|
||||||
.exec_with_returning(&transaction)
|
|
||||||
.await?;
|
|
||||||
let mut result = vec![];
|
|
||||||
|
|
||||||
for model in models {
|
|
||||||
result.push(A::after_save(model, &transaction, false).await?);
|
|
||||||
}
|
|
||||||
|
|
||||||
transaction.commit().await?;
|
|
||||||
|
|
||||||
Ok(result)
|
|
||||||
} else {
|
|
||||||
let db = app_ctx.db();
|
|
||||||
|
|
||||||
let active_model = active_model?;
|
|
||||||
|
|
||||||
let result = T::update_many()
|
|
||||||
.set(active_model)
|
|
||||||
.filter(filter_condition.clone())
|
|
||||||
.exec_with_returning(db)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
Ok(result)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn generate_entity_default_update_mutation_field<E, A>(
|
pub fn generate_entity_default_update_mutation_field<E, A>(
|
||||||
builder_context: &'static BuilderContext,
|
builder_context: Arc<BuilderContext>,
|
||||||
active_model_hooks: bool,
|
active_model_hooks: bool,
|
||||||
) -> Field
|
) -> Field
|
||||||
where
|
where
|
||||||
@ -670,114 +268,36 @@ where
|
|||||||
<E as EntityTrait>::Model: IntoActiveModel<A>,
|
<E as EntityTrait>::Model: IntoActiveModel<A>,
|
||||||
A: ActiveModelTrait<Entity = E> + sea_orm::ActiveModelBehavior + std::marker::Send + 'static,
|
A: ActiveModelTrait<Entity = E> + sea_orm::ActiveModelBehavior + std::marker::Send + 'static,
|
||||||
{
|
{
|
||||||
generate_entity_update_mutation_field::<E, TypeRef>(
|
EntityUpdateMutationBuilder::to_field::<E, A>(builder_context, active_model_hooks)
|
||||||
builder_context,
|
|
||||||
None,
|
|
||||||
generate_entity_default_update_mutation_fn::<E, A>(builder_context, active_model_hooks),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn generate_entity_delete_mutation_field<E>(
|
pub fn generate_entity_delete_mutation_field<E>(
|
||||||
builder_context: &'static BuilderContext,
|
builder_context: Arc<BuilderContext>,
|
||||||
mutation_fn: DeleteMutationFn,
|
mutation_fn: DeleteMutationFn,
|
||||||
) -> Field
|
) -> Field
|
||||||
where
|
where
|
||||||
E: EntityTrait,
|
E: EntityTrait,
|
||||||
<E as EntityTrait>::Model: Sync,
|
<E as EntityTrait>::Model: Sync,
|
||||||
{
|
{
|
||||||
let object_name: String = get_entity_name::<E>(builder_context);
|
EntityDeleteMutationBuilder::to_field_with_mutation_fn::<E>(
|
||||||
let guard = builder_context.guards.entity_guards.get(&object_name);
|
builder_context.clone(),
|
||||||
|
Arc::new(move |resolver_ctx, filters| {
|
||||||
Field::new(
|
let result = resolver_ctx
|
||||||
get_entity_delete_mutation_field_name::<E>(builder_context),
|
.data::<Arc<dyn AppContextTrait>>()
|
||||||
TypeRef::named_nn(TypeRef::INT),
|
.map(|app_ctx| {
|
||||||
move |ctx| {
|
mutation_fn(
|
||||||
let mutation_fn = mutation_fn.clone();
|
&resolver_ctx,
|
||||||
FieldFuture::new(async move {
|
app_ctx.clone(),
|
||||||
let guard_flag = if let Some(guard) = guard {
|
get_filter_conditions::<E>(&resolver_ctx, &builder_context, filters),
|
||||||
(*guard)(&ctx)
|
)
|
||||||
} else {
|
});
|
||||||
GuardAction::Allow
|
Box::pin(async move { result?.await.map_err(async_graphql::Error::new_with_source) })
|
||||||
};
|
}),
|
||||||
|
|
||||||
if let GuardAction::Block(reason) = guard_flag {
|
|
||||||
return Err::<Option<_>, async_graphql::Error>(async_graphql::Error::new(
|
|
||||||
reason.unwrap_or("Entity guard triggered.".into()),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
let filters = ctx.args.get(get_entity_delete_mutation_filter_field_name(
|
|
||||||
builder_context,
|
|
||||||
));
|
|
||||||
let filter_condition = get_filter_conditions::<E>(&ctx, builder_context, filters);
|
|
||||||
|
|
||||||
let app_ctx = ctx.data::<Arc<dyn AppContextTrait>>()?;
|
|
||||||
|
|
||||||
let res = mutation_fn(&ctx, app_ctx.clone(), filter_condition)
|
|
||||||
.await
|
|
||||||
.map_err(async_graphql::Error::new_with_source)?;
|
|
||||||
|
|
||||||
Ok(Some(async_graphql::Value::from(res)))
|
|
||||||
})
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
.argument(InputValue::new(
|
|
||||||
get_entity_delete_mutation_filter_field_name(builder_context),
|
|
||||||
TypeRef::named(get_entity_filter_input_type_name::<E>(builder_context)),
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn generate_entity_default_delete_mutation_fn<E, A>(
|
|
||||||
_builder_context: &'static BuilderContext,
|
|
||||||
active_model_hooks: bool,
|
|
||||||
) -> DeleteMutationFn
|
|
||||||
where
|
|
||||||
E: EntityTrait,
|
|
||||||
<E as EntityTrait>::Model: Sync,
|
|
||||||
<E as EntityTrait>::Model: IntoActiveModel<A>,
|
|
||||||
A: ActiveModelTrait<Entity = E> + sea_orm::ActiveModelBehavior + std::marker::Send + 'static,
|
|
||||||
{
|
|
||||||
Arc::new(move |_resolve_context, app_ctx, filter_condition| {
|
|
||||||
Box::pin(async move {
|
|
||||||
if active_model_hooks {
|
|
||||||
let transaction = app_ctx.db().begin().await?;
|
|
||||||
|
|
||||||
let models: Vec<E::Model> = E::find()
|
|
||||||
.filter(filter_condition.clone())
|
|
||||||
.all(&transaction)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
let mut active_models: Vec<A> = vec![];
|
|
||||||
for model in models {
|
|
||||||
let active_model = model.into_active_model();
|
|
||||||
active_models.push(active_model.before_delete(&transaction).await?);
|
|
||||||
}
|
|
||||||
|
|
||||||
let result = E::delete_many()
|
|
||||||
.filter(filter_condition)
|
|
||||||
.exec(&transaction)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
for active_model in active_models {
|
|
||||||
active_model.after_delete(&transaction).await?;
|
|
||||||
}
|
|
||||||
|
|
||||||
transaction.commit().await?;
|
|
||||||
|
|
||||||
Ok(result.rows_affected)
|
|
||||||
} else {
|
|
||||||
let db = app_ctx.db();
|
|
||||||
|
|
||||||
let result = E::delete_many().filter(filter_condition).exec(db).await?;
|
|
||||||
|
|
||||||
Ok(result.rows_affected)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn generate_entity_default_delete_mutation_field<E, A>(
|
pub fn generate_entity_default_delete_mutation_field<E, A>(
|
||||||
builder_context: &'static BuilderContext,
|
builder_context: Arc<BuilderContext>,
|
||||||
active_model_hooks: bool,
|
active_model_hooks: bool,
|
||||||
) -> Field
|
) -> Field
|
||||||
where
|
where
|
||||||
@ -786,10 +306,7 @@ where
|
|||||||
<E as EntityTrait>::Model: IntoActiveModel<A>,
|
<E as EntityTrait>::Model: IntoActiveModel<A>,
|
||||||
A: ActiveModelTrait<Entity = E> + sea_orm::ActiveModelBehavior + std::marker::Send + 'static,
|
A: ActiveModelTrait<Entity = E> + sea_orm::ActiveModelBehavior + std::marker::Send + 'static,
|
||||||
{
|
{
|
||||||
generate_entity_delete_mutation_field::<E>(
|
EntityDeleteMutationBuilder::to_field::<E, A>(builder_context, active_model_hooks)
|
||||||
builder_context,
|
|
||||||
generate_entity_default_delete_mutation_fn::<E, A>(builder_context, active_model_hooks),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn register_entity_default_mutations<E, A>(
|
pub fn register_entity_default_mutations<E, A>(
|
||||||
@ -801,28 +318,35 @@ where
|
|||||||
<E as EntityTrait>::Model: Sync + IntoActiveModel<A>,
|
<E as EntityTrait>::Model: Sync + IntoActiveModel<A>,
|
||||||
A: ActiveModelTrait<Entity = E> + sea_orm::ActiveModelBehavior + std::marker::Send + 'static,
|
A: ActiveModelTrait<Entity = E> + sea_orm::ActiveModelBehavior + std::marker::Send + 'static,
|
||||||
{
|
{
|
||||||
|
let builder_context = &builder.context;
|
||||||
builder
|
builder
|
||||||
.outputs
|
.outputs
|
||||||
.push(generate_entity_default_basic_entity_object::<E>(
|
.push(generate_entity_default_basic_entity_object::<E>(
|
||||||
builder.context,
|
builder_context.clone(),
|
||||||
));
|
));
|
||||||
|
|
||||||
builder.inputs.extend([
|
builder.inputs.extend([
|
||||||
generate_entity_default_insert_input_object::<E>(builder.context),
|
generate_entity_default_insert_input_object::<E>(&builder.context),
|
||||||
generate_entity_default_update_input_object::<E>(builder.context),
|
generate_entity_default_update_input_object::<E>(&builder.context),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
builder.mutations.extend([
|
builder.mutations.extend([
|
||||||
generate_entity_default_create_one_mutation_field::<E, A>(
|
generate_entity_default_create_one_mutation_field::<E, A>(
|
||||||
builder.context,
|
builder_context.clone(),
|
||||||
active_model_hooks,
|
active_model_hooks,
|
||||||
),
|
),
|
||||||
generate_entity_default_create_batch_mutation_field::<E, A>(
|
generate_entity_default_create_batch_mutation_field::<E, A>(
|
||||||
builder.context,
|
builder_context.clone(),
|
||||||
|
active_model_hooks,
|
||||||
|
),
|
||||||
|
generate_entity_default_update_mutation_field::<E, A>(
|
||||||
|
builder_context.clone(),
|
||||||
|
active_model_hooks,
|
||||||
|
),
|
||||||
|
generate_entity_default_delete_mutation_field::<E, A>(
|
||||||
|
builder_context.clone(),
|
||||||
active_model_hooks,
|
active_model_hooks,
|
||||||
),
|
),
|
||||||
generate_entity_default_update_mutation_field::<E, A>(builder.context, active_model_hooks),
|
|
||||||
generate_entity_default_delete_mutation_field::<E, A>(builder.context, active_model_hooks),
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
builder
|
builder
|
||||||
@ -840,7 +364,7 @@ where
|
|||||||
{
|
{
|
||||||
builder.register_entity::<T>(
|
builder.register_entity::<T>(
|
||||||
<RE as sea_orm::Iterable>::iter()
|
<RE as sea_orm::Iterable>::iter()
|
||||||
.map(|rel| RelationBuilder::get_relation(&rel, builder.context))
|
.map(|rel| RelationBuilder::get_relation(&rel, builder.context.clone()))
|
||||||
.collect(),
|
.collect(),
|
||||||
);
|
);
|
||||||
builder = builder.register_entity_dataloader_one_to_one(entity, tokio::spawn);
|
builder = builder.register_entity_dataloader_one_to_one(entity, tokio::spawn);
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
use async_graphql::{
|
use async_graphql::{
|
||||||
Error as GraphqlError,
|
Error as GraphqlError,
|
||||||
dynamic::{ResolverContext, Scalar, SchemaError},
|
dynamic::{ResolverContext, Scalar, SchemaError},
|
||||||
@ -963,7 +965,7 @@ pub fn try_convert_jsonb_input_for_entity<T, S>(
|
|||||||
let entity_column_name = get_entity_and_column_name::<T>(context, column);
|
let entity_column_name = get_entity_and_column_name::<T>(context, column);
|
||||||
context.types.input_conversions.insert(
|
context.types.input_conversions.insert(
|
||||||
entity_column_name.clone(),
|
entity_column_name.clone(),
|
||||||
Box::new(move |_resolve_context, accessor| {
|
Arc::new(move |_resolve_context, accessor| {
|
||||||
let mut json_value = accessor.as_value().clone().into_json().map_err(|err| {
|
let mut json_value = accessor.as_value().clone().into_json().map_err(|err| {
|
||||||
SeaographyError::TypeConversionError(
|
SeaographyError::TypeConversionError(
|
||||||
err.to_string(),
|
err.to_string(),
|
||||||
@ -998,7 +1000,7 @@ pub fn convert_jsonb_output_for_entity<T>(
|
|||||||
let entity_column_key = get_entity_and_column_name::<T>(context, column);
|
let entity_column_key = get_entity_and_column_name::<T>(context, column);
|
||||||
context.types.output_conversions.insert(
|
context.types.output_conversions.insert(
|
||||||
entity_column_key.clone(),
|
entity_column_key.clone(),
|
||||||
Box::new(move |value| {
|
Arc::new(move |value| {
|
||||||
if let sea_orm::Value::Json(Some(json)) = value {
|
if let sea_orm::Value::Json(Some(json)) = value {
|
||||||
let mut json_value = json.as_ref().clone();
|
let mut json_value = json.as_ref().clone();
|
||||||
if let Some(case) = case {
|
if let Some(case) = case {
|
||||||
|
@ -78,7 +78,7 @@ where
|
|||||||
context.filter_input.type_name.as_ref()(&entity_name)
|
context.filter_input.type_name.as_ref()(&entity_name)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_entity_insert_data_input_type_name<T>(context: &BuilderContext) -> String
|
pub fn get_entity_insert_input_type_name<T>(context: &BuilderContext) -> String
|
||||||
where
|
where
|
||||||
T: EntityTrait,
|
T: EntityTrait,
|
||||||
<T as EntityTrait>::Model: Sync,
|
<T as EntityTrait>::Model: Sync,
|
||||||
@ -87,7 +87,7 @@ where
|
|||||||
format!("{entity_name}{}", context.entity_input.insert_suffix)
|
format!("{entity_name}{}", context.entity_input.insert_suffix)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_entity_update_data_input_type_name<T>(context: &BuilderContext) -> String
|
pub fn get_entity_update_input_type_name<T>(context: &BuilderContext) -> String
|
||||||
where
|
where
|
||||||
T: EntityTrait,
|
T: EntityTrait,
|
||||||
<T as EntityTrait>::Model: Sync,
|
<T as EntityTrait>::Model: Sync,
|
||||||
|
@ -59,13 +59,11 @@ pub fn build_schema(
|
|||||||
) -> Result<Schema, SchemaError> {
|
) -> Result<Schema, SchemaError> {
|
||||||
let database = app_ctx.db().as_ref().clone();
|
let database = app_ctx.db().as_ref().clone();
|
||||||
|
|
||||||
let context = CONTEXT.get_or_init(|| {
|
let context = Arc::new({
|
||||||
let mut context = BuilderContext::default();
|
let mut context = BuilderContext::default();
|
||||||
|
// basic
|
||||||
renormalize_filter_field_names_to_schema_context(&mut context);
|
renormalize_filter_field_names_to_schema_context(&mut context);
|
||||||
renormalize_data_field_names_to_schema_context(&mut context);
|
renormalize_data_field_names_to_schema_context(&mut context);
|
||||||
|
|
||||||
{
|
|
||||||
// domains
|
// domains
|
||||||
register_feeds_to_schema_context(&mut context);
|
register_feeds_to_schema_context(&mut context);
|
||||||
register_subscribers_to_schema_context(&mut context);
|
register_subscribers_to_schema_context(&mut context);
|
||||||
@ -79,7 +77,6 @@ pub fn build_schema(
|
|||||||
register_subscription_episode_to_schema_context(&mut context);
|
register_subscription_episode_to_schema_context(&mut context);
|
||||||
register_bangumi_to_schema_context(&mut context);
|
register_bangumi_to_schema_context(&mut context);
|
||||||
register_cron_to_schema_context(&mut context);
|
register_cron_to_schema_context(&mut context);
|
||||||
}
|
|
||||||
context
|
context
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -128,20 +128,14 @@ impl ActiveModelBehavior for ActiveModel {
|
|||||||
Model::calculate_next_run(cron_expr).map_err(|e| DbErr::Custom(e.to_string()))?;
|
Model::calculate_next_run(cron_expr).map_err(|e| DbErr::Custom(e.to_string()))?;
|
||||||
self.next_run = Set(Some(next_run));
|
self.next_run = Set(Some(next_run));
|
||||||
}
|
}
|
||||||
if let ActiveValue::Set(Some(subscriber_id)) = self.subscriber_id {
|
if let ActiveValue::Set(Some(subscriber_id)) = self.subscriber_id
|
||||||
if let ActiveValue::Set(Some(ref subscriber_task)) = self.subscriber_task {
|
&& let ActiveValue::Set(Some(ref subscriber_task)) = self.subscriber_task
|
||||||
if subscriber_task.get_subscriber_id() != subscriber_id {
|
&& subscriber_task.get_subscriber_id() != subscriber_id
|
||||||
|
{
|
||||||
return Err(DbErr::Custom(
|
return Err(DbErr::Custom(
|
||||||
"Subscriber task subscriber_id does not match cron subscriber_id"
|
"Cron subscriber_id does not match subscriber_task.subscriber_id".to_string(),
|
||||||
.to_string(),
|
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
return Err(DbErr::Custom(
|
|
||||||
"Cron subscriber_id is set but subscriber_task is not set".to_string(),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use sea_orm::entity::prelude::*;
|
use sea_orm::{ActiveValue, entity::prelude::*};
|
||||||
|
|
||||||
|
use crate::task::SubscriberTaskTrait;
|
||||||
pub use crate::task::{
|
pub use crate::task::{
|
||||||
SubscriberTask, SubscriberTaskType, SubscriberTaskTypeEnum, SubscriberTaskTypeVariant,
|
SubscriberTask, SubscriberTaskType, SubscriberTaskTypeEnum, SubscriberTaskTypeVariant,
|
||||||
SubscriberTaskTypeVariantIter, subscriber_task_schema,
|
SubscriberTaskTypeVariantIter, subscriber_task_schema,
|
||||||
@ -84,4 +85,19 @@ pub enum RelatedEntity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl ActiveModelBehavior for ActiveModel {}
|
impl ActiveModelBehavior for ActiveModel {
|
||||||
|
async fn before_save<C>(mut self, _db: &C, _insert: bool) -> Result<Self, DbErr>
|
||||||
|
where
|
||||||
|
C: ConnectionTrait,
|
||||||
|
{
|
||||||
|
if let ActiveValue::Set(subscriber_id) = self.subscriber_id
|
||||||
|
&& let ActiveValue::Set(ref job) = self.job
|
||||||
|
&& job.get_subscriber_id() != subscriber_id
|
||||||
|
{
|
||||||
|
return Err(DbErr::Custom(
|
||||||
|
"SubscriberTask subscriber_id does not match job.subscriber_id".to_string(),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
Ok(self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -6,7 +6,8 @@ macro_rules! register_subscriber_task_type {
|
|||||||
}
|
}
|
||||||
) => {
|
) => {
|
||||||
$(#[$type_meta])*
|
$(#[$type_meta])*
|
||||||
#[derive(typed_builder::TypedBuilder, schemars::JsonSchema)]
|
#[derive(typed_builder::TypedBuilder, schemars::JsonSchema, ts_rs::TS)]
|
||||||
|
#[ts(export, rename_all = "camelCase")]
|
||||||
$task_vis struct $task_name {
|
$task_vis struct $task_name {
|
||||||
$($(#[$field_meta])* pub $field_name: $field_type,)*
|
$($(#[$field_meta])* pub $field_name: $field_type,)*
|
||||||
pub subscriber_id: i32,
|
pub subscriber_id: i32,
|
||||||
|
@ -10,6 +10,7 @@ pub use subscription::{
|
|||||||
SyncOneSubscriptionFeedsFullTask, SyncOneSubscriptionFeedsIncrementalTask,
|
SyncOneSubscriptionFeedsFullTask, SyncOneSubscriptionFeedsIncrementalTask,
|
||||||
SyncOneSubscriptionSourcesTask,
|
SyncOneSubscriptionSourcesTask,
|
||||||
};
|
};
|
||||||
|
use ts_rs::TS;
|
||||||
|
|
||||||
macro_rules! register_subscriber_task_types {
|
macro_rules! register_subscriber_task_types {
|
||||||
(
|
(
|
||||||
@ -46,6 +47,7 @@ macro_rules! register_subscriber_task_types {
|
|||||||
|
|
||||||
$(#[$task_enum_meta])*
|
$(#[$task_enum_meta])*
|
||||||
#[serde(tag = "task_type")]
|
#[serde(tag = "task_type")]
|
||||||
|
#[ts(export, rename_all = "camelCase", tag = "taskType")]
|
||||||
pub enum $task_enum_name {
|
pub enum $task_enum_name {
|
||||||
$(
|
$(
|
||||||
$(#[$task_variant_meta])*
|
$(#[$task_variant_meta])*
|
||||||
@ -136,7 +138,7 @@ register_subscriber_task_types!(
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
task_enum: {
|
task_enum: {
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, FromJsonQueryResult, JsonSchema)]
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, FromJsonQueryResult, JsonSchema, TS)]
|
||||||
pub enum SubscriberTask {
|
pub enum SubscriberTask {
|
||||||
SyncOneSubscriptionFeedsIncremental(SyncOneSubscriptionFeedsIncrementalTask),
|
SyncOneSubscriptionFeedsIncremental(SyncOneSubscriptionFeedsIncrementalTask),
|
||||||
SyncOneSubscriptionFeedsFull(SyncOneSubscriptionFeedsFullTask),
|
SyncOneSubscriptionFeedsFull(SyncOneSubscriptionFeedsFullTask),
|
||||||
|
10
apps/recorder/tsconfig.json
Normal file
10
apps/recorder/tsconfig.json
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"extends": "../../tsconfig.base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"rootDir": ".",
|
||||||
|
"composite": true,
|
||||||
|
"module": "ESNext",
|
||||||
|
"moduleResolution": "bundler"
|
||||||
|
},
|
||||||
|
"include": ["bindings"]
|
||||||
|
}
|
@ -11,6 +11,7 @@
|
|||||||
"codegen-watch": "graphql-codegen --config graphql-codegen.ts --watch"
|
"codegen-watch": "graphql-codegen --config graphql-codegen.ts --watch"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"recorder": "workspace:*",
|
||||||
"@abraham/reflection": "^0.13.0",
|
"@abraham/reflection": "^0.13.0",
|
||||||
"@apollo/client": "^3.13.8",
|
"@apollo/client": "^3.13.8",
|
||||||
"@codemirror/language": "6.11.1",
|
"@codemirror/language": "6.11.1",
|
||||||
|
@ -138,30 +138,6 @@ query GetSubscriptionDetail ($id: Int!) {
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export const SYNC_SUBSCRIPTION_FEEDS_INCREMENTAL = gql`
|
|
||||||
mutation SyncSubscriptionFeedsIncremental($data: SubscriberTasksInsertInput!) {
|
|
||||||
subscriberTasksCreateOne(data: $data) {
|
|
||||||
id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
export const SYNC_SUBSCRIPTION_FEEDS_FULL = gql`
|
|
||||||
mutation SyncSubscriptionFeedsFull($filter: SubscriptionsFilterInput!) {
|
|
||||||
subscriptionsSyncOneFeedsFull(filter: $filter) {
|
|
||||||
id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
export const SYNC_SUBSCRIPTION_SOURCES = gql`
|
|
||||||
mutation SyncSubscriptionSources($filter: SubscriptionsFilterInput!) {
|
|
||||||
subscriptionsSyncOneSources(filter: $filter) {
|
|
||||||
id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
export const SubscriptionFormTypedMikanSeasonSchema =
|
export const SubscriptionFormTypedMikanSeasonSchema =
|
||||||
MikanSubscriptionSeasonSourceUrlSchema.and(
|
MikanSubscriptionSeasonSourceUrlSchema.and(
|
||||||
type({
|
type({
|
||||||
|
@ -1,10 +1,6 @@
|
|||||||
import {
|
import type { GetTasksQuery } from '@/infra/graphql/gql/graphql';
|
||||||
type GetTasksQuery,
|
|
||||||
SubscriberTaskTypeEnum,
|
|
||||||
} from '@/infra/graphql/gql/graphql';
|
|
||||||
import { gql } from '@apollo/client';
|
import { gql } from '@apollo/client';
|
||||||
import { type } from 'arktype';
|
import type { SubscriberTask } from 'recorder/bindings/SubscriberTask';
|
||||||
import { SubscriptionSchema } from './subscriptions';
|
|
||||||
|
|
||||||
export const GET_TASKS = gql`
|
export const GET_TASKS = gql`
|
||||||
query GetTasks($filter: SubscriberTasksFilterInput!, $orderBy: SubscriberTasksOrderInput!, $pagination: PaginationInput!) {
|
query GetTasks($filter: SubscriberTasksFilterInput!, $orderBy: SubscriberTasksOrderInput!, $pagination: PaginationInput!) {
|
||||||
@ -35,6 +31,14 @@ export const GET_TASKS = gql`
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
export const INSERT_SUBSCRIBER_TASK = gql`
|
||||||
|
mutation InsertSubscriberTask($data: SubscriberTasksInsertInput!) {
|
||||||
|
subscriberTasksCreateOne(data: $data) {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
export const DELETE_TASKS = gql`
|
export const DELETE_TASKS = gql`
|
||||||
mutation DeleteTasks($filter: SubscriberTasksFilterInput!) {
|
mutation DeleteTasks($filter: SubscriberTasksFilterInput!) {
|
||||||
subscriberTasksDelete(filter: $filter)
|
subscriberTasksDelete(filter: $filter)
|
||||||
@ -60,27 +64,11 @@ export const RETRY_TASKS = gql`
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export const TaskTypedSyncOneSubscriptionFeedsIncrementalSchema = type({
|
export type SubscriberTaskInsertDto = Omit<SubscriberTask, 'subscriberId'>;
|
||||||
taskType: `'${SubscriberTaskTypeEnum.SyncOneSubscriptionFeedsIncremental}'`,
|
|
||||||
}).and(SubscriptionSchema);
|
|
||||||
|
|
||||||
export const TaskTypedSyncOneSubscriptionFeedsFullSchema = type({
|
|
||||||
taskType: `'${SubscriberTaskTypeEnum.SyncOneSubscriptionFeedsFull}'`,
|
|
||||||
}).and(SubscriptionSchema);
|
|
||||||
|
|
||||||
export const TaskTypedSyncOneSubscriptionSourcesSchema = type({
|
|
||||||
taskType: `'${SubscriberTaskTypeEnum.SyncOneSubscriptionSources}'`,
|
|
||||||
}).and(SubscriptionSchema);
|
|
||||||
|
|
||||||
export const TaskTypedSchema = TaskTypedSyncOneSubscriptionFeedsFullSchema.or(
|
|
||||||
TaskTypedSyncOneSubscriptionFeedsIncrementalSchema
|
|
||||||
).or(TaskTypedSyncOneSubscriptionSourcesSchema);
|
|
||||||
|
|
||||||
export type TaskTypedDto = typeof TaskTypedSchema.infer;
|
|
||||||
|
|
||||||
export type TaskDto = Omit<
|
export type TaskDto = Omit<
|
||||||
GetTasksQuery['subscriberTasks']['nodes'][number],
|
GetTasksQuery['subscriberTasks']['nodes'][number],
|
||||||
'job'
|
'job'
|
||||||
> & {
|
> & {
|
||||||
job: TaskTypedDto;
|
job: SubscriberTask;
|
||||||
};
|
};
|
||||||
|
@ -27,10 +27,8 @@ type Documents = {
|
|||||||
"\n mutation UpdateSubscriptions(\n $data: SubscriptionsUpdateInput!,\n $filter: SubscriptionsFilterInput!,\n ) {\n subscriptionsUpdate (\n data: $data\n filter: $filter\n ) {\n id\n createdAt\n updatedAt\n displayName\n category\n sourceUrl\n enabled\n }\n}\n": typeof types.UpdateSubscriptionsDocument,
|
"\n mutation UpdateSubscriptions(\n $data: SubscriptionsUpdateInput!,\n $filter: SubscriptionsFilterInput!,\n ) {\n subscriptionsUpdate (\n data: $data\n filter: $filter\n ) {\n id\n createdAt\n updatedAt\n displayName\n category\n sourceUrl\n enabled\n }\n}\n": typeof types.UpdateSubscriptionsDocument,
|
||||||
"\n mutation DeleteSubscriptions($filter: SubscriptionsFilterInput) {\n subscriptionsDelete(filter: $filter)\n }\n": typeof types.DeleteSubscriptionsDocument,
|
"\n mutation DeleteSubscriptions($filter: SubscriptionsFilterInput) {\n subscriptionsDelete(filter: $filter)\n }\n": typeof types.DeleteSubscriptionsDocument,
|
||||||
"\nquery GetSubscriptionDetail ($id: Int!) {\n subscriptions(filter: { id: {\n eq: $id\n } }) {\n nodes {\n id\n subscriberId\n displayName\n createdAt\n updatedAt\n category\n sourceUrl\n enabled\n feed {\n nodes {\n id\n createdAt\n updatedAt\n token\n feedType\n feedSource\n }\n }\n subscriberTask {\n nodes {\n id\n taskType\n status\n }\n }\n credential3rd {\n id\n username\n }\n bangumi {\n nodes {\n createdAt\n updatedAt\n id\n mikanBangumiId\n displayName\n season\n seasonRaw\n fansub\n mikanFansubId\n rssLink\n posterLink\n homepage\n }\n }\n }\n }\n}\n": typeof types.GetSubscriptionDetailDocument,
|
"\nquery GetSubscriptionDetail ($id: Int!) {\n subscriptions(filter: { id: {\n eq: $id\n } }) {\n nodes {\n id\n subscriberId\n displayName\n createdAt\n updatedAt\n category\n sourceUrl\n enabled\n feed {\n nodes {\n id\n createdAt\n updatedAt\n token\n feedType\n feedSource\n }\n }\n subscriberTask {\n nodes {\n id\n taskType\n status\n }\n }\n credential3rd {\n id\n username\n }\n bangumi {\n nodes {\n createdAt\n updatedAt\n id\n mikanBangumiId\n displayName\n season\n seasonRaw\n fansub\n mikanFansubId\n rssLink\n posterLink\n homepage\n }\n }\n }\n }\n}\n": typeof types.GetSubscriptionDetailDocument,
|
||||||
"\n mutation SyncSubscriptionFeedsIncremental($data: SubscriberTasksInsertInput!) {\n subscriberTasksCreateOne(data: $data) {\n id\n }\n }\n": typeof types.SyncSubscriptionFeedsIncrementalDocument,
|
|
||||||
"\n mutation SyncSubscriptionFeedsFull($filter: SubscriptionsFilterInput!) {\n subscriptionsSyncOneFeedsFull(filter: $filter) {\n id\n }\n }\n": typeof types.SyncSubscriptionFeedsFullDocument,
|
|
||||||
"\n mutation SyncSubscriptionSources($filter: SubscriptionsFilterInput!) {\n subscriptionsSyncOneSources(filter: $filter) {\n id\n }\n }\n": typeof types.SyncSubscriptionSourcesDocument,
|
|
||||||
"\n query GetTasks($filter: SubscriberTasksFilterInput!, $orderBy: SubscriberTasksOrderInput!, $pagination: PaginationInput!) {\n subscriberTasks(\n pagination: $pagination\n filter: $filter\n orderBy: $orderBy\n ) {\n nodes {\n id,\n job,\n taskType,\n status,\n attempts,\n maxAttempts,\n runAt,\n lastError,\n lockAt,\n lockBy,\n doneAt,\n priority\n }\n paginationInfo {\n total\n pages\n }\n }\n }\n": typeof types.GetTasksDocument,
|
"\n query GetTasks($filter: SubscriberTasksFilterInput!, $orderBy: SubscriberTasksOrderInput!, $pagination: PaginationInput!) {\n subscriberTasks(\n pagination: $pagination\n filter: $filter\n orderBy: $orderBy\n ) {\n nodes {\n id,\n job,\n taskType,\n status,\n attempts,\n maxAttempts,\n runAt,\n lastError,\n lockAt,\n lockBy,\n doneAt,\n priority\n }\n paginationInfo {\n total\n pages\n }\n }\n }\n": typeof types.GetTasksDocument,
|
||||||
|
"\n mutation InsertSubscriberTask($data: SubscriberTasksInsertInput!) {\n subscriberTasksCreateOne(data: $data) {\n id\n }\n }\n": typeof types.InsertSubscriberTaskDocument,
|
||||||
"\n mutation DeleteTasks($filter: SubscriberTasksFilterInput!) {\n subscriberTasksDelete(filter: $filter)\n }\n": typeof types.DeleteTasksDocument,
|
"\n mutation DeleteTasks($filter: SubscriberTasksFilterInput!) {\n subscriberTasksDelete(filter: $filter)\n }\n": typeof types.DeleteTasksDocument,
|
||||||
"\n mutation RetryTasks($filter: SubscriberTasksFilterInput!) {\n subscriberTasksRetryOne(filter: $filter) {\n id,\n job,\n taskType,\n status,\n attempts,\n maxAttempts,\n runAt,\n lastError,\n lockAt,\n lockBy,\n doneAt,\n priority\n }\n }\n": typeof types.RetryTasksDocument,
|
"\n mutation RetryTasks($filter: SubscriberTasksFilterInput!) {\n subscriberTasksRetryOne(filter: $filter) {\n id,\n job,\n taskType,\n status,\n attempts,\n maxAttempts,\n runAt,\n lastError,\n lockAt,\n lockBy,\n doneAt,\n priority\n }\n }\n": typeof types.RetryTasksDocument,
|
||||||
};
|
};
|
||||||
@ -48,10 +46,8 @@ const documents: Documents = {
|
|||||||
"\n mutation UpdateSubscriptions(\n $data: SubscriptionsUpdateInput!,\n $filter: SubscriptionsFilterInput!,\n ) {\n subscriptionsUpdate (\n data: $data\n filter: $filter\n ) {\n id\n createdAt\n updatedAt\n displayName\n category\n sourceUrl\n enabled\n }\n}\n": types.UpdateSubscriptionsDocument,
|
"\n mutation UpdateSubscriptions(\n $data: SubscriptionsUpdateInput!,\n $filter: SubscriptionsFilterInput!,\n ) {\n subscriptionsUpdate (\n data: $data\n filter: $filter\n ) {\n id\n createdAt\n updatedAt\n displayName\n category\n sourceUrl\n enabled\n }\n}\n": types.UpdateSubscriptionsDocument,
|
||||||
"\n mutation DeleteSubscriptions($filter: SubscriptionsFilterInput) {\n subscriptionsDelete(filter: $filter)\n }\n": types.DeleteSubscriptionsDocument,
|
"\n mutation DeleteSubscriptions($filter: SubscriptionsFilterInput) {\n subscriptionsDelete(filter: $filter)\n }\n": types.DeleteSubscriptionsDocument,
|
||||||
"\nquery GetSubscriptionDetail ($id: Int!) {\n subscriptions(filter: { id: {\n eq: $id\n } }) {\n nodes {\n id\n subscriberId\n displayName\n createdAt\n updatedAt\n category\n sourceUrl\n enabled\n feed {\n nodes {\n id\n createdAt\n updatedAt\n token\n feedType\n feedSource\n }\n }\n subscriberTask {\n nodes {\n id\n taskType\n status\n }\n }\n credential3rd {\n id\n username\n }\n bangumi {\n nodes {\n createdAt\n updatedAt\n id\n mikanBangumiId\n displayName\n season\n seasonRaw\n fansub\n mikanFansubId\n rssLink\n posterLink\n homepage\n }\n }\n }\n }\n}\n": types.GetSubscriptionDetailDocument,
|
"\nquery GetSubscriptionDetail ($id: Int!) {\n subscriptions(filter: { id: {\n eq: $id\n } }) {\n nodes {\n id\n subscriberId\n displayName\n createdAt\n updatedAt\n category\n sourceUrl\n enabled\n feed {\n nodes {\n id\n createdAt\n updatedAt\n token\n feedType\n feedSource\n }\n }\n subscriberTask {\n nodes {\n id\n taskType\n status\n }\n }\n credential3rd {\n id\n username\n }\n bangumi {\n nodes {\n createdAt\n updatedAt\n id\n mikanBangumiId\n displayName\n season\n seasonRaw\n fansub\n mikanFansubId\n rssLink\n posterLink\n homepage\n }\n }\n }\n }\n}\n": types.GetSubscriptionDetailDocument,
|
||||||
"\n mutation SyncSubscriptionFeedsIncremental($data: SubscriberTasksInsertInput!) {\n subscriberTasksCreateOne(data: $data) {\n id\n }\n }\n": types.SyncSubscriptionFeedsIncrementalDocument,
|
|
||||||
"\n mutation SyncSubscriptionFeedsFull($filter: SubscriptionsFilterInput!) {\n subscriptionsSyncOneFeedsFull(filter: $filter) {\n id\n }\n }\n": types.SyncSubscriptionFeedsFullDocument,
|
|
||||||
"\n mutation SyncSubscriptionSources($filter: SubscriptionsFilterInput!) {\n subscriptionsSyncOneSources(filter: $filter) {\n id\n }\n }\n": types.SyncSubscriptionSourcesDocument,
|
|
||||||
"\n query GetTasks($filter: SubscriberTasksFilterInput!, $orderBy: SubscriberTasksOrderInput!, $pagination: PaginationInput!) {\n subscriberTasks(\n pagination: $pagination\n filter: $filter\n orderBy: $orderBy\n ) {\n nodes {\n id,\n job,\n taskType,\n status,\n attempts,\n maxAttempts,\n runAt,\n lastError,\n lockAt,\n lockBy,\n doneAt,\n priority\n }\n paginationInfo {\n total\n pages\n }\n }\n }\n": types.GetTasksDocument,
|
"\n query GetTasks($filter: SubscriberTasksFilterInput!, $orderBy: SubscriberTasksOrderInput!, $pagination: PaginationInput!) {\n subscriberTasks(\n pagination: $pagination\n filter: $filter\n orderBy: $orderBy\n ) {\n nodes {\n id,\n job,\n taskType,\n status,\n attempts,\n maxAttempts,\n runAt,\n lastError,\n lockAt,\n lockBy,\n doneAt,\n priority\n }\n paginationInfo {\n total\n pages\n }\n }\n }\n": types.GetTasksDocument,
|
||||||
|
"\n mutation InsertSubscriberTask($data: SubscriberTasksInsertInput!) {\n subscriberTasksCreateOne(data: $data) {\n id\n }\n }\n": types.InsertSubscriberTaskDocument,
|
||||||
"\n mutation DeleteTasks($filter: SubscriberTasksFilterInput!) {\n subscriberTasksDelete(filter: $filter)\n }\n": types.DeleteTasksDocument,
|
"\n mutation DeleteTasks($filter: SubscriberTasksFilterInput!) {\n subscriberTasksDelete(filter: $filter)\n }\n": types.DeleteTasksDocument,
|
||||||
"\n mutation RetryTasks($filter: SubscriberTasksFilterInput!) {\n subscriberTasksRetryOne(filter: $filter) {\n id,\n job,\n taskType,\n status,\n attempts,\n maxAttempts,\n runAt,\n lastError,\n lockAt,\n lockBy,\n doneAt,\n priority\n }\n }\n": types.RetryTasksDocument,
|
"\n mutation RetryTasks($filter: SubscriberTasksFilterInput!) {\n subscriberTasksRetryOne(filter: $filter) {\n id,\n job,\n taskType,\n status,\n attempts,\n maxAttempts,\n runAt,\n lastError,\n lockAt,\n lockBy,\n doneAt,\n priority\n }\n }\n": types.RetryTasksDocument,
|
||||||
};
|
};
|
||||||
@ -122,22 +118,14 @@ export function gql(source: "\n mutation DeleteSubscriptions($filter: Subscri
|
|||||||
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||||
*/
|
*/
|
||||||
export function gql(source: "\nquery GetSubscriptionDetail ($id: Int!) {\n subscriptions(filter: { id: {\n eq: $id\n } }) {\n nodes {\n id\n subscriberId\n displayName\n createdAt\n updatedAt\n category\n sourceUrl\n enabled\n feed {\n nodes {\n id\n createdAt\n updatedAt\n token\n feedType\n feedSource\n }\n }\n subscriberTask {\n nodes {\n id\n taskType\n status\n }\n }\n credential3rd {\n id\n username\n }\n bangumi {\n nodes {\n createdAt\n updatedAt\n id\n mikanBangumiId\n displayName\n season\n seasonRaw\n fansub\n mikanFansubId\n rssLink\n posterLink\n homepage\n }\n }\n }\n }\n}\n"): (typeof documents)["\nquery GetSubscriptionDetail ($id: Int!) {\n subscriptions(filter: { id: {\n eq: $id\n } }) {\n nodes {\n id\n subscriberId\n displayName\n createdAt\n updatedAt\n category\n sourceUrl\n enabled\n feed {\n nodes {\n id\n createdAt\n updatedAt\n token\n feedType\n feedSource\n }\n }\n subscriberTask {\n nodes {\n id\n taskType\n status\n }\n }\n credential3rd {\n id\n username\n }\n bangumi {\n nodes {\n createdAt\n updatedAt\n id\n mikanBangumiId\n displayName\n season\n seasonRaw\n fansub\n mikanFansubId\n rssLink\n posterLink\n homepage\n }\n }\n }\n }\n}\n"];
|
export function gql(source: "\nquery GetSubscriptionDetail ($id: Int!) {\n subscriptions(filter: { id: {\n eq: $id\n } }) {\n nodes {\n id\n subscriberId\n displayName\n createdAt\n updatedAt\n category\n sourceUrl\n enabled\n feed {\n nodes {\n id\n createdAt\n updatedAt\n token\n feedType\n feedSource\n }\n }\n subscriberTask {\n nodes {\n id\n taskType\n status\n }\n }\n credential3rd {\n id\n username\n }\n bangumi {\n nodes {\n createdAt\n updatedAt\n id\n mikanBangumiId\n displayName\n season\n seasonRaw\n fansub\n mikanFansubId\n rssLink\n posterLink\n homepage\n }\n }\n }\n }\n}\n"): (typeof documents)["\nquery GetSubscriptionDetail ($id: Int!) {\n subscriptions(filter: { id: {\n eq: $id\n } }) {\n nodes {\n id\n subscriberId\n displayName\n createdAt\n updatedAt\n category\n sourceUrl\n enabled\n feed {\n nodes {\n id\n createdAt\n updatedAt\n token\n feedType\n feedSource\n }\n }\n subscriberTask {\n nodes {\n id\n taskType\n status\n }\n }\n credential3rd {\n id\n username\n }\n bangumi {\n nodes {\n createdAt\n updatedAt\n id\n mikanBangumiId\n displayName\n season\n seasonRaw\n fansub\n mikanFansubId\n rssLink\n posterLink\n homepage\n }\n }\n }\n }\n}\n"];
|
||||||
/**
|
|
||||||
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
|
||||||
*/
|
|
||||||
export function gql(source: "\n mutation SyncSubscriptionFeedsIncremental($data: SubscriberTasksInsertInput!) {\n subscriberTasksCreateOne(data: $data) {\n id\n }\n }\n"): (typeof documents)["\n mutation SyncSubscriptionFeedsIncremental($data: SubscriberTasksInsertInput!) {\n subscriberTasksCreateOne(data: $data) {\n id\n }\n }\n"];
|
|
||||||
/**
|
|
||||||
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
|
||||||
*/
|
|
||||||
export function gql(source: "\n mutation SyncSubscriptionFeedsFull($filter: SubscriptionsFilterInput!) {\n subscriptionsSyncOneFeedsFull(filter: $filter) {\n id\n }\n }\n"): (typeof documents)["\n mutation SyncSubscriptionFeedsFull($filter: SubscriptionsFilterInput!) {\n subscriptionsSyncOneFeedsFull(filter: $filter) {\n id\n }\n }\n"];
|
|
||||||
/**
|
|
||||||
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
|
||||||
*/
|
|
||||||
export function gql(source: "\n mutation SyncSubscriptionSources($filter: SubscriptionsFilterInput!) {\n subscriptionsSyncOneSources(filter: $filter) {\n id\n }\n }\n"): (typeof documents)["\n mutation SyncSubscriptionSources($filter: SubscriptionsFilterInput!) {\n subscriptionsSyncOneSources(filter: $filter) {\n id\n }\n }\n"];
|
|
||||||
/**
|
/**
|
||||||
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||||
*/
|
*/
|
||||||
export function gql(source: "\n query GetTasks($filter: SubscriberTasksFilterInput!, $orderBy: SubscriberTasksOrderInput!, $pagination: PaginationInput!) {\n subscriberTasks(\n pagination: $pagination\n filter: $filter\n orderBy: $orderBy\n ) {\n nodes {\n id,\n job,\n taskType,\n status,\n attempts,\n maxAttempts,\n runAt,\n lastError,\n lockAt,\n lockBy,\n doneAt,\n priority\n }\n paginationInfo {\n total\n pages\n }\n }\n }\n"): (typeof documents)["\n query GetTasks($filter: SubscriberTasksFilterInput!, $orderBy: SubscriberTasksOrderInput!, $pagination: PaginationInput!) {\n subscriberTasks(\n pagination: $pagination\n filter: $filter\n orderBy: $orderBy\n ) {\n nodes {\n id,\n job,\n taskType,\n status,\n attempts,\n maxAttempts,\n runAt,\n lastError,\n lockAt,\n lockBy,\n doneAt,\n priority\n }\n paginationInfo {\n total\n pages\n }\n }\n }\n"];
|
export function gql(source: "\n query GetTasks($filter: SubscriberTasksFilterInput!, $orderBy: SubscriberTasksOrderInput!, $pagination: PaginationInput!) {\n subscriberTasks(\n pagination: $pagination\n filter: $filter\n orderBy: $orderBy\n ) {\n nodes {\n id,\n job,\n taskType,\n status,\n attempts,\n maxAttempts,\n runAt,\n lastError,\n lockAt,\n lockBy,\n doneAt,\n priority\n }\n paginationInfo {\n total\n pages\n }\n }\n }\n"): (typeof documents)["\n query GetTasks($filter: SubscriberTasksFilterInput!, $orderBy: SubscriberTasksOrderInput!, $pagination: PaginationInput!) {\n subscriberTasks(\n pagination: $pagination\n filter: $filter\n orderBy: $orderBy\n ) {\n nodes {\n id,\n job,\n taskType,\n status,\n attempts,\n maxAttempts,\n runAt,\n lastError,\n lockAt,\n lockBy,\n doneAt,\n priority\n }\n paginationInfo {\n total\n pages\n }\n }\n }\n"];
|
||||||
|
/**
|
||||||
|
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||||
|
*/
|
||||||
|
export function gql(source: "\n mutation InsertSubscriberTask($data: SubscriberTasksInsertInput!) {\n subscriberTasksCreateOne(data: $data) {\n id\n }\n }\n"): (typeof documents)["\n mutation InsertSubscriberTask($data: SubscriberTasksInsertInput!) {\n subscriberTasksCreateOne(data: $data) {\n id\n }\n }\n"];
|
||||||
/**
|
/**
|
||||||
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
* The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||||
*/
|
*/
|
||||||
|
@ -419,7 +419,6 @@ export type CronFilterInput = {
|
|||||||
export type CronInsertInput = {
|
export type CronInsertInput = {
|
||||||
cronExpr: Scalars['String']['input'];
|
cronExpr: Scalars['String']['input'];
|
||||||
enabled?: InputMaybe<Scalars['Boolean']['input']>;
|
enabled?: InputMaybe<Scalars['Boolean']['input']>;
|
||||||
id?: InputMaybe<Scalars['Int']['input']>;
|
|
||||||
maxAttempts?: InputMaybe<Scalars['Int']['input']>;
|
maxAttempts?: InputMaybe<Scalars['Int']['input']>;
|
||||||
subscriberTask?: InputMaybe<Scalars['Json']['input']>;
|
subscriberTask?: InputMaybe<Scalars['Json']['input']>;
|
||||||
timeoutMs?: InputMaybe<Scalars['Int']['input']>;
|
timeoutMs?: InputMaybe<Scalars['Int']['input']>;
|
||||||
@ -2183,27 +2182,6 @@ export type GetSubscriptionDetailQueryVariables = Exact<{
|
|||||||
|
|
||||||
export type GetSubscriptionDetailQuery = { __typename?: 'Query', subscriptions: { __typename?: 'SubscriptionsConnection', nodes: Array<{ __typename?: 'Subscriptions', id: number, subscriberId: number, displayName: string, createdAt: string, updatedAt: string, category: SubscriptionCategoryEnum, sourceUrl: string, enabled: boolean, feed: { __typename?: 'FeedsConnection', nodes: Array<{ __typename?: 'Feeds', id: number, createdAt: string, updatedAt: string, token: string, feedType: FeedTypeEnum, feedSource: FeedSourceEnum }> }, subscriberTask: { __typename?: 'SubscriberTasksConnection', nodes: Array<{ __typename?: 'SubscriberTasks', id: string, taskType: SubscriberTaskTypeEnum, status: SubscriberTaskStatusEnum }> }, credential3rd?: { __typename?: 'Credential3rd', id: number, username?: string | null } | null, bangumi: { __typename?: 'BangumiConnection', nodes: Array<{ __typename?: 'Bangumi', createdAt: string, updatedAt: string, id: number, mikanBangumiId?: string | null, displayName: string, season: number, seasonRaw?: string | null, fansub?: string | null, mikanFansubId?: string | null, rssLink?: string | null, posterLink?: string | null, homepage?: string | null }> } }> } };
|
export type GetSubscriptionDetailQuery = { __typename?: 'Query', subscriptions: { __typename?: 'SubscriptionsConnection', nodes: Array<{ __typename?: 'Subscriptions', id: number, subscriberId: number, displayName: string, createdAt: string, updatedAt: string, category: SubscriptionCategoryEnum, sourceUrl: string, enabled: boolean, feed: { __typename?: 'FeedsConnection', nodes: Array<{ __typename?: 'Feeds', id: number, createdAt: string, updatedAt: string, token: string, feedType: FeedTypeEnum, feedSource: FeedSourceEnum }> }, subscriberTask: { __typename?: 'SubscriberTasksConnection', nodes: Array<{ __typename?: 'SubscriberTasks', id: string, taskType: SubscriberTaskTypeEnum, status: SubscriberTaskStatusEnum }> }, credential3rd?: { __typename?: 'Credential3rd', id: number, username?: string | null } | null, bangumi: { __typename?: 'BangumiConnection', nodes: Array<{ __typename?: 'Bangumi', createdAt: string, updatedAt: string, id: number, mikanBangumiId?: string | null, displayName: string, season: number, seasonRaw?: string | null, fansub?: string | null, mikanFansubId?: string | null, rssLink?: string | null, posterLink?: string | null, homepage?: string | null }> } }> } };
|
||||||
|
|
||||||
export type SyncSubscriptionFeedsIncrementalMutationVariables = Exact<{
|
|
||||||
data: SubscriberTasksInsertInput;
|
|
||||||
}>;
|
|
||||||
|
|
||||||
|
|
||||||
export type SyncSubscriptionFeedsIncrementalMutation = { __typename?: 'Mutation', subscriberTasksCreateOne: { __typename?: 'SubscriberTasksBasic', id: string } };
|
|
||||||
|
|
||||||
export type SyncSubscriptionFeedsFullMutationVariables = Exact<{
|
|
||||||
filter: SubscriptionsFilterInput;
|
|
||||||
}>;
|
|
||||||
|
|
||||||
|
|
||||||
export type SyncSubscriptionFeedsFullMutation = { __typename?: 'Mutation', subscriptionsSyncOneFeedsFull: { __typename?: 'SubscriberTasksBasic', id: string } };
|
|
||||||
|
|
||||||
export type SyncSubscriptionSourcesMutationVariables = Exact<{
|
|
||||||
filter: SubscriptionsFilterInput;
|
|
||||||
}>;
|
|
||||||
|
|
||||||
|
|
||||||
export type SyncSubscriptionSourcesMutation = { __typename?: 'Mutation', subscriptionsSyncOneSources: { __typename?: 'SubscriberTasksBasic', id: string } };
|
|
||||||
|
|
||||||
export type GetTasksQueryVariables = Exact<{
|
export type GetTasksQueryVariables = Exact<{
|
||||||
filter: SubscriberTasksFilterInput;
|
filter: SubscriberTasksFilterInput;
|
||||||
orderBy: SubscriberTasksOrderInput;
|
orderBy: SubscriberTasksOrderInput;
|
||||||
@ -2213,6 +2191,13 @@ export type GetTasksQueryVariables = Exact<{
|
|||||||
|
|
||||||
export type GetTasksQuery = { __typename?: 'Query', subscriberTasks: { __typename?: 'SubscriberTasksConnection', nodes: Array<{ __typename?: 'SubscriberTasks', id: string, job: any, taskType: SubscriberTaskTypeEnum, status: SubscriberTaskStatusEnum, attempts: number, maxAttempts: number, runAt: string, lastError?: string | null, lockAt?: string | null, lockBy?: string | null, doneAt?: string | null, priority: number }>, paginationInfo?: { __typename?: 'PaginationInfo', total: number, pages: number } | null } };
|
export type GetTasksQuery = { __typename?: 'Query', subscriberTasks: { __typename?: 'SubscriberTasksConnection', nodes: Array<{ __typename?: 'SubscriberTasks', id: string, job: any, taskType: SubscriberTaskTypeEnum, status: SubscriberTaskStatusEnum, attempts: number, maxAttempts: number, runAt: string, lastError?: string | null, lockAt?: string | null, lockBy?: string | null, doneAt?: string | null, priority: number }>, paginationInfo?: { __typename?: 'PaginationInfo', total: number, pages: number } | null } };
|
||||||
|
|
||||||
|
export type InsertSubscriberTaskMutationVariables = Exact<{
|
||||||
|
data: SubscriberTasksInsertInput;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
|
||||||
|
export type InsertSubscriberTaskMutation = { __typename?: 'Mutation', subscriberTasksCreateOne: { __typename?: 'SubscriberTasksBasic', id: string } };
|
||||||
|
|
||||||
export type DeleteTasksMutationVariables = Exact<{
|
export type DeleteTasksMutationVariables = Exact<{
|
||||||
filter: SubscriberTasksFilterInput;
|
filter: SubscriberTasksFilterInput;
|
||||||
}>;
|
}>;
|
||||||
@ -2241,9 +2226,7 @@ export const InsertSubscriptionDocument = {"kind":"Document","definitions":[{"ki
|
|||||||
export const UpdateSubscriptionsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateSubscriptions"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"data"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SubscriptionsUpdateInput"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"filter"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SubscriptionsFilterInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"subscriptionsUpdate"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"data"},"value":{"kind":"Variable","name":{"kind":"Name","value":"data"}}},{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"filter"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"displayName"}},{"kind":"Field","name":{"kind":"Name","value":"category"}},{"kind":"Field","name":{"kind":"Name","value":"sourceUrl"}},{"kind":"Field","name":{"kind":"Name","value":"enabled"}}]}}]}}]} as unknown as DocumentNode<UpdateSubscriptionsMutation, UpdateSubscriptionsMutationVariables>;
|
export const UpdateSubscriptionsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateSubscriptions"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"data"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SubscriptionsUpdateInput"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"filter"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SubscriptionsFilterInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"subscriptionsUpdate"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"data"},"value":{"kind":"Variable","name":{"kind":"Name","value":"data"}}},{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"filter"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"displayName"}},{"kind":"Field","name":{"kind":"Name","value":"category"}},{"kind":"Field","name":{"kind":"Name","value":"sourceUrl"}},{"kind":"Field","name":{"kind":"Name","value":"enabled"}}]}}]}}]} as unknown as DocumentNode<UpdateSubscriptionsMutation, UpdateSubscriptionsMutationVariables>;
|
||||||
export const DeleteSubscriptionsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteSubscriptions"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"filter"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"SubscriptionsFilterInput"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"subscriptionsDelete"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"filter"}}}]}]}}]} as unknown as DocumentNode<DeleteSubscriptionsMutation, DeleteSubscriptionsMutationVariables>;
|
export const DeleteSubscriptionsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteSubscriptions"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"filter"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"SubscriptionsFilterInput"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"subscriptionsDelete"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"filter"}}}]}]}}]} as unknown as DocumentNode<DeleteSubscriptionsMutation, DeleteSubscriptionsMutationVariables>;
|
||||||
export const GetSubscriptionDetailDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetSubscriptionDetail"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"subscriptions"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"id"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"nodes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"subscriberId"}},{"kind":"Field","name":{"kind":"Name","value":"displayName"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"category"}},{"kind":"Field","name":{"kind":"Name","value":"sourceUrl"}},{"kind":"Field","name":{"kind":"Name","value":"enabled"}},{"kind":"Field","name":{"kind":"Name","value":"feed"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"nodes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"token"}},{"kind":"Field","name":{"kind":"Name","value":"feedType"}},{"kind":"Field","name":{"kind":"Name","value":"feedSource"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"subscriberTask"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"nodes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"taskType"}},{"kind":"Field","name":{"kind":"Name","value":"status"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"credential3rd"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"username"}}]}},{"kind":"Field","name":{"kind":"Name","value":"bangumi"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"nodes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"mikanBangumiId"}},{"kind":"Field","name":{"kind":"Name","value":"displayName"}},{"kind":"Field","name":{"kind":"Name","value":"season"}},{"kind":"Field","name":{"kind":"Name","value":"seasonRaw"}},{"kind":"Field","name":{"kind":"Name","value":"fansub"}},{"kind":"Field","name":{"kind":"Name","value":"mikanFansubId"}},{"kind":"Field","name":{"kind":"Name","value":"rssLink"}},{"kind":"Field","name":{"kind":"Name","value":"posterLink"}},{"kind":"Field","name":{"kind":"Name","value":"homepage"}}]}}]}}]}}]}}]}}]} as unknown as DocumentNode<GetSubscriptionDetailQuery, GetSubscriptionDetailQueryVariables>;
|
export const GetSubscriptionDetailDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetSubscriptionDetail"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"subscriptions"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"id"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"nodes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"subscriberId"}},{"kind":"Field","name":{"kind":"Name","value":"displayName"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"category"}},{"kind":"Field","name":{"kind":"Name","value":"sourceUrl"}},{"kind":"Field","name":{"kind":"Name","value":"enabled"}},{"kind":"Field","name":{"kind":"Name","value":"feed"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"nodes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"token"}},{"kind":"Field","name":{"kind":"Name","value":"feedType"}},{"kind":"Field","name":{"kind":"Name","value":"feedSource"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"subscriberTask"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"nodes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"taskType"}},{"kind":"Field","name":{"kind":"Name","value":"status"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"credential3rd"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"username"}}]}},{"kind":"Field","name":{"kind":"Name","value":"bangumi"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"nodes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"mikanBangumiId"}},{"kind":"Field","name":{"kind":"Name","value":"displayName"}},{"kind":"Field","name":{"kind":"Name","value":"season"}},{"kind":"Field","name":{"kind":"Name","value":"seasonRaw"}},{"kind":"Field","name":{"kind":"Name","value":"fansub"}},{"kind":"Field","name":{"kind":"Name","value":"mikanFansubId"}},{"kind":"Field","name":{"kind":"Name","value":"rssLink"}},{"kind":"Field","name":{"kind":"Name","value":"posterLink"}},{"kind":"Field","name":{"kind":"Name","value":"homepage"}}]}}]}}]}}]}}]}}]} as unknown as DocumentNode<GetSubscriptionDetailQuery, GetSubscriptionDetailQueryVariables>;
|
||||||
export const SyncSubscriptionFeedsIncrementalDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"SyncSubscriptionFeedsIncremental"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"data"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SubscriberTasksInsertInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"subscriberTasksCreateOne"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"data"},"value":{"kind":"Variable","name":{"kind":"Name","value":"data"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode<SyncSubscriptionFeedsIncrementalMutation, SyncSubscriptionFeedsIncrementalMutationVariables>;
|
|
||||||
export const SyncSubscriptionFeedsFullDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"SyncSubscriptionFeedsFull"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"filter"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SubscriptionsFilterInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"subscriptionsSyncOneFeedsFull"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"filter"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode<SyncSubscriptionFeedsFullMutation, SyncSubscriptionFeedsFullMutationVariables>;
|
|
||||||
export const SyncSubscriptionSourcesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"SyncSubscriptionSources"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"filter"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SubscriptionsFilterInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"subscriptionsSyncOneSources"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"filter"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode<SyncSubscriptionSourcesMutation, SyncSubscriptionSourcesMutationVariables>;
|
|
||||||
export const GetTasksDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetTasks"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"filter"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SubscriberTasksFilterInput"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"orderBy"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SubscriberTasksOrderInput"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"pagination"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"PaginationInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"subscriberTasks"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"pagination"},"value":{"kind":"Variable","name":{"kind":"Name","value":"pagination"}}},{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"filter"}}},{"kind":"Argument","name":{"kind":"Name","value":"orderBy"},"value":{"kind":"Variable","name":{"kind":"Name","value":"orderBy"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"nodes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"job"}},{"kind":"Field","name":{"kind":"Name","value":"taskType"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"attempts"}},{"kind":"Field","name":{"kind":"Name","value":"maxAttempts"}},{"kind":"Field","name":{"kind":"Name","value":"runAt"}},{"kind":"Field","name":{"kind":"Name","value":"lastError"}},{"kind":"Field","name":{"kind":"Name","value":"lockAt"}},{"kind":"Field","name":{"kind":"Name","value":"lockBy"}},{"kind":"Field","name":{"kind":"Name","value":"doneAt"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}}]}},{"kind":"Field","name":{"kind":"Name","value":"paginationInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"pages"}}]}}]}}]}}]} as unknown as DocumentNode<GetTasksQuery, GetTasksQueryVariables>;
|
export const GetTasksDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetTasks"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"filter"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SubscriberTasksFilterInput"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"orderBy"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SubscriberTasksOrderInput"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"pagination"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"PaginationInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"subscriberTasks"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"pagination"},"value":{"kind":"Variable","name":{"kind":"Name","value":"pagination"}}},{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"filter"}}},{"kind":"Argument","name":{"kind":"Name","value":"orderBy"},"value":{"kind":"Variable","name":{"kind":"Name","value":"orderBy"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"nodes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"job"}},{"kind":"Field","name":{"kind":"Name","value":"taskType"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"attempts"}},{"kind":"Field","name":{"kind":"Name","value":"maxAttempts"}},{"kind":"Field","name":{"kind":"Name","value":"runAt"}},{"kind":"Field","name":{"kind":"Name","value":"lastError"}},{"kind":"Field","name":{"kind":"Name","value":"lockAt"}},{"kind":"Field","name":{"kind":"Name","value":"lockBy"}},{"kind":"Field","name":{"kind":"Name","value":"doneAt"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}}]}},{"kind":"Field","name":{"kind":"Name","value":"paginationInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"pages"}}]}}]}}]}}]} as unknown as DocumentNode<GetTasksQuery, GetTasksQueryVariables>;
|
||||||
|
export const InsertSubscriberTaskDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"InsertSubscriberTask"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"data"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SubscriberTasksInsertInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"subscriberTasksCreateOne"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"data"},"value":{"kind":"Variable","name":{"kind":"Name","value":"data"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode<InsertSubscriberTaskMutation, InsertSubscriberTaskMutationVariables>;
|
||||||
export const DeleteTasksDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteTasks"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"filter"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SubscriberTasksFilterInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"subscriberTasksDelete"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"filter"}}}]}]}}]} as unknown as DocumentNode<DeleteTasksMutation, DeleteTasksMutationVariables>;
|
export const DeleteTasksDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteTasks"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"filter"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SubscriberTasksFilterInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"subscriberTasksDelete"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"filter"}}}]}]}}]} as unknown as DocumentNode<DeleteTasksMutation, DeleteTasksMutationVariables>;
|
||||||
export const RetryTasksDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"RetryTasks"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"filter"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SubscriberTasksFilterInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"subscriberTasksRetryOne"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"filter"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"job"}},{"kind":"Field","name":{"kind":"Name","value":"taskType"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"attempts"}},{"kind":"Field","name":{"kind":"Name","value":"maxAttempts"}},{"kind":"Field","name":{"kind":"Name","value":"runAt"}},{"kind":"Field","name":{"kind":"Name","value":"lastError"}},{"kind":"Field","name":{"kind":"Name","value":"lockAt"}},{"kind":"Field","name":{"kind":"Name","value":"lockBy"}},{"kind":"Field","name":{"kind":"Name","value":"doneAt"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}}]}}]}}]} as unknown as DocumentNode<RetryTasksMutation, RetryTasksMutationVariables>;
|
export const RetryTasksDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"RetryTasks"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"filter"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SubscriberTasksFilterInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"subscriberTasksRetryOne"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"filter"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"job"}},{"kind":"Field","name":{"kind":"Name","value":"taskType"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"attempts"}},{"kind":"Field","name":{"kind":"Name","value":"maxAttempts"}},{"kind":"Field","name":{"kind":"Name","value":"runAt"}},{"kind":"Field","name":{"kind":"Name","value":"lastError"}},{"kind":"Field","name":{"kind":"Name","value":"lockAt"}},{"kind":"Field","name":{"kind":"Name","value":"lockBy"}},{"kind":"Field","name":{"kind":"Name","value":"doneAt"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}}]}}]}}]} as unknown as DocumentNode<RetryTasksMutation, RetryTasksMutationVariables>;
|
@ -6,19 +6,11 @@ import {
|
|||||||
DialogTitle,
|
DialogTitle,
|
||||||
} from '@/components/ui/dialog';
|
} from '@/components/ui/dialog';
|
||||||
import { Spinner } from '@/components/ui/spinner';
|
import { Spinner } from '@/components/ui/spinner';
|
||||||
|
import { INSERT_SUBSCRIBER_TASK } from '@/domains/recorder/schema/tasks';
|
||||||
import {
|
import {
|
||||||
SYNC_SUBSCRIPTION_FEEDS_FULL,
|
type InsertSubscriberTaskMutation,
|
||||||
SYNC_SUBSCRIPTION_FEEDS_INCREMENTAL,
|
type InsertSubscriberTaskMutationVariables,
|
||||||
SYNC_SUBSCRIPTION_SOURCES,
|
|
||||||
} from '@/domains/recorder/schema/subscriptions';
|
|
||||||
import {
|
|
||||||
SubscriberTaskTypeEnum,
|
SubscriberTaskTypeEnum,
|
||||||
type SyncSubscriptionFeedsFullMutation,
|
|
||||||
type SyncSubscriptionFeedsFullMutationVariables,
|
|
||||||
type SyncSubscriptionFeedsIncrementalMutation,
|
|
||||||
type SyncSubscriptionFeedsIncrementalMutationVariables,
|
|
||||||
type SyncSubscriptionSourcesMutation,
|
|
||||||
type SyncSubscriptionSourcesMutationVariables,
|
|
||||||
} from '@/infra/graphql/gql/graphql';
|
} from '@/infra/graphql/gql/graphql';
|
||||||
import { useMutation } from '@apollo/client';
|
import { useMutation } from '@apollo/client';
|
||||||
import { useNavigate } from '@tanstack/react-router';
|
import { useNavigate } from '@tanstack/react-router';
|
||||||
@ -37,11 +29,10 @@ export interface SubscriptionSyncViewProps {
|
|||||||
|
|
||||||
export const SubscriptionSyncView = memo(
|
export const SubscriptionSyncView = memo(
|
||||||
({ id, onComplete }: SubscriptionSyncViewProps) => {
|
({ id, onComplete }: SubscriptionSyncViewProps) => {
|
||||||
const [syncSubscriptionFeedsIncremental, { loading: loadingIncremental }] =
|
const [insertSubscriberTask, { loading: loadingInsert }] = useMutation<
|
||||||
useMutation<
|
InsertSubscriberTaskMutation,
|
||||||
SyncSubscriptionFeedsIncrementalMutation,
|
InsertSubscriberTaskMutationVariables
|
||||||
SyncSubscriptionFeedsIncrementalMutationVariables
|
>(INSERT_SUBSCRIBER_TASK, {
|
||||||
>(SYNC_SUBSCRIPTION_FEEDS_INCREMENTAL, {
|
|
||||||
onCompleted: (data) => {
|
onCompleted: (data) => {
|
||||||
toast.success('Sync completed');
|
toast.success('Sync completed');
|
||||||
onComplete(data.subscriberTasksCreateOne);
|
onComplete(data.subscriberTasksCreateOne);
|
||||||
@ -53,37 +44,7 @@ export const SubscriptionSyncView = memo(
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const [syncSubscriptionFeedsFull, { loading: loadingFull }] = useMutation<
|
const loading = loadingInsert;
|
||||||
SyncSubscriptionFeedsFullMutation,
|
|
||||||
SyncSubscriptionFeedsFullMutationVariables
|
|
||||||
>(SYNC_SUBSCRIPTION_FEEDS_FULL, {
|
|
||||||
onCompleted: (data) => {
|
|
||||||
toast.success('Sync completed');
|
|
||||||
onComplete(data.subscriptionsSyncOneFeedsFull);
|
|
||||||
},
|
|
||||||
onError: (error) => {
|
|
||||||
toast.error('Failed to sync subscription', {
|
|
||||||
description: error.message,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const [syncSubscriptionSources, { loading: loadingSources }] = useMutation<
|
|
||||||
SyncSubscriptionSourcesMutation,
|
|
||||||
SyncSubscriptionSourcesMutationVariables
|
|
||||||
>(SYNC_SUBSCRIPTION_SOURCES, {
|
|
||||||
onCompleted: (data) => {
|
|
||||||
toast.success('Sync completed');
|
|
||||||
onComplete(data.subscriptionsSyncOneSources);
|
|
||||||
},
|
|
||||||
onError: (error) => {
|
|
||||||
toast.error('Failed to sync subscription', {
|
|
||||||
description: error.message,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const loading = loadingIncremental || loadingFull || loadingSources;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col gap-2">
|
<div className="flex flex-col gap-2">
|
||||||
@ -91,8 +52,15 @@ export const SubscriptionSyncView = memo(
|
|||||||
size="lg"
|
size="lg"
|
||||||
variant="outline"
|
variant="outline"
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
syncSubscriptionSources({
|
insertSubscriberTask({
|
||||||
variables: { filter: { id: { eq: id } } },
|
variables: {
|
||||||
|
data: {
|
||||||
|
job: {
|
||||||
|
subscriptionId: id,
|
||||||
|
taskType: SubscriberTaskTypeEnum.SyncOneSubscriptionSources,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
@ -103,11 +71,11 @@ export const SubscriptionSyncView = memo(
|
|||||||
size="lg"
|
size="lg"
|
||||||
variant="outline"
|
variant="outline"
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
syncSubscriptionFeedsIncremental({
|
insertSubscriberTask({
|
||||||
variables: {
|
variables: {
|
||||||
data: {
|
data: {
|
||||||
job: {
|
job: {
|
||||||
subscriberId: id,
|
subscriptionId: id,
|
||||||
taskType:
|
taskType:
|
||||||
SubscriberTaskTypeEnum.SyncOneSubscriptionFeedsIncremental,
|
SubscriberTaskTypeEnum.SyncOneSubscriptionFeedsIncremental,
|
||||||
},
|
},
|
||||||
@ -123,8 +91,16 @@ export const SubscriptionSyncView = memo(
|
|||||||
size="lg"
|
size="lg"
|
||||||
variant="outline"
|
variant="outline"
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
syncSubscriptionFeedsFull({
|
insertSubscriberTask({
|
||||||
variables: { filter: { id: { eq: id } } },
|
variables: {
|
||||||
|
data: {
|
||||||
|
job: {
|
||||||
|
subscriptionId: id,
|
||||||
|
taskType:
|
||||||
|
SubscriberTaskTypeEnum.SyncOneSubscriptionFeedsFull,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
|
@ -11,5 +11,10 @@
|
|||||||
"@/*": ["./src/*"]
|
"@/*": ["./src/*"]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"include": ["src"]
|
"include": ["src"],
|
||||||
|
"references": [
|
||||||
|
{
|
||||||
|
"path": "../../apps/recorder"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
4
justfile
4
justfile
@ -11,8 +11,8 @@ prepare-dev-testcontainers:
|
|||||||
docker pull ghcr.io/dumtruck/konobangu-testing-torrents:latest
|
docker pull ghcr.io/dumtruck/konobangu-testing-torrents:latest
|
||||||
docker pull postgres:17-alpine
|
docker pull postgres:17-alpine
|
||||||
|
|
||||||
dev-optimize-images:
|
export-recorder-ts-bindings:
|
||||||
npx -y zx apps/recorder/examples/optimize_image.mjs
|
cargo test export_bindings -p recorder
|
||||||
|
|
||||||
dev-webui:
|
dev-webui:
|
||||||
pnpm run --filter=webui dev
|
pnpm run --filter=webui dev
|
||||||
|
@ -2,10 +2,15 @@ extern crate proc_macro;
|
|||||||
|
|
||||||
use convert_case::{Case, Casing};
|
use convert_case::{Case, Casing};
|
||||||
use darling::{FromDeriveInput, FromField, ast::Data, util::Ignored};
|
use darling::{FromDeriveInput, FromField, ast::Data, util::Ignored};
|
||||||
|
use heck::ToLowerCamelCase;
|
||||||
use proc_macro::TokenStream;
|
use proc_macro::TokenStream;
|
||||||
use quote::{format_ident, quote};
|
use proc_macro_crate::{FoundCrate, crate_name};
|
||||||
|
use proc_macro2::{Ident, Span, TokenStream};
|
||||||
|
use quote::{format_ident, quote, quote_spanned};
|
||||||
use syn::{Attribute, DeriveInput, Generics, Ident, parse_macro_input};
|
use syn::{Attribute, DeriveInput, Generics, Ident, parse_macro_input};
|
||||||
|
|
||||||
|
use crate::derives::attributes::related_attr;
|
||||||
|
|
||||||
#[derive(snafu::Snafu, Debug)]
|
#[derive(snafu::Snafu, Debug)]
|
||||||
enum GeneratorError {
|
enum GeneratorError {
|
||||||
#[snafu(transparent)]
|
#[snafu(transparent)]
|
||||||
@ -160,3 +165,135 @@ pub fn derive_dynamic_graphql(input: TokenStream) -> TokenStream {
|
|||||||
Err(err) => err.write_errors().into(),
|
Err(err) => err.write_errors().into(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum Error {
|
||||||
|
InputNotEnum,
|
||||||
|
InvalidEntityPath,
|
||||||
|
Syn(syn::Error),
|
||||||
|
}
|
||||||
|
|
||||||
|
struct DeriveRelatedEntity {
|
||||||
|
entity_ident: TokenStream,
|
||||||
|
ident: syn::Ident,
|
||||||
|
variants: syn::punctuated::Punctuated<syn::Variant, syn::token::Comma>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DeriveRelatedEntity {
|
||||||
|
fn new(input: syn::DeriveInput) -> Result<Self, Error> {
|
||||||
|
let sea_attr = related_attr::SeaOrm::try_from_attributes(&input.attrs)
|
||||||
|
.map_err(Error::Syn)?
|
||||||
|
.unwrap_or_default();
|
||||||
|
|
||||||
|
let ident = input.ident;
|
||||||
|
let entity_ident = match sea_attr.entity.as_ref().map(Self::parse_lit_string) {
|
||||||
|
Some(entity_ident) => entity_ident.map_err(|_| Error::InvalidEntityPath)?,
|
||||||
|
None => quote! { Entity },
|
||||||
|
};
|
||||||
|
|
||||||
|
let variants = match input.data {
|
||||||
|
syn::Data::Enum(syn::DataEnum { variants, .. }) => variants,
|
||||||
|
_ => return Err(Error::InputNotEnum),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(DeriveRelatedEntity {
|
||||||
|
entity_ident,
|
||||||
|
ident,
|
||||||
|
variants,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn expand(&self) -> syn::Result<TokenStream> {
|
||||||
|
let ident = &self.ident;
|
||||||
|
let entity_ident = &self.entity_ident;
|
||||||
|
|
||||||
|
let variant_implementations: Vec<TokenStream> = self
|
||||||
|
.variants
|
||||||
|
.iter()
|
||||||
|
.map(|variant| {
|
||||||
|
let attr = related_attr::SeaOrm::from_attributes(&variant.attrs)?;
|
||||||
|
|
||||||
|
let enum_name = &variant.ident;
|
||||||
|
|
||||||
|
let target_entity = attr
|
||||||
|
.entity
|
||||||
|
.as_ref()
|
||||||
|
.map(Self::parse_lit_string)
|
||||||
|
.ok_or_else(|| {
|
||||||
|
syn::Error::new_spanned(variant, "Missing value for 'entity'")
|
||||||
|
})??;
|
||||||
|
|
||||||
|
let def = match attr.def {
|
||||||
|
Some(def) => Some(Self::parse_lit_string(&def).map_err(|_| {
|
||||||
|
syn::Error::new_spanned(variant, "Missing value for 'def'")
|
||||||
|
})?),
|
||||||
|
None => None,
|
||||||
|
};
|
||||||
|
|
||||||
|
let name = enum_name.to_string().to_lower_camel_case();
|
||||||
|
|
||||||
|
if let Some(def) = def {
|
||||||
|
Result::<_, syn::Error>::Ok(quote! {
|
||||||
|
Self::#enum_name => builder.get_relation::<#entity_ident, #target_entity>(#name, #def)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
Result::<_, syn::Error>::Ok(quote! {
|
||||||
|
Self::#enum_name => via_builder.get_relation::<#entity_ident, #target_entity>(#name)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
.collect::<Result<Vec<_>, _>>()?;
|
||||||
|
|
||||||
|
// Get the path of the `async-graphql` on the application's Cargo.toml
|
||||||
|
let async_graphql_crate = match crate_name("async-graphql") {
|
||||||
|
// if found, use application's `async-graphql`
|
||||||
|
Ok(FoundCrate::Name(name)) => {
|
||||||
|
let ident = Ident::new(&name, Span::call_site());
|
||||||
|
quote! { #ident }
|
||||||
|
}
|
||||||
|
Ok(FoundCrate::Itself) => quote! { async_graphql },
|
||||||
|
// if not, then use the `async-graphql` re-exported by `seaography`
|
||||||
|
Err(_) => quote! { seaography::async_graphql },
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(quote! {
|
||||||
|
impl seaography::RelationBuilder for #ident {
|
||||||
|
fn get_relation(&self, context: & 'static seaography::BuilderContext) -> #async_graphql_crate::dynamic::Field {
|
||||||
|
let builder = seaography::EntityObjectRelationBuilder { context };
|
||||||
|
let via_builder = seaography::EntityObjectViaRelationBuilder { context };
|
||||||
|
match self {
|
||||||
|
#(#variant_implementations,)*
|
||||||
|
_ => panic!("No relations for this entity"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_lit_string(lit: &syn::Lit) -> syn::Result<TokenStream> {
|
||||||
|
match lit {
|
||||||
|
syn::Lit::Str(lit_str) => lit_str
|
||||||
|
.value()
|
||||||
|
.parse()
|
||||||
|
.map_err(|_| syn::Error::new_spanned(lit, "attribute not valid")),
|
||||||
|
_ => Err(syn::Error::new_spanned(lit, "attribute must be a string")),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Method to derive a Related enumeration
|
||||||
|
fn expand_derive_related_entity(input: syn::DeriveInput) -> syn::Result<TokenStream> {
|
||||||
|
let ident_span = input.ident.span();
|
||||||
|
|
||||||
|
match DeriveRelatedEntity::new(input) {
|
||||||
|
Ok(model) => model.expand(),
|
||||||
|
Err(Error::InputNotEnum) => Ok(quote_spanned! {
|
||||||
|
ident_span => compile_error!("you can only derive DeriveRelation on enums");
|
||||||
|
}),
|
||||||
|
Err(Error::InvalidEntityPath) => Ok(quote_spanned! {
|
||||||
|
ident_span => compile_error!("invalid attribute value for 'entity'");
|
||||||
|
}),
|
||||||
|
Err(Error::Syn(err)) => Err(err),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
5
pnpm-lock.yaml
generated
5
pnpm-lock.yaml
generated
@ -67,6 +67,8 @@ importers:
|
|||||||
specifier: ^2.9.99
|
specifier: ^2.9.99
|
||||||
version: 2.9.99
|
version: 2.9.99
|
||||||
|
|
||||||
|
apps/recorder: {}
|
||||||
|
|
||||||
apps/webui:
|
apps/webui:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@abraham/reflection':
|
'@abraham/reflection':
|
||||||
@ -249,6 +251,9 @@ importers:
|
|||||||
recharts:
|
recharts:
|
||||||
specifier: ^2.15.3
|
specifier: ^2.15.3
|
||||||
version: 2.15.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
|
version: 2.15.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
|
||||||
|
recorder:
|
||||||
|
specifier: workspace:*
|
||||||
|
version: link:../recorder
|
||||||
rxjs:
|
rxjs:
|
||||||
specifier: ^7.8.2
|
specifier: ^7.8.2
|
||||||
version: 7.8.2
|
version: 7.8.2
|
||||||
|
@ -4,9 +4,13 @@
|
|||||||
{
|
{
|
||||||
"path": "./apps/email-playground"
|
"path": "./apps/email-playground"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"path": "./apps/recorder"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "./apps/webui"
|
"path": "./apps/webui"
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"path": "./packages/email"
|
"path": "./packages/email"
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user