Skip to content

Commit

Permalink
Merge pull request #28 from graphql-dotnet/result-serialization
Browse files Browse the repository at this point in the history
Result Serialization
  • Loading branch information
tlil authored Mar 1, 2017
2 parents 540a4ab + e32f4db commit ad6a84c
Show file tree
Hide file tree
Showing 11 changed files with 160 additions and 107 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using System;
using System.Reflection;
using GraphQL.Conventions.Attributes;
using GraphQL.Conventions.Types.Descriptors;

namespace GraphQL.Conventions
{
[AttributeUsage(Fields, AllowMultiple = true, Inherited = true)]
public class DefaultValueAttribute : MetaDataAttributeBase
{
private readonly object _defaultValue;

public DefaultValueAttribute(object defaultValue)
: base(AttributeApplicationPhase.Initialization)
{
_defaultValue = defaultValue;
}

public override void MapField(GraphFieldInfo entity, MemberInfo memberInfo)
{
entity.DefaultValue = _defaultValue;
}
}
}
6 changes: 3 additions & 3 deletions src/GraphQL.Conventions/CommonAssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
[assembly: AssemblyProduct("GraphQL.Conventions")]
[assembly: AssemblyCopyright("Copyright 2016-2017 Tommy Lillehagen. All rights reserved.")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("1.1.7.0")]
[assembly: AssemblyFileVersion("1.1.7.0")]
[assembly: AssemblyInformationalVersion("1.1.7.0")]
[assembly: AssemblyVersion("1.1.8.0")]
[assembly: AssemblyFileVersion("1.1.8.0")]
[assembly: AssemblyInformationalVersion("1.1.8.0")]
[assembly: CLSCompliant(false)]

