示例#1
0
        public async Task <IActionResult> Post([FromBody] GraphQlQuery query)
        {
            var inputs = query.Variables.ToInputs();

            var schema = new Schema()
            {
                Query    = new DieterQuery(_db),
                Mutation = new DieterMutation(_db, _userManager, _signInManager)
            };

            var result = await new DocumentExecuter().ExecuteAsync(_ =>
            {
                _.Schema        = schema;
                _.Query         = query.Query;
                _.OperationName = query.OperationName;
                _.Inputs        = inputs;
            }).ConfigureAwait(false);

            if (result.Errors?.Count > 0)
            {
                return(BadRequest());
            }

            return(Ok(result));
        }
示例#2
0
        public async Task SimplePersonInsert()
        {
            GraphQlQuery graphQuery = new GraphQlQuery();

            graphQuery.OperationName = "addPerson";
            graphQuery.Variables     = JObject.Parse(@"{""person"":{""firstName"":""Joe"",""lastName"":""Doe""}}");

            graphQuery.Query = @"
mutation ($person: PersonInput!) {
  addPerson(person: $person) {
    firstName
    lastName
  }
}";

            var json = await fixture.QueryGraphQLAsync(graphQuery);

            var expectedJson = @"
            {
                data: {
                    addPerson: {
                        firstName: 'Joe',
                        lastName: 'Doe'
                    }
                }
            }";

            Assert.True(fixture.JsonEquals(expectedJson, json));
        }
示例#3
0
        /// <summary>
        /// Resolves all queries on guest accesses
        /// </summary>
        /// <param name="graphQlQuery"></param>
        public void ResolveQuery(GraphQlQuery graphQlQuery)
        {
            // LANGUAGES: a list of all lang codes
            graphQlQuery.FieldAsync <SearchResultType>(
                "searchResults",
                arguments: new QueryArguments(
                    new QueryArgument <NonNullGraphType <StringGraphType> > {
                Name = "query"
            }
                    ),
                resolve: async(context) =>
            {
                var searchResult = await _searchUseCase.Handle(new SearchRequest(
                                                                   context.GetArgument <string>("query")
                                                                   ));

                var channelsWithTruncatedDescription =
                    TruncateChannelDescriptions(searchResult.Channels);

                var truncatedDescriptionResults = searchResult with {
                    Channels = channelsWithTruncatedDescription
                };

                // map entity to model
                return(_mapper.Map <SearchResultModel>(truncatedDescriptionResults));
            }
                );
        }
示例#4
0
        /// <summary>
        /// Resolves all queries on guest accesses
        /// </summary>
        /// <param name="graphQlQuery"></param>
        public void ResolveQuery(GraphQlQuery graphQlQuery)
        {
            // LANGUAGES: a list of all lang codes
            graphQlQuery.FieldAsync <BooleanGraphType>(
                "flagExists",
                arguments: new QueryArguments(
                    new QueryArgument <NonNullGraphType <StringGraphType> > {
                Name = "channelId"
            }
                    ),
                resolve: async(context) =>
            {
                // read user context dictionary
                var userContext = (GraphQlUserContext)context.UserContext;
                var userId      = userContext.GetUserId();

                // require user to be authenticated
                if (userId == null)
                {
                    return(false);
                }

                // map entity to model
                return(await _flagRepository.FlagExists(
                           context.GetArgument <string>("channelId"),
                           userId
                           ));
            }
                );
        }
        public async Task <IActionResult> Post([FromBody] GraphQlQuery query)
        {
            if (query == null)
            {
                throw new ArgumentNullException(nameof(query));
            }

            var executionOptions = new ExecutionOptions
            {
                Schema = Schema,
                Query  = query.Query
            };

            try
            {
                var result = await DocumentExecuter.ExecuteAsync(executionOptions).ConfigureAwait(false);

                if (result.Errors?.Count > 0)
                {
                    _logger.LogError("GraphQL errors: {0}", result.Errors);
                    return(BadRequest(result));
                }

                _logger.LogDebug("GraphQL execution result: {result}", JsonConvert.SerializeObject(result.Data));
                return(Ok(result));
            }
            catch (Exception ex)
            {
                _logger.LogError("Document executer exception", ex);
                return(BadRequest(ex));
            }
        }
