use std::sync::Arc; use async_graphql::dynamic::*; use once_cell::sync::OnceCell; use seaography::{Builder, BuilderContext}; use crate::{ app::AppContextTrait, graphql::{ domains::{ credential_3rd::register_credential3rd_to_schema_builder, crypto::register_crypto_to_schema_context, subscriber_tasks::{ register_subscriber_tasks_to_schema_builder, register_subscriber_tasks_to_schema_context, }, subscribers::{ register_subscribers_to_schema_builder, register_subscribers_to_schema_context, restrict_subscriber_for_entity, }, subscriptions::register_subscriptions_to_schema_builder, }, infra::json::register_jsonb_input_filter_to_schema_builder, }, }; pub static CONTEXT: OnceCell = OnceCell::new(); pub fn build_schema( app_ctx: Arc, depth: Option, complexity: Option, ) -> Result { use crate::models::*; let database = app_ctx.db().as_ref().clone(); let context = CONTEXT.get_or_init(|| { let mut context = BuilderContext::default(); { // domains register_subscribers_to_schema_context(&mut context); { restrict_subscriber_for_entity::( &mut context, &downloaders::Column::SubscriberId, ); restrict_subscriber_for_entity::( &mut context, &downloads::Column::SubscriberId, ); restrict_subscriber_for_entity::( &mut context, &episodes::Column::SubscriberId, ); restrict_subscriber_for_entity::( &mut context, &subscriptions::Column::SubscriberId, ); restrict_subscriber_for_entity::( &mut context, &subscribers::Column::Id, ); restrict_subscriber_for_entity::( &mut context, &subscription_bangumi::Column::SubscriberId, ); restrict_subscriber_for_entity::( &mut context, &subscription_episode::Column::SubscriberId, ); restrict_subscriber_for_entity::( &mut context, &credential_3rd::Column::SubscriberId, ); } register_crypto_to_schema_context(&mut context, app_ctx.clone()); register_subscriber_tasks_to_schema_context(&mut context); } context }); let mut builder = Builder::new(context, database.clone()); { // infra builder = register_jsonb_input_filter_to_schema_builder(builder); } { // domains builder = register_subscribers_to_schema_builder(builder); seaography::register_entities!( builder, [ bangumi, downloaders, downloads, episodes, subscription_bangumi, subscription_episode, subscriptions, credential_3rd ] ); { builder.register_enumeration::(); builder.register_enumeration::(); builder.register_enumeration::(); builder.register_enumeration::(); builder.register_enumeration::(); } builder = register_subscriptions_to_schema_builder(builder); builder = register_credential3rd_to_schema_builder(builder); builder = register_subscriber_tasks_to_schema_builder(builder); } let schema = builder.schema_builder(); let schema = if let Some(depth) = depth { schema.limit_depth(depth) } else { schema }; let schema = if let Some(complexity) = complexity { schema.limit_complexity(complexity) } else { schema }; schema .data(database) .data(app_ctx) .finish() .inspect_err(|e| tracing::error!(e = ?e)) }