Exemple #1
0
            protected override UpdateBusDetailsResponse Resolve(ResolveFieldContext context)
            {
                UpdateBusDetailsResponse response = new UpdateBusDetailsResponse(true);

                var details = context.GetArgument <MyBusDetails>(DetailsParameterName);

                // Database update goes here.

                response.BusVersion = details.Version + 100;

                return(response);
            }
        public Task<object> Resolve(ResolveFieldContext context, FieldMiddlewareDelegate next)
        {
            var metadata = new Dictionary<string, object>
            {
                {"typeName", context.ParentType.Name},
                {"fieldName", context.FieldName}
            };

            using (context.Metrics.Subject("field", context.FieldName, metadata))
            {
                return next(context);
            }
        }
        public FieldMiddlewareBuilderTests()
        {
            _builder = new FieldMiddlewareBuilder();
            _context = new ResolveFieldContext();
            _context.FieldName = "Name";
            _context.FieldAst = new Field(null, new NameNode("Name"));
            _context.Source = new Person
            {
                Name = "Quinn"
            };

            _context.Metrics = new Metrics();
        }
        public object Resolve(ResolveFieldContext context)
        {
            var source = context.Source;

            if (source == null)
            {
                return null;
            }

            var prop = source.GetType()
                .GetProperty(context.FieldAst.Name, _flags);

            if (prop == null)
            {
                throw new InvalidOperationException($"Expected to find property {context.FieldAst.Name} on {context.Source.GetType().Name} but it does not exist.");
            }

            return prop.GetValue(source, null);
        }
Exemple #5
0
 protected override BusDetailsResponse Resolve(ResolveFieldContext context)
 {
     if (context.HasArgument(ApiConstants.GraphqlArgumentNames.PATH))
     {
         var value = context.Arguments[ApiConstants.GraphqlArgumentNames.PATH];
         if (value != null && value == "Scrap")
         {
             return(new BusDetailsResponse(true)
             {
                 Result = false
             });
         }
     }
     return(new BusDetailsResponse(true)
     {
         Model = "Suzuki",
         Passengers = 50,
         Result = true
     });
 }
