Skip to content

Commit

Permalink
feat: add custom_query_fields & custom_mutation_fields
Browse files Browse the repository at this point in the history
  • Loading branch information
YiNNx committed Nov 23, 2023
1 parent cbe8220 commit fa8ec51
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 1 deletion.
21 changes: 20 additions & 1 deletion src/builder.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
use async_graphql::{
dataloader::DataLoader,
dynamic::{Enum, Field, FieldFuture, InputObject, Object, Schema, SchemaBuilder, TypeRef},
dynamic::{
Enum, Field, FieldFuture, InputObject, InputValue, Object, Schema, SchemaBuilder, TypeRef,
},
};
use sea_orm::{ActiveEnum, ActiveModelTrait, EntityTrait, IntoActiveModel};

Expand Down Expand Up @@ -47,11 +49,28 @@ impl Builder {
/// Used to create a new Builder from the given configuration context
pub fn new(context: &'static BuilderContext, connection: sea_orm::DatabaseConnection) -> Self {
let query: Object = Object::new("Query");
let query = context.custom_query_fields.iter().fold(query, |query, f| {
query.field(Field::new(
f.name.clone(),
f.ty.clone(),
f.resolver_fn.as_ref(),
))
});
let mutation = Object::new("Mutation").field(Field::new(
"_ping",
TypeRef::named(TypeRef::STRING),
|_| FieldFuture::new(async move { Ok(Some(async_graphql::Value::from("pong"))) }),
));
let mutation = context
.custom_mutation_fields
.iter()
.fold(mutation, |mutation, f| {
let field = Field::new(f.name.clone(), f.ty.clone(), f.resolver_fn.as_ref());
let field = f.arguments.iter().fold(field, |field, arg| {
field.argument(InputValue::new(arg.name.clone(), arg.ty.clone()))
});
mutation.field(field)
});
let schema = Schema::build(query.type_name(), Some(mutation.type_name()), None);

Self {
Expand Down
21 changes: 21 additions & 0 deletions src/builder_context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use crate::{
FilterInputConfig, OffsetInputConfig, OrderByEnumConfig, OrderInputConfig,
PageInfoObjectConfig, PageInputConfig, PaginationInfoObjectConfig, PaginationInputConfig,
};
use async_graphql::dynamic::{FieldFuture, ResolverContext, TypeRef};

pub mod guards;
pub use guards::*;
Expand Down Expand Up @@ -52,4 +53,24 @@ pub struct BuilderContext {
pub filter_types: FilterTypesMapConfig,
// is_skipped function
// naming function
pub custom_query_fields: Vec<CustomQuery>,
pub custom_mutation_fields: Vec<CustomMutation>,
}

pub struct CustomQuery {
pub name: String,
pub ty: TypeRef,
pub resolver_fn: Box<dyn Fn(ResolverContext<'_>) -> FieldFuture<'_> + Send + Sync + 'static>,
}

pub struct CustomMutation {
pub name: String,
pub ty: TypeRef,
pub resolver_fn: Box<dyn Fn(ResolverContext<'_>) -> FieldFuture<'_> + Send + Sync + 'static>,
pub arguments: Vec<CustomMutationArgument>,
}

pub struct CustomMutationArgument {
pub name: String,
pub ty: TypeRef,
}

0 comments on commit fa8ec51

Please sign in to comment.