示例#6
0
        public async Task <IHttpActionResult> Post([FromBody] GraphQlQuery query)
        {
            if (query == null)
            {
                throw new ArgumentNullException(nameof(query));
            }

            var exectionOptions = new ExecutionOptions
            {
                Schema = _schema,
                Query  = query.Query,
                Inputs = query.Variables.ToInputs()
            };

            try
            {
                var result = await new DocumentExecuter().ExecuteAsync(exectionOptions).ConfigureAwait(false);

                if (result.Errors?.Count > 0)
                {
                    return(Json(result.Errors));
                }

                return(Ok(result));
            }
            catch (Exception e)
            {
                return(BadRequest(e.Message));
            }
        }
示例#7
0
        public async Task <IActionResult> Post([FromBody] GraphQlQuery query)
        {
            if (query == null)
            {
                throw new ArgumentNullException(nameof(query));
            }

            var inputs           = query.Variables?.ToInputs();
            var executionOptions = new ExecutionOptions
            {
                Schema = _schema,
                Query  = query.Query,
                Inputs = inputs
            };

            var result = await _documentExecuter
                         .ExecuteAsync(executionOptions);

            if (result.Errors?.Count > 0)
            {
                return(BadRequest(result));
            }

            return(Ok(result));
        }
        /// <summary>
        /// Resolves all queries on guest accesses
        /// </summary>
        /// <param name="graphQlQuery"></param>
        public void ResolveQuery(GraphQlQuery graphQlQuery)
        {
            // TOPICS OVERVIEW
            graphQlQuery.FieldAsync <ListGraphType <SubscriberType> >(
                "subscriberHistory",
                arguments: new QueryArguments(
                    new QueryArgument <NonNullGraphType <StringGraphType> > {
                Name = "channelId"
            },
                    new QueryArgument <IntGraphType> {
                Name = "days"
            }
                    ),
                resolve: async(context) =>
            {
                var result = await _subscriberRepository.GetHistory(
                    context.GetArgument <string>("channelId"),
                    context.GetArgument <int>("days", 7)
                    );

                // map entity to model
                return(_mapper.Map <List <SubscriberModel> >(result));
            }
                );
        }
示例#9
0
        public async Task <IActionResult> Post([FromBody] GraphQlQuery query,
                                               [FromServices] IEnumerable <IValidationRule> validationRules)
        {
            if (query == null)
            {
                throw new ArgumentNullException(nameof(query));
            }

            var inputs           = query.Variables.ToInputs();
            var executionOptions = new ExecutionOptions
            {
                Schema      = _schema,
                Query       = query.Query,
                Inputs      = inputs,
                UserContext = new GraphQlUserContext
                {
                    User = User
                },
                ValidationRules = validationRules,
#if (DEBUG)
                ExposeExceptions = true,
                EnableMetrics    = true,
#endif
            };

            var result = await _documentExecuter.ExecuteAsync(executionOptions).ConfigureAwait(false);

            if (result.Errors?.Count > 0)
            {
                return(BadRequest(result));
            }

            return(Ok(result));
        }
        public async Task <IActionResult> Post([FromBody] GraphQlQuery query)
        {
            if (query == null)
            {
                throw new ArgumentNullException(nameof(query));
            }
            //?.ToObject<Dictionary<string,object>>()
            var inputs = query.Variables?.ToObject <Dictionary <string, object> >();

            //// inputs = JsonConvert.DeserializeObject<Dictionary<string, object>>(inputs?.ToString());
            var executionOptions = new ExecutionOptions
            {
                Schema = _schema,
                Query  = query.Query,
                Inputs = inputs.ToInputs()
            };

            var result = await _documentExecuter.ExecuteAsync(executionOptions);


            if (result.Errors?.Count > 0)
            {
                return(BadRequest(result));
            }

            return(Ok(result));
            // var inputs
        }
        public static async Task <string> PostToJsonAsync(this GraphQlClient client, GraphQlQuery query, params KeyValuePair <string, string>[] headers)
        {
            var response = await client.PostQueryAsync(query, headers);

            await using var stream = response?.GetResponseStream();

            using var reader = new StreamReader(stream ?? throw new InvalidOperationException(), Encoding.UTF8);
            return(reader.ReadToEnd());
        }
