示例#1
0
        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);
        }
示例#2
0
        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);
                }
            }
        }
示例#3
0
        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;
                    }
                }
            }
        }
示例#4
0
 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));
 }
示例#5
0
        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);
                }
            }
        }
示例#6
0
        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
                });
            }
        }