Exemple #6
0
            protected override CarDetailsResponse Resolve(ResolveFieldContext context)
            {
                CarDetailsResponse response = null;

                if (context.HasArgument(ApiConstants.GraphqlArgumentNames.PATH))
                {
                    var value = context.Arguments[ApiConstants.GraphqlArgumentNames.PATH];
                    if (value != null && value == "Blue")
                    {
                        response = new CarDetailsResponse(true)
                        {
                            HousedAddress = new Address()
                            {
                                AddressLineOne = "Blue HousedAddress",
                                Postcode       = "4000",
                                State          = "QLD",
                                Suburb         = "Brisbane"
                            }
                        };
                    }
                }
                response = new CarDetailsResponse(true)
                {
                    HousedAddress = new Address()
                    {
                        AddressLineOne = "Unknown HousedAddress",
                        Postcode       = "2000",
                        State          = "NSW",
                        Suburb         = "Sydney"
                    }
                };

                response.Make     = "Toyota";
                response.Model    = "Tarago";
                response.HasAlarm = true;

                return(response);
            }
        public async Task<ResolveFieldResult<object>> ResolveFieldAsync(ExecutionContext context, IObjectGraphType parentType, object source, Fields fields)
        {
            context.CancellationToken.ThrowIfCancellationRequested();

            var resolveResult = new ResolveFieldResult<object>
            {
                Skip = false
            };

            var field = fields.First();

            var fieldDefinition = GetFieldDefinition(context.Schema, parentType, field);
            if (fieldDefinition == null)
            {
                resolveResult.Skip = true;
                return resolveResult;
            }

            var arguments = GetArgumentValues(context.Schema, fieldDefinition.Arguments, field.Arguments, context.Variables);

            try
            {
                var resolveContext = new ResolveFieldContext();
                resolveContext.FieldName = field.Name;
                resolveContext.FieldAst = field;
                resolveContext.FieldDefinition = fieldDefinition;
                resolveContext.ReturnType = fieldDefinition.ResolvedType;
                resolveContext.ParentType = parentType;
                resolveContext.Arguments = arguments;
                resolveContext.Source = source;
                resolveContext.Schema = context.Schema;
                resolveContext.Document = context.Document;
                resolveContext.Fragments = context.Fragments;
                resolveContext.RootValue = context.RootValue;
                resolveContext.UserContext = context.UserContext;
                resolveContext.Operation = context.Operation;
                resolveContext.Variables = context.Variables;
                resolveContext.CancellationToken = context.CancellationToken;
                resolveContext.Metrics = context.Metrics;

                var resolver = fieldDefinition.Resolver ?? new NameFieldResolver();
                var result = resolver.Resolve(resolveContext);

                if (result is Task)
                {
                    var task = result as Task;
                    await task.ConfigureAwait(false);

                    result = task.GetProperyValue("Result");
                }

                resolveResult.Value =
                    await CompleteValueAsync(context, fieldDefinition.ResolvedType, fields, result).ConfigureAwait(false);
                return resolveResult;
            }
            catch (Exception exc)
            {
                var error = new ExecutionError("Error trying to resolve {0}.".ToFormat(field.Name), exc);
                error.AddLocation(field, context.Document);
                context.Errors.Add(error);
                resolveResult.Skip = false;
                return resolveResult;
            }
        }
 public ResolveFieldContextTests()
 {
     _context = new ResolveFieldContext();
     _context.Arguments = new Dictionary<string, object>();
 }
        public void should_return_the_right_type()
        {
            var objectType = new ObjectGraphType();
            objectType.Field<StringGraphType>()
                .Name("TheName")
                .Returns<string>()
                .Resolve(_ => "SomeString");

            var fields = objectType.Fields.ToList();
            fields.Count.ShouldEqual(1);
            fields[0].Name.ShouldEqual("TheName");
            fields[0].Type.ShouldEqual(typeof(StringGraphType));

            var context = new ResolveFieldContext();
            fields[0].Resolve(context).GetType().ShouldEqual(typeof(string));
            fields[0].Resolve(context).ShouldEqual("SomeString");
        }
 public abstract TOut MutateAndGetPayload(MutationInputs inputs, ResolveFieldContext <object> context);
 public Task<object> Resolve(ResolveFieldContext context, FieldMiddlewareDelegate next)
 {
     using (context.Metrics.Subject("class", "from class"))
     {
         return next(context);
     }
 }
 private void ThrowIfPluralIdentifyingRootFieldRequirementsNotMet(
     object result,
     ResolveFieldContext context )
 {
     IEnumerable<object> resultAsIEnumerable = result as IEnumerable<object>;
     if( resultAsIEnumerable == null ||
         context.Arguments == null ||
         context.Arguments.Count != 1 ||
         resultAsIEnumerable.Count() != ((object[])context.Arguments.First().Value).Length )
     {
         throw new InvalidOperationException(
             "The number of elements in the returned data set must match the number of arguments passed into the query." );
     }
 }
        private async Task<object> ResolveField( ExecutionContext context, ObjectGraphType parentType, object source, IEnumerable<Field> fields, List<ExecutionError> executionErrors )
        {
            context.CancellationToken.ThrowIfCancellationRequested();

            IReadOnlyList<Field> fieldsAsReadOnlyList = fields.ToReadOnlyList();

            Field field = fieldsAsReadOnlyList.First();

            FieldType fieldDefinition = GetFieldDefinition(context.Schema, parentType, field);
            if (fieldDefinition == null)
            {
                return null;
            }

            IReadOnlyDictionary<string, object> arguments = GetArgumentValues(context.Schema, fieldDefinition.Arguments, field.Arguments, context.Variables);

            Func<ResolveFieldContext, object> defaultResolve =
                ctx =>
                {
                    return ctx.Source != null ? GetProperyValue(ctx.Source, ctx.FieldAst.Name) : null;
                };

            try
            {
                ResolveFieldContext resolveContext = new ResolveFieldContext(
                    field.Name,
                    field,
                    fieldDefinition,
                    context.Schema.FindType( fieldDefinition.Type ),
                    parentType,
                    arguments,
                    context.RootValue,
                    source,
                    context.Schema,
                    context.Operation,
                    context.Fragments,
                    context.Variables,
                    context.CancellationToken,
                    context.UserContext );

                Func<ResolveFieldContext, object> resolve = fieldDefinition.Resolve ?? defaultResolve;
                object result = resolve( resolveContext );

                Task resultAsTask = result as Task;
                if( resultAsTask != null )
                {
                    await resultAsTask;
                    result = GetProperyValue( resultAsTask, "Result" );
                }

                if ( fieldDefinition.IsPluralIdentifyingRootField )
                {
                    ThrowIfPluralIdentifyingRootFieldRequirementsNotMet(
                        result,
                        resolveContext );
                }
                
                __Field parentTypeAsField = parentType as __Field;
                Type resultAsType = result as Type;
                if ( parentTypeAsField != null &&
                     resultAsType != null )
                {
                    result = context.Schema.FindType( resultAsType );
                }

                return await CompleteValue(
                    context,
                    context.Schema.FindType( fieldDefinition.Type ),
                    fieldsAsReadOnlyList,
                    result,
                    executionErrors );
            }
            catch( Exception exception )
            {
                executionErrors.Add(
                    new ExecutionError( string.Format( "Error trying to resolve {0}.", field.Name ), exception ) );

                return null;
            }
        }
        public object ResolveField(ExecutionContext context, ObjectGraphType parentType, object source, Fields fields)
        {
            var field = fields.First();

            var fieldDefinition = GetFieldDefinition(context.Schema, parentType, field);
            if (fieldDefinition == null)
            {
                return null;
            }

            var arguments = GetArgumentValues(fieldDefinition.Arguments, field.Arguments, context.Variables);

            Func<ResolveFieldContext, object> defaultResolve = (ctx) =>
            {
                return ctx.Source != null ? GetProperyValue(ctx.Source, ctx.FieldAst.Name) : null;
            };

            try
            {
                var resolveContext = new ResolveFieldContext();
                resolveContext.FieldAst = field;
                resolveContext.FieldDefinition = fieldDefinition;
                resolveContext.Schema = context.Schema;
                resolveContext.ParentType = parentType;
                resolveContext.Arguments = arguments;
                resolveContext.Source = source;
                var resolve = fieldDefinition.Resolve ?? defaultResolve;
                var result = resolve(resolveContext);
                return CompleteValue(context, fieldDefinition.Type, fields, result);
            }
            catch (Exception exc)
            {
                context.Errors.Add(new ExecutionError("Error trying to resolve {0}.".ToFormat(field.Name), exc));
                return null;
            }
        }
 private bool IsCorrectSelection(ResolveFieldContext <TSource> context, Field field)
 {
     return(Enumerable.Any(field.SelectionSet.Selections,
                           s => s.SourceLocation.Equals(context.FieldAst.SourceLocation)));
 }
        public async Task<object> ResolveField(ExecutionContext context, ObjectGraphType parentType, object source, Fields fields)
        {
            context.CancellationToken.ThrowIfCancellationRequested();

            var field = fields.First();

            var fieldDefinition = GetFieldDefinition(context.Schema, parentType, field);
            if (fieldDefinition == null)
            {
                return null;
            }

            var arguments = GetArgumentValues(context.Schema, fieldDefinition.Arguments, field.Arguments, context.Variables);

            Func<ResolveFieldContext, object> defaultResolve = (ctx) =>
            {
                return ctx.Source != null ? GetProperyValue(ctx.Source, ctx.FieldAst.Name) : null;
            };

            try
            {
                var resolveContext = new ResolveFieldContext();
                resolveContext.FieldAst = field;
                resolveContext.FieldDefinition = fieldDefinition;
                resolveContext.Schema = context.Schema;
                resolveContext.ParentType = parentType;
                resolveContext.Arguments = arguments;
                resolveContext.Source = source;
                resolveContext.CancellationToken = context.CancellationToken;
                var resolve = fieldDefinition.Resolve ?? defaultResolve;
                var result = resolve(resolveContext);

                if(result is Task)
                {
                    var task = result as Task;
                    await task;

                    result = GetProperyValue(task, "Result");
                }

                if (parentType is __Field && result is Type)
                {
                    result = context.Schema.FindType(result as Type);
                }

                return await CompleteValue(context, context.Schema.FindType(fieldDefinition.Type), fields, result);
            }
            catch (Exception exc)
            {
                context.Errors.Add(new ExecutionError("Error trying to resolve {0}.".ToFormat(field.Name), exc));
                return null;
            }
        }
        public async Task<ResolveFieldResult<object>> ResolveFieldAsync(ExecutionContext context, ObjectGraphType parentType, object source, Fields fields)
        {
            context.CancellationToken.ThrowIfCancellationRequested();

            var resolveResult = new ResolveFieldResult<object>
            {
                Skip = false
            };

            var field = fields.First();

            var fieldDefinition = GetFieldDefinition(context.Schema, parentType, field);
            if (fieldDefinition == null)
            {
                resolveResult.Skip = true;
                return resolveResult;
            }

            var arguments = GetArgumentValues(context.Schema, fieldDefinition.Arguments, field.Arguments, context.Variables);

            Func<ResolveFieldContext, object> defaultResolve =
                ctx => ctx.Source != null
                    ? GetProperyValue(ctx.Source, ctx.FieldAst.Name)
                    : null;

            try
            {
                var resolveContext = new ResolveFieldContext();
                resolveContext.FieldName = field.Name;
                resolveContext.FieldAst = field;
                resolveContext.FieldDefinition = fieldDefinition;
                resolveContext.ReturnType = context.Schema.FindType(fieldDefinition.Type);
                resolveContext.ParentType = parentType;
                resolveContext.Arguments = arguments;
                resolveContext.Source = source;
                resolveContext.Schema = context.Schema;
                resolveContext.Fragments = context.Fragments;
                resolveContext.RootValue = context.RootValue;
                resolveContext.Operation = context.Operation;
                resolveContext.Variables = context.Variables;
                resolveContext.CancellationToken = context.CancellationToken;
                var resolve = fieldDefinition.Resolve ?? defaultResolve;
                var result = resolve(resolveContext);

                if(result is Task)
                {
                    var task = result as Task;
                    await task.ConfigureAwait(false);

                    result = GetProperyValue(task, "Result");
                }

                if (parentType is __Field && result is Type)
                {
                    result = context.Schema.FindType(result as Type);
                }

                resolveResult.Value = await CompleteValueAsync(context, context.Schema.FindType(fieldDefinition.Type), fields, result).ConfigureAwait(false);
                return resolveResult;
            }
            catch (Exception exc)
            {
                var error = new ExecutionError("Error trying to resolve {0}.".ToFormat(field.Name), exc);
                error.AddLocation(field.SourceLocation.Line, field.SourceLocation.Column);
                context.Errors.Add(error);
                resolveResult.Skip = false;
                return resolveResult;
            }
        }