public async Task InvokeAsync(IQueryContext context)
        {
            if (IsContextIncomplete(context))
            {
                context.Result = QueryResultBuilder.CreateError(
                    ErrorBuilder.New()
                    .SetMessage(CoreResources.Write_PQ_Middleware_Incomplete)
                    .SetCode(ErrorCodes.Execution.Incomplete).Build());
                return;
            }

            if (_writeStoredQueries != null &&
                context.Request.Query != null &&
                context.QueryKey != null &&
                context.Result is IReadOnlyQueryResult result &&
                context.Request.Extensions != null &&
                context.Request.Extensions.TryGetValue(_persistedQuery, out var s) &&
                s is IReadOnlyDictionary <string, object> settings)
            {
                IQueryResultBuilder builder = QueryResultBuilder.FromResult(result);

                // hash is found and matches the query key -> store the query
                if (DoHashesMatch(settings, context.QueryKey, _hashName, out string userHash))
                {
                    // save the  query
                    await _writeStoredQueries.WriteQueryAsync(
                        context.QueryKey,
                        context.Request.Query)
                    .ConfigureAwait(false);

                    // add persistence receipt to the result
                    builder.SetExtension(
                        _persistedQuery,
                        new Dictionary <string, object>
                    {
                        { _hashName, userHash },
                        { _persisted, true }
                    });

                    context.ContextData[ContextDataKeys.DocumentSaved] = true;
                }
                else
                {
                    builder.SetExtension(
                        _persistedQuery,
                        new Dictionary <string, object>
                    {
                        { _hashName, userHash },
                        { _expectedValue, context.QueryKey },
                        { _expectedType, _hashName },
                        { _expectedFormat, _hashFormat.ToString() },
                        { _persisted, false }
                    });
                }

                context.Result = builder.Create();
            }

            await _next(context).ConfigureAwait(false);
        }
 private static void DeserializeErrors(
     IQueryResultBuilder result,
     IReadOnlyDictionary <string, object> serializedResult)
 {
     if (serializedResult.TryGetValue(_errors, out object o) &&
         o is IReadOnlyList <object> l)
     {
         foreach (var error in l.OfType <IReadOnlyDictionary <string, object> >())
         {
             result.AddError(ErrorBuilder.FromDictionary(error).Build());
         }
     }
 }
Example #3
0
 private static void DeserializeErrors(
     IQueryResultBuilder result,
     IReadOnlyDictionary <string, object?> serializedResult)
 {
     if (serializedResult.TryGetValue(_errors, out object?o) &&
         o is ListValueNode l)
     {
         foreach (var error in l.Items.OfType <ObjectValueNode>())
         {
             Dictionary <string, object?> dict = _converter.Convert(error);
             result.AddError(ErrorBuilder.FromDictionary(dict).Build());
         }
     }
 }
Example #4
0
        private static void DeserializeErrors(
            IQueryResultBuilder result,
            IReadOnlyDictionary <string, object?> serializedResult)
        {
            if (serializedResult.TryGetValue(_errors, out object?o) &&
                o is IReadOnlyList <object> errors)
            {
                foreach (var obj in errors)
                {
                    IError error = ErrorBuilder
                                   .FromDictionary(DeserializeErrorObject(obj))
                                   .Build();

                    result.AddError(error);
                }
            }
        }