diff --git a/rejoiner/src/main/java/com/google/api/graphql/rejoiner/SchemaModule.java b/rejoiner/src/main/java/com/google/api/graphql/rejoiner/SchemaModule.java index af61e49..ed797e5 100644 --- a/rejoiner/src/main/java/com/google/api/graphql/rejoiner/SchemaModule.java +++ b/rejoiner/src/main/java/com/google/api/graphql/rejoiner/SchemaModule.java @@ -38,6 +38,7 @@ import graphql.schema.GraphQLList; import graphql.schema.GraphQLObjectType; import graphql.schema.GraphQLOutputType; +import graphql.schema.GraphQLScalarType; import javax.annotation.Nullable; import javax.inject.Provider; @@ -415,7 +416,7 @@ private GraphQLFieldDefinition methodToFieldDefinition( } } - ImmutableMap javaTypeToScalarMap = + ImmutableMap javaTypeToScalarMap = ImmutableMap.of( String.class, Scalars.GraphQLString, Integer.class, Scalars.GraphQLInt, @@ -504,6 +505,7 @@ private ImmutableList getMethodMetadata( } else { GqlInputConverter inputConverter = GqlInputConverter.newBuilder().add(requestDescriptor.getFile()).build(); + addExtraType(requestDescriptor); Message message = ((Message.Builder) requestClass.getMethod("newBuilder").invoke(null)).build(); String argName = getArgName(method.getParameterAnnotations()[i]); @@ -517,6 +519,21 @@ private ImmutableList getMethodMetadata( GraphQLArgument argument = GqlInputConverter.createArgument(requestDescriptor, argName); listBuilder.add(MethodMetadata.create(function, argument)); } + } else if (isArg(method.getParameterAnnotations()[i])) { + if (javaTypeToScalarMap.containsKey(parameterType)) { + String argName = getArgName(method.getParameterAnnotations()[i]); + Function function = + environment -> environment.getArgument(argName); + GraphQLArgument argument = + GraphQLArgument.newArgument() + .name(argName) + .type(javaTypeToScalarMap.get(parameterType)) + .build(); + listBuilder.add(MethodMetadata.create(function, argument)); + } else { + throw new RuntimeException("Unknown arg type: " + parameterType.getName()); + } + } else if (DataFetchingEnvironment.class.isAssignableFrom(parameterType)) { listBuilder.add(MethodMetadata.create(Functions.identity())); } else { @@ -539,6 +556,15 @@ private ImmutableList getMethodMetadata( return listBuilder.build(); } + private static boolean isArg(Annotation[] annotations) { + for (Annotation annotation : annotations) { + if (annotation.annotationType().isAssignableFrom(Arg.class)) { + return true; + } + } + return false; + } + private static String getArgName(Annotation[] annotations) { for (Annotation annotation : annotations) { if (annotation.annotationType().isAssignableFrom(Arg.class)) { diff --git a/schema/src/main/java/com/google/api/graphql/schema/protobuf/TimestampSchemaModule.java b/schema/src/main/java/com/google/api/graphql/schema/protobuf/TimestampSchemaModule.java index 2b18a87..88f4cd4 100644 --- a/schema/src/main/java/com/google/api/graphql/schema/protobuf/TimestampSchemaModule.java +++ b/schema/src/main/java/com/google/api/graphql/schema/protobuf/TimestampSchemaModule.java @@ -34,8 +34,9 @@ Boolean isAfterNow(Timestamp timestamp) { return Instant.ofEpochSecond(timestamp.getSeconds()).isAfter(Instant.now()); } - @SchemaModification(addField = "afterNow", onType = Timestamp.class) + @SchemaModification(addField = "localTime", onType = Timestamp.class) String localTime(Timestamp timestamp, @Arg("timezone") String timezone) { + // TODO: Arg should be required, optional should be optional return Instant.ofEpochSecond(timestamp.getSeconds()).atZone(ZoneId.of(timezone)).toString(); } }