private static ArgType MakeArgType(ISchemaProvider schema, Type type, MemberInfo field) { var markedRequired = false; var typeToUse = type; if (type.IsConstructedGenericType && type.GetGenericTypeDefinition() == typeof(RequiredField <>)) { markedRequired = true; typeToUse = type.GetGenericArguments()[0]; } var arg = new ArgType { Type = new GqlTypeInfo(() => schema.Type(typeToUse.IsConstructedGenericType && typeToUse.GetGenericTypeDefinition() == typeof(EntityQueryType <>) ? typeof(string) : typeToUse.GetNonNullableOrEnumerableType()), typeToUse), Name = field.Name, }; arg.Type.TypeNotNullable = GraphQLNotNullAttribute.IsMemberMarkedNotNull(field) || arg.Type.TypeNotNullable || field.GetCustomAttribute(typeof(RequiredAttribute), false) != null; if (markedRequired) { arg.Type.TypeNotNullable = true; } if (field.GetCustomAttribute(typeof(DescriptionAttribute), false) is DescriptionAttribute d) { arg.Description = d.Description; } return(arg); }
internal Field(string name, LambdaExpression resolve, string description, string returnSchemaType, Type returnClrType, RequiredClaims authorizeClaims) { Name = name; Description = description; returnTypeSingle = returnSchemaType; ReturnTypeClr = returnClrType; AuthorizeClaims = authorizeClaims; if (resolve != null) { if (resolve.Body.NodeType == ExpressionType.Call && ((MethodCallExpression)resolve.Body).Method.DeclaringType == typeof(ArgumentHelper) && ((MethodCallExpression)resolve.Body).Method.Name == "WithService") { // they are wanting services injected var call = (MethodCallExpression)resolve.Body; var lambdaExpression = (LambdaExpression)((UnaryExpression)call.Arguments.First()).Operand; Resolve = lambdaExpression.Body; Services = lambdaExpression.Parameters.Select(p => p.Type).ToList(); } else { Resolve = resolve.Body; } FieldParam = resolve.Parameters.First(); ReturnTypeClr = Resolve.Type; if (resolve.Body.NodeType == ExpressionType.MemberAccess) { ReturnTypeNotNullable = GraphQLNotNullAttribute.IsMemberMarkedNotNull(((MemberExpression)resolve.Body).Member); ReturnElementTypeNullable = GraphQLElementTypeNullable.IsMemberElementMarkedNullable(((MemberExpression)resolve.Body).Member); } } }
internal Field(string name, LambdaExpression resolve, string description, string returnSchemaType = null, Type returnClrType = null) { Name = name; Description = description; ReturnTypeClrSingle = returnSchemaType; ReturnTypeClr = returnClrType; if (resolve != null) { Resolve = resolve.Body; FieldParam = resolve.Parameters.First(); ReturnTypeClr = Resolve.Type; if (resolve.Body.NodeType == ExpressionType.MemberAccess) { ReturnTypeNotNullable = GraphQLNotNullAttribute.IsMemberMarkedNotNull(((MemberExpression)resolve.Body).Member); ReturnElementTypeNullable = GraphQLElementTypeNullable.IsMemberElementMarkedNullable(((MemberExpression)resolve.Body).Member); } if (ReturnTypeClrSingle == null) { if (resolve.Body.Type.IsEnumerableOrArray()) { if (!resolve.Body.Type.IsArray && !resolve.Body.Type.GetGenericArguments().Any()) { throw new ArgumentException($"We think {resolve.Body.Type} is IEnumerable<> or an array but didn't find it's enumerable type"); } ReturnTypeClrSingle = resolve.Body.Type.GetEnumerableOrArrayType().Name; } else { ReturnTypeClrSingle = resolve.Body.Type.Name; } } } }
public Field(string name, LambdaExpression resolve, string description, string returnSchemaType, object argTypes, RequiredClaims claims) : this(name, resolve, description, returnSchemaType, null, claims) { ArgumentTypesObject = argTypes; allArguments = argTypes.GetType().GetProperties().ToDictionary(p => p.Name, p => new ArgType { Type = p.PropertyType, TypeNotNullable = GraphQLNotNullAttribute.IsMemberMarkedNotNull(p), }); argTypes.GetType().GetFields().ToDictionary(p => p.Name, p => new ArgType { Type = p.FieldType, TypeNotNullable = GraphQLNotNullAttribute.IsMemberMarkedNotNull(p), }).ToList().ForEach(kvp => allArguments.Add(kvp.Key, kvp.Value)); }
internal Field(string name, LambdaExpression resolve, string description, string returnSchemaType, Type returnClrType, RequiredClaims authorizeClaims) { Name = name; Description = description; returnTypeSingle = returnSchemaType; ReturnTypeClr = returnClrType; AuthorizeClaims = authorizeClaims; if (resolve != null) { Resolve = resolve.Body; FieldParam = resolve.Parameters.First(); ReturnTypeClr = Resolve.Type; if (resolve.Body.NodeType == ExpressionType.MemberAccess) { ReturnTypeNotNullable = GraphQLNotNullAttribute.IsMemberMarkedNotNull(((MemberExpression)resolve.Body).Member); ReturnElementTypeNullable = GraphQLElementTypeNullable.IsMemberElementMarkedNullable(((MemberExpression)resolve.Body).Member); } } }
public MutationType(string methodName, ISchemaType returnType, object mutationClassInstance, MethodInfo method, string description, RequiredClaims authorizeClaims) { this.Description = description; this.ReturnType = returnType; this.mutationClassInstance = mutationClassInstance; this.method = method; Name = methodName; AuthorizeClaims = authorizeClaims; var methodArg = method.GetParameters().ElementAt(1); this.argInstanceType = methodArg.ParameterType; foreach (var item in argInstanceType.GetProperties()) { if (GraphQLIgnoreAttribute.ShouldIgnoreMemberFromInput(item)) { continue; } argumentTypes.Add(SchemaGenerator.ToCamelCaseStartsLower(item.Name), new ArgType { Type = item.PropertyType, TypeNotNullable = GraphQLNotNullAttribute.IsMemberMarkedNotNull(item) || item.PropertyType.GetTypeInfo().IsEnum }); } foreach (var item in argInstanceType.GetFields()) { if (GraphQLIgnoreAttribute.ShouldIgnoreMemberFromInput(item)) { continue; } argumentTypes.Add(SchemaGenerator.ToCamelCaseStartsLower(item.Name), new ArgType { Type = item.FieldType, TypeNotNullable = GraphQLNotNullAttribute.IsMemberMarkedNotNull(item) || item.FieldType.GetTypeInfo().IsEnum }); } }