public override IGraphQLBaseNode VisitField(EntityGraphQLParser.FieldContext context) { var fieldName = context.fieldDef.GetText(); string schemaTypeName = schemaProvider.GetSchemaTypeNameForDotnetType(currentExpressionContext.Type); var actualFieldName = schemaProvider.GetActualFieldName(schemaTypeName, fieldName, claims); var args = context.argsCall != null?ParseGqlCall(actualFieldName, context.argsCall) : null; var alias = context.alias?.name.GetText(); //== JT: add Operation Type check if (schemaProvider.HasMutation(actualFieldName) && schemaProvider.OperationType == OperationType.Mutation) { var mutationType = schemaProvider.GetMutations().First(m => m.Name == actualFieldName); if (context.select != null) { var expContext = (ExpressionResult)Expression.Parameter(mutationType.ReturnType.SchemaType.ContextType, $"mut_{actualFieldName}"); var oldContext = currentExpressionContext; currentExpressionContext = expContext; var select = ParseFieldSelect(expContext, actualFieldName, context.select); currentExpressionContext = oldContext; return(new GraphQLMutationNode(mutationType, args, (GraphQLQueryNode)select)); } else { var resultName = alias ?? actualFieldName; return(new GraphQLMutationNode(mutationType, args, null)); } } else { if (!schemaProvider.TypeHasField(schemaTypeName, actualFieldName, args != null ? args.Select(d => d.Key) : new string[0], claims)) { throw new EntityGraphQLCompilerException($"Field {actualFieldName} not found on type {schemaTypeName}"); } var result = schemaProvider.GetExpressionForField(currentExpressionContext, schemaTypeName, actualFieldName, args, claims); IGraphQLBaseNode fieldResult; var resultName = alias ?? actualFieldName; if (context.select != null) { fieldResult = ParseFieldSelect(result, resultName, context.select); } else { fieldResult = new GraphQLQueryNode(schemaProvider, fragments, resultName, result, currentExpressionContext.AsParameter(), null, null); } if (context.directive != null) { return(ProcessFieldDirective((GraphQLQueryNode)fieldResult, context.directive)); } return(fieldResult); } }
public override IGraphQLBaseNode VisitField(EntityGraphQLParser.FieldContext context) { var name = baseIdentityFinder.Visit(context); var result = EqlCompiler.CompileWith(context.GetText(), selectContext, schemaProvider, methodProvider, variables); var actualName = schemaProvider.GetActualFieldName(schemaProvider.GetSchemaTypeNameForRealType(selectContext.Type), name); var node = new GraphQLNode(schemaProvider, fragments, actualName, result, null); return(node); }