11package com .intuit .graphql .orchestrator .batch ;
22
3- import static com .intuit .graphql .orchestrator .resolverdirective .FieldResolverDirectiveUtil .hasResolverDirective ;
4- import static com .intuit .graphql .orchestrator .utils .RenameDirectiveUtil .convertGraphqlFieldWithOriginalName ;
5- import static com .intuit .graphql .orchestrator .utils .RenameDirectiveUtil .getRenameKey ;
6- import static graphql .introspection .Introspection .TypeNameMetaFieldDef ;
7- import static graphql .schema .FieldCoordinates .coordinates ;
8- import static graphql .util .TreeTransformerUtil .changeNode ;
9- import static graphql .util .TreeTransformerUtil .deleteNode ;
10- import static java .util .Objects .requireNonNull ;
11-
123import com .intuit .graphql .orchestrator .federation .RequiredFieldsCollector ;
134import com .intuit .graphql .orchestrator .federation .metadata .FederationMetadata ;
145import com .intuit .graphql .orchestrator .schema .ServiceMetadata ;
156import com .intuit .graphql .orchestrator .schema .transform .FieldResolverContext ;
167import com .intuit .graphql .orchestrator .utils .SelectionCollector ;
8+ import graphql .GraphQLContext ;
9+ import graphql .language .Argument ;
10+ import graphql .language .BooleanValue ;
11+ import graphql .language .Directive ;
1712import graphql .language .Field ;
1813import graphql .language .FragmentDefinition ;
1914import graphql .language .InlineFragment ;
3025import graphql .schema .GraphQLUnionType ;
3126import graphql .util .TraversalControl ;
3227import graphql .util .TraverserContext ;
28+ import org .apache .commons .collections4 .CollectionUtils ;
29+ import org .apache .commons .collections4 .MapUtils ;
30+
3331import java .util .Collections ;
3432import java .util .List ;
3533import java .util .Map ;
3634import java .util .Objects ;
3735import java .util .Set ;
3836import java .util .stream .Collectors ;
39- import org .apache .commons .collections4 .CollectionUtils ;
40- import org .apache .commons .collections4 .MapUtils ;
37+
38+ import static com .intuit .graphql .orchestrator .resolverdirective .FieldResolverDirectiveUtil .hasResolverDirective ;
39+ import static com .intuit .graphql .orchestrator .utils .DirectivesUtil .DEFER_DIRECTIVE_NAME ;
40+ import static com .intuit .graphql .orchestrator .utils .DirectivesUtil .DEFER_IF_ARG ;
41+ import static com .intuit .graphql .orchestrator .utils .DirectivesUtil .USE_DEFER ;
42+ import static com .intuit .graphql .orchestrator .utils .RenameDirectiveUtil .convertGraphqlFieldWithOriginalName ;
43+ import static com .intuit .graphql .orchestrator .utils .RenameDirectiveUtil .getRenameKey ;
44+ import static graphql .introspection .Introspection .TypeNameMetaFieldDef ;
45+ import static graphql .schema .FieldCoordinates .coordinates ;
46+ import static graphql .util .TreeTransformerUtil .changeNode ;
47+ import static graphql .util .TreeTransformerUtil .deleteNode ;
48+ import static java .util .Objects .requireNonNull ;
4149
4250/**
4351 * This class modifies for query for a downstream provider.
@@ -59,18 +67,22 @@ public class DownstreamQueryModifier extends NodeVisitorStub {
5967 private final SelectionCollector selectionCollector ;
6068 private final GraphQLSchema graphQLSchema ;
6169
70+ private final GraphQLContext graphQLContext ;
71+
6272 public DownstreamQueryModifier (
63- GraphQLType rootType ,
64- ServiceMetadata serviceMetadata ,
65- Map <String , FragmentDefinition > fragmentsByName ,
66- GraphQLSchema graphQLSchema ) {
73+ GraphQLType rootType ,
74+ ServiceMetadata serviceMetadata ,
75+ Map <String , FragmentDefinition > fragmentsByName ,
76+ GraphQLSchema graphQLSchema ,
77+ GraphQLContext context ) {
6778 Objects .requireNonNull (rootType );
6879 Objects .requireNonNull (serviceMetadata );
6980 Objects .requireNonNull (fragmentsByName );
7081 this .rootType = rootType ;
7182 this .serviceMetadata = serviceMetadata ;
7283 this .selectionCollector = new SelectionCollector (fragmentsByName );
7384 this .graphQLSchema = graphQLSchema ;
85+ this .graphQLContext = context ;
7486 }
7587
7688 @ Override
@@ -85,6 +97,21 @@ public TraversalControl visitField(Field node, TraverserContext<Node> context) {
8597 }
8698 }
8799
100+ if (!node .getDirectives (DEFER_DIRECTIVE_NAME ).isEmpty ()) {
101+ Argument deferArg = node .getDirectives (DEFER_DIRECTIVE_NAME ).get (0 ).getArgument (DEFER_IF_ARG );
102+ if (graphQLContext .getOrDefault (USE_DEFER , false ) && (deferArg == null || ((BooleanValue )deferArg .getValue ()).isValue ())) {
103+ return deleteNode (context );
104+ } else {
105+ //remove directive from query since directive is not built in and will fail downstream if added
106+ List <Directive > directives = node .getDirectives ()
107+ .stream ()
108+ .filter (directive -> !DEFER_DIRECTIVE_NAME .equals (directive .getName ()))
109+ .collect (Collectors .toList ());
110+
111+ return changeNode (context , node .transform (builder -> builder .directives (directives )));
112+ }
113+ }
114+
88115 return TraversalControl .CONTINUE ;
89116 } else {
90117 GraphQLFieldsContainer parentType = context .getParentContext ().getVar (GraphQLType .class );
@@ -112,6 +139,21 @@ public TraversalControl visitField(Field node, TraverserContext<Node> context) {
112139 return changeNode (context , convertGraphqlFieldWithOriginalName (node , originalName ));
113140 }
114141 }
142+
143+ if (!node .getDirectives (DEFER_DIRECTIVE_NAME ).isEmpty ()) {
144+ Argument deferArg = node .getDirectives (DEFER_DIRECTIVE_NAME ).get (0 ).getArgument (DEFER_IF_ARG );
145+ if (graphQLContext .getOrDefault (USE_DEFER , false ) && (deferArg == null || ((BooleanValue )deferArg .getValue ()).isValue ())) {
146+ return deleteNode (context );
147+ } else {
148+ //remove directive from query since directive is not built in and will fail downstream if added
149+ List <Directive > directives = node .getDirectives ()
150+ .stream ()
151+ .filter (directive -> !DEFER_DIRECTIVE_NAME .equals (directive .getName ()))
152+ .collect (Collectors .toList ());
153+
154+ return changeNode (context , node .transform (builder -> builder .directives (directives )));
155+ }
156+ }
115157 return TraversalControl .CONTINUE ;
116158 }
117159 }
0 commit comments