[assembly: InternalsVisibleTo("GraphQL.Conventions.Tests")]
8 changes: 7 additions & 1 deletion src/GraphQL.Conventions/Types/Descriptors/GraphFieldInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,20 @@ namespace GraphQL.Conventions.Types.Descriptors
{
public class GraphFieldInfo : GraphEntityInfo
{
private object _defaultValue = null;

public GraphFieldInfo(ITypeResolver typeResolver, MemberInfo field = null)
: base(typeResolver, field)
{
}

public GraphTypeInfo DeclaringType { get; set; }

public object DefaultValue => Value ?? Type.DefaultValue;
public object DefaultValue
{
get { return _defaultValue ?? Value; }
set { _defaultValue = value; }
}

public List<GraphArgumentInfo> Arguments { get; } =
new List<GraphArgumentInfo>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,18 @@ public static bool IsGenericType(this TypeInfo type, Type genericType)
return type.IsGenericType && type.GetGenericTypeDefinition() == genericType;
}

public static bool IsNullableType(this TypeInfo type)
{
return type.IsGenericType(typeof(Nullable<>));
}

public static TypeInfo BaseType(this TypeInfo type)
{
return type.IsNullableType()
? type.TypeParameter()
: type;
}

public static TypeInfo TypeParameter(this TypeInfo type)
{
if (type.IsArray)
Expand Down
15 changes: 14 additions & 1 deletion src/GraphQL.Conventions/Types/Resolution/ObjectReflector.cs
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,20 @@ private GraphArgumentInfo DeriveArgument(ParameterInfo parameterInfo)
{
argument.Type = GetType(parameterTypeInfo);
}
argument.DefaultValue = parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : null;

if (parameterInfo.HasDefaultValue)
{
var baseType = argument.Type.TypeRepresentation.BaseType();
if (baseType.IsEnum)
{
argument.DefaultValue = Enum.ToObject(baseType.AsType(), parameterInfo.DefaultValue);
}
else
{
argument.DefaultValue = parameterInfo.DefaultValue;
}
}

_metaDataHandler.DeriveMetaData(argument, parameterInfo);
return argument;
}
Expand Down
92 changes: 47 additions & 45 deletions src/GraphQL.Conventions/Web/RequestHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,23 @@ public async Task<Response> ProcessRequest(Request request, IUserContext userCon
.EnableValidation(_useValidation)
.Execute()
.ConfigureAwait(false);
return new Response(request, result, _engine.SerializeResult(result));

var response = new Response(request, result);
var errors = result?.Errors?.Where(e => !string.IsNullOrWhiteSpace(e?.Message));
foreach (var error in errors ?? new List<ExecutionError>())
{
if (_exceptionsTreatedAsWarnings.Contains(error.InnerException.GetType()))
{
response.Warnings.Add(error);
}
else
{
response.Errors.Add(error);
}
}
result.Errors = new ExecutionErrors(response.Errors);
response.Body = _engine.SerializeResult(result);
return response;
}

public Response Validate(Request request)
Expand Down Expand Up @@ -179,55 +195,41 @@ public string DescribeSchema(bool returnJson = false)
const string IntrospectionQuery = @"
query IntrospectionQuery {
__schema {
queryType { name }
mutationType { name }
subscriptionType { name }
types {
...FullType
}
directives {
name
description
args {
...InputValue
queryType { name }
mutationType { name }
subscriptionType { name }
types { ...FullType }
directives {
name
description
args { ...InputValue }
onOperation
onFragment
onField
}
onOperation
onFragment
onField
}
}
}
fragment FullType on __Type {
kind
name
description
fields(includeDeprecated: true) {
name
description
args {
...InputValue
}
type {
...TypeRef
}
isDeprecated
deprecationReason
}
inputFields {
...InputValue
}
interfaces {
...TypeRef
name
description
args { ...InputValue }
type { ...TypeRef }
isDeprecated
deprecationReason
}
inputFields { ...InputValue }
interfaces { ...TypeRef }
enumValues(includeDeprecated: true) {
name
description
isDeprecated
deprecationReason
}
possibleTypes {
...TypeRef
name
description
isDeprecated
deprecationReason
}
possibleTypes { ...TypeRef }
}
fragment InputValue on __InputValue {
name
Expand All @@ -236,20 +238,20 @@ fragment InputValue on __InputValue {
defaultValue
}
fragment TypeRef on __Type {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
kind
name
ofType {
kind
name
}
}
}
}
}
";
#endregion
Expand Down
29 changes: 3 additions & 26 deletions src/GraphQL.Conventions/Web/Response.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;

Expand All @@ -8,40 +7,18 @@ public class Response
{
public Response(
Request request,
ExecutionResult result,
string serializedResult,
List<Type> exceptionsTreatedAsWarnings = null)
ExecutionResult result)
{
Request = request;
ExecutionResult = result;
Body = serializedResult;
PopulateErrorsAndWarnings(exceptionsTreatedAsWarnings);
}

public Response(
Request request,
Validation.IValidationResult result,
List<Type> exceptionsTreatedAsWarnings = null)
Validation.IValidationResult result)
{
Request = request;
ValidationResult = result;
PopulateErrorsAndWarnings(exceptionsTreatedAsWarnings);
}

private void PopulateErrorsAndWarnings(List<Type> exceptionsTreatedAsWarnings)
{
var errors = Errors?.Where(e => !string.IsNullOrWhiteSpace(e?.Message));
foreach (var error in errors ?? new List<ExecutionError>())
{
if (exceptionsTreatedAsWarnings.Contains(error.InnerException.GetType()))
{
Warnings.Add(error);
}
else
{
Errors.Add(error);
}
}
}

public Request Request { get; private set; }
Expand All @@ -52,7 +29,7 @@ private void PopulateErrorsAndWarnings(List<Type> exceptionsTreatedAsWarnings)

public Validation.IValidationResult ValidationResult { get; private set; }

public string Body { get; }
public string Body { get; internal set; }

public bool HasData => ExecutionResult?.Data != null;

