Skip to content

Commit fa99742

Browse files
author
vkarthikeya
committed
hacktoberfest-2023 : Multiple resolver directive
1 parent 73eee1e commit fa99742

File tree

3 files changed

+88
-45
lines changed

3 files changed

+88
-45
lines changed

src/main/java/com/intuit/graphql/orchestrator/resolverdirective/FieldResolverDirectiveUtil.java

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.Objects;
2121
import java.util.Optional;
2222
import java.util.stream.Collectors;
23+
import java.util.stream.Stream;
2324

2425
import static com.intuit.graphql.orchestrator.resolverdirective.ResolverDirectiveDefinition.extractRequiredFieldsFrom;
2526
import static com.intuit.graphql.orchestrator.utils.XtextTypeUtils.getFieldDefinitions;
@@ -124,37 +125,35 @@ public static boolean isObjectOrInterfaceType(TypeDefinition typeDefinition) {
124125

125126
public static List<FieldResolverContext> createFieldResolverContexts(
126127
TypeDefinition typeDefinition, XtextGraph xtextGraph) {
127-
128128
List<FieldDefinition> childFields = getFieldDefinitions(typeDefinition);
129-
return childFields.stream()
130-
.map(childFieldDefinition -> {
131-
List<Directive> directives = getResolverDirective(childFieldDefinition);
132-
133-
if (CollectionUtils.size(directives) > 1) {
134-
throw new MultipleResolverDirectiveDefinition(CollectionUtils.size(directives));
135-
}
136-
137-
if (CollectionUtils.size(directives) < 1) {
138-
return Optional.<FieldResolverContext>empty();
139-
}
140-
141-
ResolverDirectiveDefinition resolverDirectiveDefinition = ResolverDirectiveDefinition.from(directives.get(0));
142-
143-
FieldResolverContext fieldResolverContext = FieldResolverContext.builder()
144-
//.fieldContext(new FieldContext(typeDefinition.getName(), childFieldDefinition.getName()))
145-
.fieldDefinition(childFieldDefinition)
146-
.parentTypeDefinition(typeDefinition)
147-
.requiresTypeNameInjection(xtextGraph.requiresTypenameInjection())
148-
.serviceNamespace(xtextGraph.getServiceProvider().getNameSpace())
149-
.resolverDirectiveDefinition(resolverDirectiveDefinition)
150-
.requiredFields(extractRequiredFieldsFrom(resolverDirectiveDefinition))
151-
.build();
152-
153-
return Optional.of(fieldResolverContext);
154-
})
155-
.filter(Optional::isPresent)
156-
.map(Optional::get)
157-
.collect(Collectors.toList());
129+
130+
List<FieldResolverContext> contexts = childFields.stream()
131+
.flatMap(childFieldDefinition -> {
132+
List<Directive> directives = getResolverDirective(childFieldDefinition);
133+
134+
if (CollectionUtils.size(directives) < 1) {
135+
return Stream.empty();
136+
}
137+
138+
return directives.stream().map(directive -> {
139+
ResolverDirectiveDefinition resolverDirectiveDefinition = ResolverDirectiveDefinition.from(directive);
140+
141+
FieldResolverContext fieldResolverContext = FieldResolverContext.builder()
142+
//.fieldContext(new FieldContext(typeDefinition.getName(), childFieldDefinition.getName()))
143+
.fieldDefinition(childFieldDefinition)
144+
.parentTypeDefinition(typeDefinition)
145+
.requiresTypeNameInjection(xtextGraph.requiresTypenameInjection())
146+
.serviceNamespace(xtextGraph.getServiceProvider().getNameSpace())
147+
.resolverDirectiveDefinition(resolverDirectiveDefinition)
148+
.requiredFields(extractRequiredFieldsFrom(resolverDirectiveDefinition))
149+
.build();
150+
151+
return fieldResolverContext;
152+
});
153+
})
154+
.collect(Collectors.toList());
155+
156+
return contexts;
158157
}
159158

160159
private static List<Directive> getResolverDirective(FieldDefinition fieldDefinition) {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.intuit.graphql.orchestrator.resolverdirective;
2+
3+
public class InvalidDirectivePairingException extends ResolverDirectiveException {
4+
5+
private static final String ERR_MSG = "Field %s in container type %s with resolver directive not allowed "
6+
+ "to have argument definitions.";
7+
8+
public InvalidDirectivePairingException(String fieldName, String containerName) {
9+
super(String.format(ERR_MSG, fieldName, containerName));
10+
}
11+
}

src/main/java/com/intuit/graphql/orchestrator/schema/transform/FieldResolverTransformerPreMerge.java

Lines changed: 48 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,19 @@
33
import static com.intuit.graphql.orchestrator.resolverdirective.FieldResolverDirectiveUtil.canContainFieldResolverDirective;
44
import static com.intuit.graphql.orchestrator.resolverdirective.FieldResolverDirectiveUtil.createFieldResolverContexts;
55

6+
import com.intuit.graphql.graphQL.Directive;
67
import com.intuit.graphql.graphQL.FieldDefinition;
78
import com.intuit.graphql.orchestrator.resolverdirective.ArgumentDefinitionNotAllowed;
89
import com.intuit.graphql.orchestrator.resolverdirective.FieldResolverDirectiveUtil;
10+
import com.intuit.graphql.orchestrator.resolverdirective.InvalidDirectivePairingException;
911
import com.intuit.graphql.orchestrator.resolverdirective.NotAValidLocationForFieldResolverDirective;
1012
import com.intuit.graphql.orchestrator.utils.XtextTypeUtils;
1113
import com.intuit.graphql.orchestrator.xtext.XtextGraph;
1214
import java.util.ArrayList;
1315
import java.util.List;
1416
import java.util.Objects;
1517
import org.apache.commons.collections4.CollectionUtils;
18+
import org.eclipse.emf.common.util.EList;
1619
import org.eclipse.emf.ecore.EObject;
1720

1821
public class FieldResolverTransformerPreMerge implements Transformer<XtextGraph, XtextGraph> {
@@ -39,21 +42,51 @@ public XtextGraph transform(XtextGraph sourceXtextGraph) {
3942
}
4043

4144
private void validateFieldWithResolver(List<FieldResolverContext> fieldResolverContexts) {
42-
fieldResolverContexts
43-
.forEach(fieldResolverContext -> {
44-
FieldDefinition fieldDefinition = fieldResolverContext.getFieldDefinition();
45-
String fieldName = fieldDefinition.getName();
46-
String parentTypeName = XtextTypeUtils.getParentTypeName(fieldDefinition);
47-
48-
EObject parentType = fieldDefinition.eContainer();
49-
if (!(canContainFieldResolverDirective(parentType))) {
50-
throw new NotAValidLocationForFieldResolverDirective(fieldName, parentTypeName);
51-
}
52-
53-
if (hasArguments(fieldDefinition)) {
54-
throw new ArgumentDefinitionNotAllowed(fieldName, parentTypeName);
55-
}
56-
});
45+
fieldResolverContexts
46+
.forEach(fieldResolverContext -> {
47+
FieldDefinition fieldDefinition = fieldResolverContext.getFieldDefinition();
48+
String fieldName = fieldDefinition.getName();
49+
String parentTypeName = XtextTypeUtils.getParentTypeName(fieldDefinition);
50+
51+
EObject parentType = fieldDefinition.eContainer();
52+
if (!(canContainFieldResolverDirective(parentType))) {
53+
throw new NotAValidLocationForFieldResolverDirective(fieldName, parentTypeName);
54+
}
55+
56+
if (hasArguments(fieldDefinition)) {
57+
throw new ArgumentDefinitionNotAllowed(fieldName, parentTypeName);
58+
}
59+
60+
EList<Directive> directives = fieldDefinition.getDirectives();
61+
boolean hasResolverDirective = false;
62+
boolean hasExternalDirective = false;
63+
boolean hasProvidesDirective = false;
64+
boolean hasRequiresDirective = false;
65+
66+
for (Directive directive : directives) {
67+
String directiveName = directive.getDefinition().getName();
68+
switch (directiveName) {
69+
case "resolver":
70+
hasResolverDirective = true;
71+
break;
72+
case "external":
73+
hasExternalDirective = true;
74+
break;
75+
case "provides":
76+
hasProvidesDirective = true;
77+
break;
78+
case "requires":
79+
hasRequiresDirective = true;
80+
break;
81+
}
82+
}
83+
84+
if (hasResolverDirective) {
85+
if (hasExternalDirective || hasProvidesDirective || hasRequiresDirective) {
86+
throw new InvalidDirectivePairingException(fieldName, parentTypeName);
87+
}
88+
}
89+
});
5790
}
5891

5992
private boolean hasArguments(FieldDefinition fieldDefinition) {

0 commit comments

Comments
 (0)