示例#1
0
        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);
        }