Ejemplo n.º 1
0
        protected virtual FieldType ToSubscriptionFieldType(string parentTypeName, GraphQLFieldDefinition fieldDef)
        {
            var typeConfig  = Types.For(parentTypeName);
            var fieldConfig = typeConfig.SubscriptionFieldFor(fieldDef.Name.Value, ServiceProvider);

            var field = new EventStreamFieldType
            {
                Name              = fieldDef.Name.Value,
                Description       = fieldConfig.Description ?? fieldDef.Comment?.Text,
                ResolvedType      = ToGraphType(fieldDef.Type),
                Resolver          = fieldConfig.Resolver,
                Subscriber        = fieldConfig.Subscriber,
                AsyncSubscriber   = fieldConfig.AsyncSubscriber,
                DeprecationReason = fieldConfig.DeprecationReason
            };

            CopyMetadata(field, fieldConfig);

            field.Arguments = ToQueryArguments(fieldDef.Arguments);

            field.SetAstType(fieldDef);

            VisitNode(field, v => v.VisitFieldDefinition(field));

            return(field);
        }
        protected virtual FieldType ToSubscriptionFieldType(string parentTypeName, GraphQLFieldDefinition fieldDef)
        {
            var typeConfig = Types.For(parentTypeName);

            AssertKnownType(typeConfig);

            var fieldConfig = typeConfig.FieldFor((string)fieldDef.Name.Value);

            InitializeSubscriptionField(fieldConfig, typeConfig.Type);

            AssertKnownField(fieldConfig, typeConfig);

            var field = new EventStreamFieldType
            {
                Name            = fieldConfig.Name,
                Description     = fieldConfig.Description ?? fieldDef.Description?.Value.ToString() ?? fieldDef.Comment?.Text.ToString(),
                ResolvedType    = ToGraphType(fieldDef.Type),
                Resolver        = fieldConfig.Resolver,
                Subscriber      = fieldConfig.Subscriber,
                AsyncSubscriber = fieldConfig.AsyncSubscriber,
            };

            fieldConfig.CopyMetadataTo(field);

            field.Arguments = ToQueryArguments(fieldConfig, fieldDef.Arguments);

            field.SetAstType(fieldDef);
            OverrideDeprecationReason(field, fieldConfig.DeprecationReason);

            return(field);
        }
        protected virtual FieldType ToSubscriptionFieldType(string parentTypeName, GraphQLFieldDefinition fieldDef)
        {
            var typeConfig  = Types.For(parentTypeName);
            var fieldConfig = typeConfig.SubscriptionFieldFor(fieldDef.Name.Value, DependencyResolver);

            var field = new EventStreamFieldType();

            field.Name            = fieldDef.Name.Value;
            field.Description     = fieldConfig.Description;
            field.ResolvedType    = ToGraphType(fieldDef.Type);
            field.Resolver        = fieldConfig.Resolver;
            field.Subscriber      = fieldConfig.Subscriber;
            field.AsyncSubscriber = fieldConfig.AsyncSubscriber;

            CopyMetadata(field, fieldConfig);

            var args = fieldDef.Arguments.Select(ToArguments);

            field.Arguments = new QueryArguments(args);

            ApplyDeprecatedDirective(fieldDef.Directives, reason =>
            {
                field.DeprecationReason = fieldConfig.DeprecationReason ?? reason;
            });

            return(field);
        }