Expand Down
2 changes: 1 addition & 1 deletion src/GraphQL.Conventions/project.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "1.1.7-*",
"version": "1.1.8-*",
"description": "GraphQL Conventions for .NET",
"authors": [
"Tommy Lillehagen"
Expand Down
49 changes: 22 additions & 27 deletions test/Tests/Adapters/Engine/ErrorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,10 @@ public async void Will_Provide_Path_And_Code_For_Errors_On_Fields_With_Operation
var error = result.Errors.First();
error.Message.ShouldEqual("Test error.");
error.Code.ShouldEqual("ARGUMENT");
error.Path.Count.ShouldEqual(4);
error.Path[0].ShouldEqual("Blah");
error.Path[1].ShouldEqual("getObject");
error.Path[2].ShouldEqual("field");
error.Path[3].ShouldEqual("test");
error.Path.Count.ShouldEqual(3);
error.Path[0].ShouldEqual("getObject");
error.Path[1].ShouldEqual("field");
error.Path[2].ShouldEqual("test");
}

[Test]
Expand All @@ -43,11 +42,10 @@ public async void Will_Provide_Path_And_Code_For_Errors_On_Fields_Without_Operat
var error = result.Errors.First();
error.Message.ShouldEqual("Test error.");
error.Code.ShouldEqual("ARGUMENT");
error.Path.Count.ShouldEqual(4);
error.Path[0].ShouldEqual(null);
error.Path[1].ShouldEqual("getObject");
error.Path[2].ShouldEqual("field");
error.Path[3].ShouldEqual("test");
error.Path.Count.ShouldEqual(3);
error.Path[0].ShouldEqual("getObject");
error.Path[1].ShouldEqual("field");
error.Path[2].ShouldEqual("test");
}

[Test]
Expand All @@ -64,11 +62,10 @@ public async void Will_Provide_Path_And_Code_For_Errors_On_Fields_With_Aliases()
var error = result.Errors.First();
error.Message.ShouldEqual("Test error.");
error.Code.ShouldEqual("ARGUMENT");
error.Path.Count.ShouldEqual(4);
error.Path[0].ShouldEqual(null);
error.Path[1].ShouldEqual("yo");
error.Path[2].ShouldEqual("foo");
error.Path[3].ShouldEqual("bar");
error.Path.Count.ShouldEqual(3);
error.Path[0].ShouldEqual("yo");
error.Path[1].ShouldEqual("foo");
error.Path[2].ShouldEqual("bar");
}

[Test]
Expand All @@ -91,22 +88,20 @@ public async void Will_Provide_Path_And_Code_For_Errors_In_Array_Fields()
var error = result.Errors.ElementAt(0);
error.Message.ShouldEqual("Test error.");
error.Code.ShouldEqual("ARGUMENT");
error.Path.Count.ShouldEqual(5);
error.Path[0].ShouldEqual("Blah");
error.Path[1].ShouldEqual("getObject");
error.Path[2].ShouldEqual("arrayField");
error.Path[3].ShouldEqual("1");
error.Path[4].ShouldEqual("test");
error.Path.Count.ShouldEqual(4);
error.Path[0].ShouldEqual("getObject");
error.Path[1].ShouldEqual("arrayField");
error.Path[2].ShouldEqual("1");
error.Path[3].ShouldEqual("test");

error = result.Errors.ElementAt(1);
error.Message.ShouldEqual("Test error.");
error.Code.ShouldEqual("ARGUMENT");
error.Path.Count.ShouldEqual(5);
error.Path[0].ShouldEqual("Blah");
error.Path[1].ShouldEqual("getObject");
error.Path[2].ShouldEqual("arrayField");
error.Path[3].ShouldEqual("3");
error.Path[4].ShouldEqual("test");
error.Path.Count.ShouldEqual(4);
error.Path[0].ShouldEqual("getObject");
error.Path[1].ShouldEqual("arrayField");
error.Path[2].ShouldEqual("3");
error.Path[3].ShouldEqual("test");
}

class Query
Expand Down
Loading

0 comments on commit ad6a84c

Please sign in to comment.