Ejemplo n.º 1
0
        private static async Task <ExecutionResult> ExecuteSubscriptionEventAsync(
            IExecutorContext context,
            OperationDefinition subscription,
            IReadOnlyDictionary <string, object?> coercedVariableValues,
            object evnt,
            Func <Exception, ExecutionError> formatError)
        {
            var subscriptionType = context.Schema.Subscription;
            var selectionSet     = subscription.SelectionSet;
            var path             = new NodePath();
            var data             = await SelectionSets.ExecuteSelectionSetAsync(
                context,
                selectionSet,
                subscriptionType,
                evnt,
                path).ConfigureAwait(false);

            var result = new ExecutionResult
            {
                Errors = context.FieldErrors.Select(formatError).ToList(),
                Data   = data?.ToDictionary(kv => kv.Key, kv => kv.Value)
            };

            return(result);
        }
Ejemplo n.º 2
0
        public static async Task <ExecutionResult> ExecuteMutationAsync(
            QueryContext context)
        {
            var(schema, _, operation, initialValue, coercedVariableValues) = context;
            var executionContext = context.BuildExecutorContext(new SerialExecutionStrategy());
            var path             = new NodePath();

            var mutationType = schema.Mutation;

            if (mutationType == null)
            {
                throw new QueryExecutionException(
                          "Schema does not support mutations. Mutation type is null.",
                          path);
            }

            var selectionSet = operation.SelectionSet;
            var data         = await SelectionSets.ExecuteSelectionSetAsync(
                executionContext,
                selectionSet,
                mutationType,
                initialValue,
                path).ConfigureAwait(false);


            return(new ExecutionResult
            {
                Errors = executionContext
                         .FieldErrors
                         .Select(context.FormatError).ToList(),
                Data = data?.ToDictionary(kv => kv.Key, kv => kv.Value)
            });
        }
Ejemplo n.º 3
0
        public static async Task <ExecutionResult> ExecuteQueryAsync(
            QueryContext context)
        {
            var(schema, _, operation, initialValue, coercedVariableValues) = context;
            var queryType = schema.Query;
            var path      = new NodePath();

            if (queryType == null)
            {
                throw new QueryExecutionException(
                          "Schema does not support queries. Query type is null.",
                          path);
            }

            var selectionSet     = operation.SelectionSet;
            var executionContext = context.BuildExecutorContext(new ParallelExecutionStrategy());

            IDictionary <string, object> data;

            try
            {
                data = await SelectionSets.ExecuteSelectionSetAsync(
                    executionContext,
                    selectionSet,
                    queryType,
                    initialValue,
                    path).ConfigureAwait(false);
            }
            catch (QueryExecutionException e)
            {
                executionContext.AddError(e);
                data = null;
            }

            return(new ExecutionResult
            {
                Errors = executionContext
                         .FieldErrors
                         .Select(context.FormatError)
                         .ToList(),
                Data = data?.ToDictionary(kv => kv.Key, kv => kv.Value)
            });
        }
Ejemplo n.º 4
0
        public static async Task <ISubscriberResult> CreateSourceEventStreamAsync(
            IExecutorContext context,
            OperationDefinition subscription,
            IReadOnlyDictionary <string, object?> coercedVariableValues,
            object initialValue,
            CancellationToken cancellationToken)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            if (subscription == null)
            {
                throw new ArgumentNullException(nameof(subscription));
            }
            if (coercedVariableValues == null)
            {
                throw new ArgumentNullException(nameof(coercedVariableValues));
            }

            cancellationToken.ThrowIfCancellationRequested();

            var schema           = context.Schema;
            var subscriptionType = schema.Subscription;
            var groupedFieldSet  = SelectionSets.CollectFields(
                context.Schema,
                context.Document,
                subscriptionType,
                subscription.SelectionSet,
                coercedVariableValues
                );

            var fields         = groupedFieldSet.Values.First();
            var fieldName      = fields.First().Name;
            var fieldSelection = fields.First();

            var coercedArgumentValues = Arguments.CoerceArgumentValues(
                schema,
                subscriptionType,
                fieldSelection,
                coercedVariableValues);

            var field          = schema.GetField(subscriptionType.Name, fieldName);
            var path           = new NodePath();
            var resolveContext = new ResolverContext(
                subscriptionType,
                initialValue,
                field,
                fieldSelection,
                fields,
                coercedArgumentValues,
                path,
                context);

            var subscriber = schema.GetSubscriber(subscriptionType.Name, fieldName);

            if (subscriber == null)
            {
                throw new QueryExecutionException(
                          $"Could not subscribe. Field '{subscriptionType}:{fieldName}' does not have subscriber",
                          path);
            }

            var subscribeResult = await subscriber(resolveContext, cancellationToken)
                                  .ConfigureAwait(false);

            return(subscribeResult);
        }