Skip to content

Commit 471f544

Browse files
authored
Merge pull request #43 from setchy/issue-31-notblank-list
Adding Lists support for @notblank validation directive
2 parents 9964dfd + 09d3ddc commit 471f544

File tree

4 files changed

+50
-4
lines changed

4 files changed

+50
-4
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ The String must contain at least one non-whitespace character, according to Java
390390

391391
- Example : `updateAccident( accidentNotes : String @NotBlank) : DriverDetails`
392392

393-
- Applies to : `String`, `ID`
393+
- Applies to : `String`, `ID`, `Lists`
394394

395395
- SDL : `directive @NotBlank(message : String = "graphql.validation.NotBlank.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION`
396396

src/main/java/graphql/validation/constraints/AbstractDirectiveConstraint.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,18 @@ protected List<GraphQLError> mkError(ValidationEnvironment validationEnvironment
307307
return singletonList(error);
308308
}
309309

310+
/**
311+
* Return true if the type is a String or ID or List type, regardless of non null ness
312+
*
313+
* @param inputType the type to check
314+
*
315+
* @return true if one of the above
316+
*/
317+
protected boolean isStringOrIDOrList(GraphQLInputType inputType) {
318+
return isStringOrID(inputType) ||
319+
isList(inputType);
320+
}
321+
310322
/**
311323
* Return true if the type is a String or ID or List type or {@link graphql.schema.GraphQLInputObjectType}, regardless of non null ness
312324
*

src/main/java/graphql/validation/constraints/standard/NotBlankRule.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package graphql.validation.constraints.standard;
22

3+
import static graphql.schema.GraphQLTypeUtil.isList;
4+
35
import graphql.GraphQLError;
46
import graphql.Scalars;
57
import graphql.schema.GraphQLDirective;
@@ -8,6 +10,7 @@
810
import graphql.validation.constraints.Documentation;
911
import graphql.validation.rules.ValidationEnvironment;
1012

13+
import java.util.Arrays;
1114
import java.util.Collections;
1215
import java.util.List;
1316

@@ -26,7 +29,7 @@ public Documentation getDocumentation() {
2629

2730
.example("updateAccident( accidentNotes : String @NotBlank) : DriverDetails")
2831

29-
.applicableTypeNames(Scalars.GraphQLString.getName(), Scalars.GraphQLID.getName())
32+
.applicableTypeNames(Scalars.GraphQLString.getName(), Scalars.GraphQLID.getName(), "Lists")
3033

3134
.directiveSDL("directive @NotBlank(message : String = \"%s\") " +
3235
"on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION",
@@ -36,19 +39,38 @@ public Documentation getDocumentation() {
3639

3740
@Override
3841
public boolean appliesToType(GraphQLInputType inputType) {
39-
return isStringOrID(inputType);
42+
return isStringOrIDOrList(inputType);
4043
}
4144

4245
@Override
4346
protected List<GraphQLError> runConstraint(ValidationEnvironment validationEnvironment) {
4447
Object validatedValue = validationEnvironment.getValidatedValue();
48+
GraphQLInputType argumentType = validationEnvironment.getValidatedType();
4549

4650
GraphQLDirective directive = validationEnvironment.getContextObject(GraphQLDirective.class);
4751

48-
if (validatedValue == null || isBlank(validatedValue)) {
52+
if (validatedValue == null) {
53+
return mkError(validationEnvironment, directive, mkMessageParams(validatedValue, validationEnvironment));
54+
}
55+
56+
List<Object> validatedValues;
57+
58+
if (isList(argumentType)) {
59+
validatedValues = (List)validatedValue;
60+
} else {
61+
validatedValues = Arrays.asList(validatedValue);
62+
}
63+
64+
if (validatedValues.size() <= 0) {
4965
return mkError(validationEnvironment, directive, mkMessageParams(validatedValue, validationEnvironment));
66+
}
5067

68+
for (Object value : validatedValues) {
69+
if (isBlank(value)) {
70+
return mkError(validationEnvironment, directive, mkMessageParams(validatedValue, validationEnvironment));
71+
}
5172
}
73+
5274
return Collections.emptyList();
5375
}
5476

src/test/groovy/graphql/validation/constraints/standard/NoEmptyBlankConstraintTest.groovy

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,18 @@ class NoEmptyBlankConstraintTest extends BaseConstraintTestSupport {
3131
'field( arg : ID @NotBlank ) : ID' | "" | 'NotBlank;path=/arg;val:;\t'
3232
'field( arg : ID @NotBlank ) : ID' | "\t\n\r X" | ''
3333
'field( arg : ID @NotBlank ) : ID' | null | ''
34+
35+
// Lists
36+
'field( arg : [String] @NotBlank ) : ID' | [] | 'NotBlank;path=/arg;val:[];\t'
37+
'field( arg : [String] @NotBlank ) : ID' | null | ''
38+
'field( arg : [String] @NotBlank ) : ID' | ["x"] | ''
39+
'field( arg : [String] @NotBlank ) : ID' | ["x", "y"] | ''
40+
'field( arg : [String] @NotBlank ) : ID' | ["x", " "] | 'NotBlank;path=/arg;val:[x, ];\t'
41+
'field( arg : [ID] @NotBlank ) : ID' | [] | 'NotBlank;path=/arg;val:[];\t'
42+
'field( arg : [ID] @NotBlank ) : ID' | null | ''
43+
'field( arg : [ID] @NotBlank ) : ID' | ["x"] | ''
44+
'field( arg : [ID] @NotBlank ) : ID' | ["x", "y"] | ''
45+
'field( arg : [String] @NotBlank ) : ID' | ["x", " "] | 'NotBlank;path=/arg;val:[x, ];\t'
3446
}
3547

3648
@Unroll

0 commit comments

Comments
 (0)