示例#12
0
        public IActionResult Post([FromBody] GraphQlQuery query)
        {
            var output = new GraphQlDocument(query.Query)
                         .Validate(typeof(Query))
                         .Run(new Query())
                         .GetOutput();


            return(Ok(output));
        }
示例#13
0
 public GraphQlController(
     ILogger <GraphQlController> logger,
     GraphQlQuery graphQlQuery,
     IDocumentExecuter documentExecuter,
     ISchema schema)
 {
     _graphQlQuery     = graphQlQuery ?? throw new ArgumentNullException(nameof(graphQlQuery));
     _documentExecuter = documentExecuter;
     _schema           = schema;
     _logger           = logger;
 }
示例#14
0
        public IActionResult Post([FromBody] GraphQlQuery query)
        {
            var graphResponse = model.RunQuery(new GraphQuery {
                Query = query.Query, OperationName = query.OperationName ?? "", Variables = query.Variables ?? ""
            });

            logger.LogDebug(graphResponse.Response);

            JObject foo = JObject.Parse(graphResponse.Response);

            return(Ok(foo));
        }
        public async Task <IActionResult> Post(
            [FromQuery]
            [SwaggerParameter("Explicit query", Required = false)]
            string query,
            [FromBody]
            [SwaggerParameter("Graph query model", Required = true)]
            GraphQlQuery model,
            CancellationToken cancellationToken)
        {
            if (model == null)
            {
                return(BadRequest("Missing query body."));
            }

            // Determine query to execute
            var queryToExecute = query ?? model.Query;

            if (!string.IsNullOrWhiteSpace(model.NamedQuery) &&
                !_namedQueries.TryGetValue(model.NamedQuery, out queryToExecute))
            {
                return(BadRequest($"Named query, {model.NamedQuery}, not found."));
            }

            var startTime        = DateTime.UtcNow;
            var executionOptions =
                new ExecutionOptions
            {
                Schema                  = _schema,
                Query                   = queryToExecute,
                OperationName           = model.OperationName,
                Inputs                  = model.Variables.ToInputs(),
                UserContext             = User,
                CancellationToken       = cancellationToken,
                ComplexityConfiguration = new ComplexityConfiguration {
                    MaxDepth = 15
                },
                ExposeExceptions = true,
                EnableMetrics    = true
            };

            executionOptions.FieldMiddleware.Use <InstrumentFieldsMiddleware>();

            var result = await _documentExecuter.ExecuteAsync(executionOptions);

            result.EnrichWithApolloTracing(startTime);

            return(result.Errors?.Count > 0
                ? (IActionResult)BadRequest(result)
                : Json(result, new JsonSerializerSettings {
                MaxDepth = 64
            }));
        }
        public async Task <IActionResult> Post([FromBody] GraphQlQuery graphQlQuery)
        {
            var executionOptions = ValidateGraphQuery(graphQlQuery);

            var result = await _documentExecuter.ExecuteAsync(executionOptions);

            if (result.Errors?.Count > 0)
            {
                return(BadRequest(result));
            }

            return(Ok(result));
        }
示例#17
0
        public async Task <IActionResult> Post1([FromBody] GraphQlQuery query)
        {
            try
            {
                var result = await _graphQlService.ExecuteSchema(query);

                return(Ok(result));
            }
            catch (Exception e)
            {
                return(BadRequest());
            }
        }
