コード例 #1
0
        private void AddRootEntityFields(ISchema schema)
        {
            var query = schema.Query;

            if (query == null)
            {
                schema.Query = query = new ObjectGraphType {
                    Name = "Query"
                };
            }

            query.Field("_service", new NonNullGraphType(new GraphQLTypeReference("_Service")), resolve: context => new { });

            var representationsType = new NonNullGraphType(new ListGraphType(new NonNullGraphType(new GraphQLTypeReference("_Any"))));

            query.FieldAsync(
                "_entities",
                new NonNullGraphType(new ListGraphType(new GraphQLTypeReference("_Entity"))),
                arguments: new QueryArguments(new QueryArgument(representationsType)
            {
                Name = "representations"
            }),
                resolve: async context =>
            {
                AddTypeNameToSelection(context.FieldAst, context.Document);

                var reps = context.GetArgument <List <Dictionary <string, object> > >("representations");

                var results = new List <object?>();

                foreach (var rep in reps !)
                {
                    var typeName = rep !["__typename"].ToString();
                    var type     = context.Schema.AllTypes[typeName !];
        public void ToITypeNonNullBase()
        {
            var nonnullType = new NonNullGraphType(new GraphQLTypeReference(typeof(ATestGraphQLClass).Name));

            ((nonnullType.ToIType() as NonNullType)
             .Type as NamedType).Name.Should().Be(typeof(ATestGraphQLClass).Name);
        }
コード例 #3
0
        private void AddRootEntityFields(ISchema schema)
        {
            var query = schema.Query;

            if (query == null)
            {
                schema.Query = query = new ObjectGraphType {
                    Name = "Query"
                };
            }

            query.Field("_service", new NonNullGraphType(new GraphQLTypeReference("_Service")), resolve: context => new { });

            var representationsType = new NonNullGraphType(new ListGraphType(new NonNullGraphType(new GraphQLTypeReference("_Any"))));

            query.FieldAsync(
                "_entities",
                new NonNullGraphType(new ListGraphType(new GraphQLTypeReference("_Entity"))),
                arguments: new QueryArguments(new QueryArgument(representationsType)
            {
                Name = "representations"
            }),
                resolve: async context =>
            {
                AddTypeNameToSelection(context.FieldAst, context.Document);

                var reps = context.GetArgument <List <Dictionary <string, object> > >("representations");

                var results = new List <object?>();

                foreach (var rep in reps !)
                {
                    var typeName = rep !["__typename"].ToString();
                    var type     = context.Schema.AllTypes[typeName];
                    if (type != null)
                    {
                        // execute resolver
                        var resolver = type.GetMetadata <IFederatedResolver>(RESOLVER_METADATA_FIELD);
                        if (resolver != null)
                        {
                            var resolveContext = new FederatedResolveContext
                            {
                                Arguments          = rep !,
                                ParentFieldContext = context
                            };
                            var result = await resolver.Resolve(resolveContext).ConfigureAwait(false);
                            results.Add(result);
                        }
                        else
                        {
                            results.Add(rep);
                        }
                    }
                    else
                    {
                        // otherwise return the representation
                        results.Add(rep);
                    }
                }
コード例 #4
0
        public void IsListType_NonNullOfListGraphType_ReturnsFTrue()
        {
            var graphType = new NonNullGraphType(new ListGraphType(new ObjectGraphType()));

            var isListType = graphType.IsListType();

            isListType.Should().BeTrue();
        }
コード例 #5
0
        private string build_schema(string propType)
        {
            var nestedObjType = new ObjectGraphType
            {
                Name = "NestedObjType"
            };

            nestedObjType.AddField(new FieldType
            {
                ResolvedType = new IntGraphType(),
                Name         = "intField"
            });
            var rootType = new ObjectGraphType {
                Name = "root"
            };
            IGraphType resolvedType;

            switch (propType)
            {
            case "none":
            {
                resolvedType = nestedObjType;
                break;
            }

            case "list":
            {
                resolvedType = new ListGraphType(nestedObjType);
                break;
            }

            case "non-null":
            {
                resolvedType = new NonNullGraphType(nestedObjType);
                break;
            }

            default:
            {
                throw new NotSupportedException();
            }
            }

            rootType.AddField(new FieldType
            {
                Name         = "listOfObjField",
                ResolvedType = resolvedType
            });

            var s = new Schema
            {
                Query = rootType
            };
            var schema = new SchemaPrinter(s).Print();

            return(schema);
        }
コード例 #6
0
 private static bool HasFullSpecifiedResolvedType(IProvideResolvedType type)
 {
     return(type.ResolvedType switch
     {
         null => false,
         ListGraphType list => HasFullSpecifiedResolvedType(list),
         NonNullGraphType nonNull => HasFullSpecifiedResolvedType(nonNull),
         _ => true, // not null
     });
コード例 #7
0
        public ContentDataGraphInputType(IGraphModel model, ISchemaEntity schema)
        {
            var schemaType = schema.TypeName();
            var schemaName = schema.DisplayName();

            Name = $"{schemaType}InputDto";

            foreach (var field in schema.SchemaDef.Fields.Where(x => !x.IsHidden))
            {
                var inputType = model.GetInputGraphType(field);

                if (inputType != null)
                {
                    if (field.RawProperties.IsRequired)
                    {
                        inputType = new NonNullGraphType(inputType);
                    }

                    var fieldName = field.RawProperties.Label.WithFallback(field.Name);

                    var fieldGraphType = new InputObjectGraphType
                    {
                        Name = $"{schemaType}Data{field.Name.ToPascalCase()}InputDto"
                    };

                    var partition = model.ResolvePartition(field.Partitioning);

                    foreach (var partitionItem in partition)
                    {
                        fieldGraphType.AddField(new FieldType
                        {
                            Name         = partitionItem.Key,
                            ResolvedType = inputType,
                            Resolver     = null,
                            Description  = field.RawProperties.Hints
                        });
                    }

                    fieldGraphType.Description = $"The input structure of the {fieldName} of a {schemaName} content type.";

                    var fieldResolver = new FuncFieldResolver <NamedContentData, ContentFieldData>(c => c.Source.GetOrDefault(field.Name));

                    AddField(new FieldType
                    {
                        Name         = field.Name.ToCamelCase(),
                        Resolver     = fieldResolver,
                        ResolvedType = fieldGraphType,
                        Description  = $"The {fieldName} field."
                    });
                }
            }

            Description = $"The structure of a {schemaName} content type.";
        }
コード例 #8
0
        public void AddNavigationProperties(FieldType fieldType)
        {
            Type entityType      = GetEntityTypeFromResolvedType(((ListGraphType)fieldType.ResolvedType).ResolvedType);
            var  entityGraphType = (IObjectGraphType)_clrTypeToObjectGraphType[entityType];

            foreach (PropertyInfo propertyInfo in entityType.GetProperties())
            {
                if (!entityGraphType.HasField(propertyInfo.Name))
                {
                    IGraphType?     resolvedType;
                    QueryArgument[] queryArguments;
                    Type?           itemType = Parsers.OeExpressionHelper.GetCollectionItemTypeOrNull(propertyInfo.PropertyType);
                    if (itemType == null)
                    {
                        if (!_clrTypeToObjectGraphType.TryGetValue(propertyInfo.PropertyType, out resolvedType))
                        {
                            continue;
                        }

                        queryArguments = CreateQueryArguments(propertyInfo.PropertyType, true);
                    }
                    else
                    {
                        if (!_clrTypeToObjectGraphType.TryGetValue(itemType, out resolvedType))
                        {
                            continue;
                        }

                        resolvedType   = new ListGraphType(resolvedType);
                        queryArguments = CreateQueryArguments(itemType, true);
                    }

                    if (IsRequired(propertyInfo))
                    {
                        resolvedType = new NonNullGraphType(resolvedType);
                    }

                    var entityFieldType = new FieldType()
                    {
                        Arguments    = new QueryArguments(queryArguments),
                        Name         = propertyInfo.Name,
                        ResolvedType = resolvedType,
                        Resolver     = new FieldResolver(propertyInfo),
                    };
                    entityGraphType.AddField(entityFieldType);
                }
            }

            fieldType.Arguments = new QueryArguments(CreateQueryArguments(entityType, false));
        }
コード例 #9
0
        public static QueryArguments GetArguments(Type parametersType, IGraphQueryHandler graphQuery, Boolean isInput)
        {
            var qas = new List <QueryArgument>();

            foreach (var prop in parametersType.GetProperties().Where(i => i.CanWrite))
            {
                var type = GetGraphType(prop.PropertyType, isInput);

                var allowNulls = prop.GetCustomAttribute <AllowNullAttribute>() != null;

                var description = prop.GetCustomAttribute <DescriptionAttribute>()?.Description;

                if (type == null)
                {
                    var gType = GetQueryItemType(graphQuery, prop.PropertyType, true);
                    if (!allowNulls && isInput)
                    {
                        gType = new NonNullGraphType(gType);
                    }

                    qas.Add(new QueryArgument(gType)
                    {
                        Name = prop.Name, Description = description
                    });
                }
                else
                {
                    if (!allowNulls && isInput)
                    {
                        if (!type.IsGenericType || type.GetGenericTypeDefinition() != typeof(NonNullGraphType <>))
                        {
                            type = typeof(NonNullGraphType <>).MakeGenericType(type);
                        }
                    }
                    else
                    {
                        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(NonNullGraphType <>))
                        {
                            type = type.GetGenericArguments()[0];
                        }
                    }

                    qas.Add(new QueryArgument(type)
                    {
                        Name = prop.Name, Description = description
                    });
                }
            }
            return(new QueryArguments(qas));
        }
コード例 #10
0
        public static IEnumerable <FieldType> GetFields(Type modelType, IGraphQueryHandler graphQuery, Boolean isInput)
        {
            var qas = new List <FieldType>();

            foreach (var prop in modelType.GetProperties())
            {
                var description = prop.GetCustomAttribute <DescriptionAttribute>()?.Description;

                var allowNulls = prop.GetCustomAttribute <AllowNullAttribute>() != null;

                var type = GetGraphType(prop.PropertyType, isInput);

                if (type == null)
                {
                    var gType = GetQueryItemType(graphQuery, prop.PropertyType, isInput);

                    if (!allowNulls && isInput)
                    {
                        gType = new NonNullGraphType(gType);
                    }

                    qas.Add(new FieldType {
                        ResolvedType = gType, Name = prop.Name, Description = description
                    });
                }
                else
                {
                    if (!allowNulls && isInput)
                    {
                        if (!type.IsGenericType || type.GetGenericTypeDefinition() != typeof(NonNullGraphType <>))
                        {
                            type = typeof(NonNullGraphType <>).MakeGenericType(type);
                        }
                    }
                    else
                    {
                        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(NonNullGraphType <>))
                        {
                            type = type.GetGenericArguments()[0];
                        }
                    }

                    qas.Add(new FieldType {
                        Type = type, Name = prop.Name, Description = description
                    });
                }
            }
            return(qas);
        }
コード例 #11
0
        public void NonNull_ResolvedType_And_Type_Should_Match()
        {
            var type = new NonNullGraphType <StringGraphType>();

            Should.Throw <ArgumentOutOfRangeException>(() => type.ResolvedType = new IntGraphType()).Message.ShouldStartWith("Type 'StringGraphType' should be assignable from ResolvedType 'IntGraphType'.");
        }
コード例 #12
0
        /// <summary>
        /// Initializes a new instance of the <c>__Type</c> introspection type.
        /// </summary>
        /// <param name="allowAppliedDirectives">Allows 'appliedDirectives' field for this type. It is an experimental feature.</param>
        public __Type(bool allowAppliedDirectives = false)
        {
            Name = nameof(__Type);

            Description =
                "The fundamental unit of any GraphQL Schema is the type. There are " +
                "many kinds of types in GraphQL as represented by the `__TypeKind` enum." +
                @"

" +
                "Depending on the kind of a type, certain fields describe " +
                "information about that type. Scalar types provide no information " +
                "beyond a name and description, while Enum types provide their values. " +
                "Object and Interface types provide the fields they describe. Abstract " +
                "types, Union and Interface, provide the Object types possible " +
                "at runtime. List and NonNull types compose other types.";

            Field <NonNullGraphType <__TypeKind> >("kind", resolve: context =>
            {
                return(context.Source is IGraphType type
                    ? KindForInstance(type)
                    : throw new InvalidOperationException($"Unknown kind of type: {context.Source}"));
            });

            Field <StringGraphType>("name", resolve: context => context.Source !.Name);

            Field <StringGraphType>("description");

            FieldAsync <ListGraphType <NonNullGraphType <__Field> > >("fields", null,
                                                                      new QueryArguments(
                                                                          new QueryArgument <BooleanGraphType>
            {
                Name         = "includeDeprecated",
                DefaultValue = BoolBox.False
            }),
                                                                      async context =>
            {
                if (context.Source is IObjectGraphType || context.Source is IInterfaceGraphType)
                {
                    var type   = (IComplexGraphType)context.Source;
                    var fields = context.ArrayPool.Rent <FieldType>(type.Fields.Count);

                    bool includeDeprecated = context.GetArgument <bool>("includeDeprecated");

                    int index = 0;
                    foreach (var field in type.Fields.List)
                    {
                        if ((includeDeprecated || string.IsNullOrWhiteSpace(field.DeprecationReason)) && await context.Schema.Filter.AllowField(type, field).ConfigureAwait(false))
                        {
                            fields[index++] = field;
                        }
                    }

                    var comparer = context.Schema.Comparer.FieldComparer(type);
                    if (comparer != null)
                    {
                        Array.Sort(fields, 0, index, comparer);
                    }

                    return(fields.Constrained(index));
                }
                return(null);
            });

            FieldAsync <ListGraphType <NonNullGraphType <__Type> > >("interfaces", resolve: async context =>
            {
                if (context.Source is IImplementInterfaces type)
                {
                    var interfaces = context.ArrayPool.Rent <IInterfaceGraphType>(type.ResolvedInterfaces.Count);

                    int index = 0;
                    foreach (var resolved in type.ResolvedInterfaces.List)
                    {
                        if (await context.Schema.Filter.AllowType(resolved).ConfigureAwait(false))
                        {
                            interfaces[index++] = resolved;
                        }
                    }

                    var comparer = context.Schema.Comparer.TypeComparer;
                    if (comparer != null)
                    {
                        Array.Sort(interfaces, 0, index, comparer);
                    }

                    return(interfaces.Constrained(index));
                }

                return(null);
            });

            FieldAsync <ListGraphType <NonNullGraphType <__Type> > >("possibleTypes", resolve: async context =>
            {
                if (context.Source is IAbstractGraphType type)
                {
                    var possibleTypes = context.ArrayPool.Rent <IObjectGraphType>(type.PossibleTypes.Count);

                    int index = 0;
                    foreach (var possible in type.PossibleTypes.List)
                    {
                        if (await context.Schema.Filter.AllowType(possible).ConfigureAwait(false))
                        {
                            possibleTypes[index++] = possible;
                        }
                    }

                    var comparer = context.Schema.Comparer.TypeComparer;
                    if (comparer != null)
                    {
                        Array.Sort(possibleTypes, 0, index, comparer);
                    }

                    return(possibleTypes.Constrained(index));
                }

                return(null);
            });

            FieldAsync <ListGraphType <NonNullGraphType <__EnumValue> > >("enumValues",
                                                                          arguments: new QueryArguments(new QueryArgument <BooleanGraphType>
            {
                Name         = "includeDeprecated",
                DefaultValue = BoolBox.False
            }),
                                                                          resolve: async context =>
            {
                if (context.Source is EnumerationGraphType type)
                {
                    var enumValueDefinitions = context.ArrayPool.Rent <EnumValueDefinition>(type.Values.Count);

                    bool includeDeprecated = context.GetArgument <bool>("includeDeprecated");

                    int index = 0;
                    foreach (var def in type.Values.List)
                    {
                        if ((includeDeprecated || string.IsNullOrWhiteSpace(def.DeprecationReason)) && await context.Schema.Filter.AllowEnumValue(type, def).ConfigureAwait(false))
                        {
                            enumValueDefinitions[index++] = def;
                        }
                    }

                    var comparer = context.Schema.Comparer.EnumValueComparer(type);
                    if (comparer != null)
                    {
                        Array.Sort(enumValueDefinitions, 0, index, comparer);
                    }

                    return(enumValueDefinitions.Constrained(index));
                }

                return(null);
            });

            FieldAsync <ListGraphType <NonNullGraphType <__InputValue> > >("inputFields", resolve: async context =>
            {
                if (context.Source is IInputObjectGraphType type)
                {
                    var inputFields = context.ArrayPool.Rent <FieldType>(type.Fields.Count);

                    int index = 0;
                    foreach (var field in type.Fields.List)
                    {
                        if (await context.Schema.Filter.AllowField(type, field).ConfigureAwait(false))
                        {
                            inputFields[index++] = field;
                        }
                    }

                    var comparer = context.Schema.Comparer.FieldComparer(type);
                    if (comparer != null)
                    {
                        Array.Sort(inputFields, 0, index, comparer);
                    }

                    return(inputFields.Constrained(index));
                }

                return(null);
            });

            Field <__Type>("ofType", resolve: context =>
            {
                return(context.Source switch
                {
                    NonNullGraphType nonNull => nonNull.ResolvedType,
                    ListGraphType list => list.ResolvedType,
                    _ => null
                });
コード例 #13
0
        public AppMutationsGraphType(Builder builder, IEnumerable <SchemaInfo> schemas)
        {
            foreach (var schemaInfo in schemas.Where(x => x.Fields.Count > 0))
            {
                var contentType = new NonNullGraphType(builder.GetContentType(schemaInfo));

                var inputType = new DataInputGraphType(builder, schemaInfo);

                AddField(new FieldType
                {
                    Name         = $"create{schemaInfo.TypeName}Content",
                    Arguments    = ContentActions.Create.Arguments(inputType),
                    ResolvedType = contentType,
                    Resolver     = ContentActions.Create.Resolver,
                    Description  = $"Creates an {schemaInfo.DisplayName} content."
                }).WithSchemaNamedId(schemaInfo);

                AddField(new FieldType
                {
                    Name         = $"update{schemaInfo.TypeName}Content",
                    Arguments    = ContentActions.Update.Arguments(inputType),
                    ResolvedType = contentType,
                    Resolver     = ContentActions.Update.Resolver,
                    Description  = $"Update an {schemaInfo.DisplayName} content by id."
                }).WithSchemaNamedId(schemaInfo);

                AddField(new FieldType
                {
                    Name         = $"upsert{schemaInfo.TypeName}Content",
                    Arguments    = ContentActions.Upsert.Arguments(inputType),
                    ResolvedType = contentType,
                    Resolver     = ContentActions.Upsert.Resolver,
                    Description  = $"Upsert an {schemaInfo.DisplayName} content by id."
                }).WithSchemaNamedId(schemaInfo);

                AddField(new FieldType
                {
                    Name         = $"patch{schemaInfo.TypeName}Content",
                    Arguments    = ContentActions.Patch.Arguments(inputType),
                    ResolvedType = contentType,
                    Resolver     = ContentActions.Patch.Resolver,
                    Description  = $"Patch an {schemaInfo.DisplayName} content by id."
                }).WithSchemaNamedId(schemaInfo);

                AddField(new FieldType
                {
                    Name         = $"change{schemaInfo.TypeName}Content",
                    Arguments    = ContentActions.ChangeStatus.Arguments,
                    ResolvedType = contentType,
                    Resolver     = ContentActions.ChangeStatus.Resolver,
                    Description  = $"Change a {schemaInfo.DisplayName} content."
                }).WithSchemaNamedId(schemaInfo);

                AddField(new FieldType
                {
                    Name         = $"delete{schemaInfo.TypeName}Content",
                    Arguments    = ContentActions.Delete.Arguments,
                    ResolvedType = EntitySavedGraphType.NonNull,
                    Resolver     = ContentActions.Delete.Resolver,
                    Description  = $"Delete an {schemaInfo.DisplayName} content."
                }).WithSchemaNamedId(schemaInfo);

                AddField(new FieldType
                {
                    Name              = $"publish{schemaInfo.TypeName}Content",
                    Arguments         = ContentActions.ChangeStatus.Arguments,
                    ResolvedType      = contentType,
                    Resolver          = ContentActions.ChangeStatus.Resolver,
                    Description       = $"Publish a {schemaInfo.DisplayName} content.",
                    DeprecationReason = $"Use 'change{schemaInfo.TypeName}Content' instead"
                }).WithSchemaNamedId(schemaInfo);
            }

            Description = "The app mutations.";
        }
        public void NonNullListsAreListGraphType()
        {
            var nonnullListType = new NonNullGraphType(new ListGraphType(new GraphQLTypeReference(typeof(ATestGraphQLClass).Name)));

            nonnullListType.IsListGraphType().Should().BeTrue();
        }