Ejemplo n.º 4
0
        public CatalogDiscountType(IMediator mediator, IDataLoaderContextAccessor dataLoader)
        {
            var promotion = new EventStreamFieldType
            {
                Name      = "promotion",
                Type      = GraphTypeExtenstionHelper.GetActualType <PromotionType>(),
                Arguments = new QueryArguments(),
                Resolver  = new FuncFieldResolver <Discount, IDataLoaderResult <Promotion> >(context =>
                {
                    var loader = dataLoader.Context.GetOrAddBatchLoader <string, Promotion>("promotionsLoader", (ids) => LoadPromotionsAsync(mediator, ids));
                    return(loader.LoadAsync(context.Source.PromotionId));
                })
            };

            AddField(promotion);
        }
        public DynamicSubscriptionType(IGraphQlTypePool graphTypePool, IEnumerable <Type> types)
        {
            Name        = "Subscriptions";
            Description = "Contains the subscriptions of the graphql api";

            foreach (var type in types)
            {
                if (!type.IsClass || type.IsInterface)
                {
                    throw new ArgumentException("Invalid subscription type");
                }

                // Generate fields -----------------------------------------------
                // start with the properties
                var properties = type
                                 // Get all properties with getters
                                 .GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.GetProperty)
                                 // ignore the ones that have the ignore attribute
                                 .Where(x => x.GetAttribute <IgnoreAttribute>() == null);

                foreach (var property in properties)
                {
                    var observableType = property.PropertyType.GetInterfacesIncludingType()
                                         .FirstOrDefault(x => x.IsGenericType && x.GetGenericTypeDefinition().Equals(typeof(IObservable <>)));

                    if (observableType == null)
                    {
                        throw new InvalidOperationException("Subscription property can only return or have type IObservable<>, derive from it or have the IgnoreAttribute");
                    }

                    var graphType       = graphTypePool.GetGraphType(observableType.GetGenericArguments()[0]);
                    var descriptionAttr = property.GetAttribute <DescriptionAttribute>();
                    var fieldNameAttr   = property.GetAttribute <NameAttribute>();
                    var isNonNull       = property.GetAttribute <NonNullAttribute>() != null;

                    var field = new EventStreamFieldType()
                    {
                        Name         = fieldNameAttr == null ? property.Name : fieldNameAttr.Name,
                        Description  = descriptionAttr?.Description ?? DocXmlHelper.DocReader.GetMemberComments(property).Summary,
                        ResolvedType = isNonNull ? new NonNullGraphType(graphType) : graphType,
                        Resolver     = new FuncFieldResolver <object>(ResolveObject),
                        Subscriber   = new EventStreamResolver <object>(c => Subscribe(c, property, type))
                    };

                    // add the .net type of this field in the metadata
                    field.Metadata["type"] = property;

                    var metadatas = Attribute.GetCustomAttributes(type, typeof(MetadataAttribute));
                    foreach (MetadataAttribute metadata in metadatas)
                    {
                        Metadata[metadata.Key] = metadata.Value;
                    }

                    AddField(field);
                }

                // work with the methods
                var methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly)
                              .Where(x => x.GetAttribute <IgnoreAttribute>() == null);

                foreach (var method in methods)
                {
                    if (method.IsSpecialName)
                    {
                        continue;
                    }

                    var descriptionAttr = method.GetAttribute <DescriptionAttribute>();
                    var fieldNameAttr   = method.GetAttribute <NameAttribute>();

                    IGraphType                graphType;
                    IEventStreamResolver      subscriber      = null;
                    IAsyncEventStreamResolver subscriberAsync = null;
                    if (method.ReturnType.IsGenericType && method.ReturnType.GetGenericTypeDefinition() == typeof(Task <>))
                    {
                        var observable = method.ReturnType.GetGenericArguments()[0];

                        var observableInterface = observable.GetInterfacesIncludingType()
                                                  .FirstOrDefault(x => x.IsGenericType && x.GetGenericTypeDefinition().Equals(typeof(IObservable <>)));

                        if (observableInterface == null)
                        {
                            throw new InvalidOperationException("Subscription property can only return or have type IObservable<>, derive from it or have the IgnoreAttribute");
                        }

                        var observableType = observableInterface.GetGenericArguments()[0];

                        graphType       = graphTypePool.GetGraphType(observableType);
                        subscriberAsync = new AsyncEventStreamResolver <object>(async c =>
                        {
                            var task = GraphQlHelpers.ExecuteResolverFunction(method, c, type, true);
                            await((Task)task);

                            var resultProp = task.GetType().GetProperty(nameof(Task <object> .Result));
                            var result     = resultProp.GetValue(task);

                            return(result as IObservable <object>);
                        });
                    }
                    else
                    {
                        var observable = method.ReturnType;

                        var observableInterface = observable.GetInterfacesIncludingType()
                                                  .FirstOrDefault(x => x.IsGenericType && x.GetGenericTypeDefinition().Equals(typeof(IObservable <>)));

                        var observableType = observableInterface.GetGenericArguments()[0];

                        graphType  = graphTypePool.GetGraphType(observableType);
                        subscriber = new EventStreamResolver <object>(c => GraphQlHelpers.ExecuteResolverFunction(method, c, type, true) as IObservable <object>);
                    }

                    var isNonNull = method.GetAttribute <NonNullAttribute>() != null;

                    // create field
                    var field = new EventStreamFieldType()
                    {
                        Arguments       = GraphQlHelpers.GetArguments(graphTypePool, method),
                        Name            = fieldNameAttr == null ? method.Name : fieldNameAttr.Name,
                        Description     = descriptionAttr?.Description ?? DocXmlHelper.DocReader.GetMemberComments(method).Summary,
                        ResolvedType    = isNonNull ? new NonNullGraphType(graphType) : graphType,
                        Resolver        = new FuncFieldResolver <object>(ResolveObject),
                        Subscriber      = subscriber,
                        AsyncSubscriber = subscriberAsync
                    };

                    // add the .net type of this field in the metadata
                    field.Metadata["type"] = method;

                    var metadatas = Attribute.GetCustomAttributes(type, typeof(MetadataAttribute));
                    foreach (MetadataAttribute metadata in metadatas)
                    {
                        Metadata[metadata.Key] = metadata.Value;
                    }

                    AddField(field);
                }
            }
        }
 public GraphFieldBuilder()
 {
     _instance = new EventStreamFieldType();
 }