示例#18
0
        /// <summary>
        /// Resolves all queries on guest accesses
        /// </summary>
        /// <param name="graphQlQuery"></param>
        public void ResolveQuery(GraphQlQuery graphQlQuery)
        {
            // LANGUAGES: a list of all lang codes
            graphQlQuery.FieldAsync <ListGraphType <LanguageType> >(
                "languages",
                resolve: async(context) =>
            {
                var languages = await _languageRepository.GetAll();

                // map entity to model
                return(_mapper.Map <List <LanguageModel> >(languages));
            }
                );
        }
示例#19
0
        public async Task<IActionResult> Post([FromBody] GraphQlQuery query)
        {
            var schema = new MySchema();
            var inputs = new GraphQL.Inputs(query.Variables.AsDictionary());//.ToInputs();

            var result = await new DocumentExecuter().ExecuteAsync(
                schema.GraphQlSchema, null, query.Query, query.OperationName, inputs);

            if (result.Errors?.Count > 0)
            {
                return BadRequest();
            }

            return Ok(result);
        }
示例#20
0
        public async Task <string> QueryGraphQLAsync(GraphQlQuery query)
        {
            var result = await DocumentExecuter
                         .ExecuteAsync(options =>
            {
                options.Schema = Schema;
                options.Query  = query.Query;
                options.Inputs = query.Variables != null ? new Inputs(StringExtensions.GetValue(query.Variables) as Dictionary <string, object>) : null;
            })
                         .ConfigureAwait(false);

            var json = new DocumentWriter(indent: true).Write(result);

            return(json);
        }
示例#21
0
        public async Task <IActionResult> Post([FromBody] GraphQlQuery query)
        {
            var result = await new DocumentExecuter().ExecuteAsync(x =>
            {
                x.Schema = schema;
                x.Query  = query.Query;
                x.Inputs = query.Variables.ToInputs();
            });

            if (result.Errors?.Count > 0)
            {
                return(BadRequest(result.Errors));
            }
            return(Ok(result));
        }
        private ExecutionOptions ValidateGraphQuery(GraphQlQuery graphQlQuery)
        {
            if (graphQlQuery is null)
            {
                throw new ArgumentNullException($"{nameof(graphQlQuery)} was not informed.");
            }

            var executionOptions = new ExecutionOptions
            {
                Schema = _schema,
                Query  = graphQlQuery.Query,
                Inputs = graphQlQuery.Variables?.ToInputs()
            };

            return(executionOptions);
        }
示例#23
0
        public async Task <IActionResult> Post([FromBody] GraphQlQuery query)
        {
            var executionOptions = new ExecutionOptions
            {
                Schema = _schema,
                Query  = query.Query
            };

            var result = await _documentExecuter.ExecuteAsync(executionOptions);

            if (result.Errors?.Count > 0)
            {
                return(BadRequest(result));
            }

            return(Ok(result));
        }
示例#24
0
        public async Task <IActionResult> Post([FromBody] GraphQlQuery query)
        {
            var schema = new Schema {
                Query = new AuthorQuery(blogService)
            };
            var result = await new DocumentExecuter().ExecuteAsync(x =>
            {
                x.Schema = schema;
                x.Query  = query.Query;
                x.Inputs = query.Variables;
            });

            if (result.Errors?.Count > 0)
            {
                return(BadRequest());
            }
            return(Ok(result));
        }
示例#25
0
        public async Task <object> Post([FromBody] GraphQlQuery query)
        {
            var schema = new Schema {
                Query = new ArticleCatalogue(dataService)
            };
            var result = await new DocumentExecuter().ExecuteAsync(x =>
            {
                x.Schema = schema;
                x.Query  = query.Query;
                x.Inputs = query.Variables;
            });

            if (result.Errors?.Count > 0)
            {
                return(string.Empty);
            }
            return(result);
        }
示例#26
0
        /// <summary>
        /// Resolves all queries on guest accesses
        /// </summary>
        /// <param name="graphQlQuery"></param>
        public void ResolveQuery(GraphQlQuery graphQlQuery)
        {
            // TOPICS OVERVIEW
            graphQlQuery.FieldAsync <ListGraphType <TopicOverviewType> >(
                "topicsOverview",
                arguments: new QueryArguments(
                    new QueryArgument <NonNullGraphType <StringGraphType> > {
                Name = "language"
            }
                    ),
                resolve: async(context) =>
            {
                var result = await _topicsOverviewUseCase.Handle(
                    new TopicsOverviewRequest(context.GetArgument <string>("language"))
                    );

                // map entity to model
                return(_mapper.Map <List <TopicOverviewModel> >(result.Topics));
            }
                );

            // LANGUAGES: a list of all lang codes
            graphQlQuery.FieldAsync <TopicDetailType>(
                "topicDetail",
                arguments: new QueryArguments(
                    new QueryArgument <NonNullGraphType <StringGraphType> > {
                Name = "topicId"
            }
                    ),
                resolve: async(context) =>
            {
                var result = await _topicDetailUseCase.Handle(
                    new TopicDetailRequest(context.GetArgument <string>("topicId"))
                    );

                var truncatedDescriptionResult = result with {
                    Channels = TruncateChannelDescriptions(result.Channels)
                };

                // map entity to model
                return(_mapper.Map <TopicDetailModel>(truncatedDescriptionResult));
            }
                );
        }
示例#27
0
        public async Task <IActionResult> Post([FromBody] GraphQlQuery query)
        {
            var inputs = query.Variables.ToInputs();

            var result = await _executer.ExecuteAsync(_ =>
            {
                _.Schema        = _schema;
                _.Query         = query.Query;
                _.OperationName = query.OperationName;
                _.Inputs        = inputs;
            });

            if (result.Errors?.Count > 0)
            {
                return(BadRequest());
            }

            return(Ok(result));
        }
示例#28
0
        public async Task <IActionResult> Post([FromBody] GraphQlQuery query)
        {
            var schema = new Schema {
                Query = new StarWarsQuery()
            };

            var result = await new DocumentExecuter().ExecuteAsync(x =>
            {
                x.Schema = schema;
                x.Query  = query.Query;
            });

            if (result.Errors?.Count > 0)
            {
                return(BadRequest(result));
            }

            return(Ok(result));
        }
示例#29
0
        public void ResolveQuery(GraphQlQuery graphQlQuery)
        {
            // IDENTIFY CHANNELS: take a list of url hints and identify sailing channels from them
            graphQlQuery.FieldAsync <ListGraphType <ChannelIdentificationType> >(
                "channelSuggestions",
                arguments: new QueryArguments(
                    new QueryArgument <NonNullGraphType <ListGraphType <StringGraphType> > > {
                Name = "channelIds"
            },
                    new QueryArgument <StringGraphType> {
                Name = "source"
            }
                    ),
                resolve: async(context) =>
            {
                // read user context dictionary
                var userContext = (GraphQlUserContext)context.UserContext;
                var userId      = userContext.GetUserId();

                // require user to be authenticated
                if (userId == null)
                {
                    return(null);
                }

                var result = await _channelSuggestionsUseCase.Handle(
                    new ChannelSuggestionsRequest(
                        context.GetArgument <List <string> >("channelIds"),
                        userId,
                        context.GetArgument <string>("source")
                        )
                    );

                var truncatedSuggestions =
                    TruncateChannelIdentificationDescription(result.Suggestions);

                // map entity to model
                return(_mapper.Map <List <ChannelIdentificationModel> >(truncatedSuggestions));
            }
                );
        }
        public async Task <IActionResult> Post([FromBody] GraphQlQuery query)
        {
            var extractedApiKey = ExtractApiKey();

            if (!extractedApiKey.HasValue || extractedApiKey.Value.Equals(Startup.Configuration.GetValue <Guid>("GlobalAdminKey")))
            {
                return(Unauthorized());
            }

            var executionOptions = new ExecutionOptions {
                Schema = _schema, Query = query.Query
            };
            var result = await _documentExecuter.ExecuteAsync(executionOptions).ConfigureAwait(false);

            if (result.Errors?.Count > 0)
            {
                return(BadRequest(result.Errors));
            }

            return(Ok(result));
        }