public async Task <ActionResult> Post([FromBody] GqlRequest request) { if (request == null || !ModelState.IsValid) { return(BadRequest()); } var vars = request.Variables?.ToString(); var result = await _documentExecuter.ExecuteAsync(opts => { opts.Schema = _schema; opts.Query = request.Query; opts.ThrowOnUnhandledException = false; if (!string.IsNullOrEmpty(vars)) { opts.Inputs = vars.ToInputs(); } }); try { var perf = result.Perf.ToDictionary(x => $"{x.Category}_{x.Subject?.Camelize()}_elapsed", x => x.Duration); } catch (Exception ex) { _logger.LogError(ex, "Error while building gql perf diagnostics gqlPerf={@gqlPerf}", result.Perf); } return(result.ToActionResult(this, request)); }
public GqlException(string message, Exception inner, GqlRequest request = null, string errorCode = null) : base(message, inner) { Request = request; ErrorCode = errorCode; }
private static ActionResult GetResultForException(ExecutionError error, ControllerBase controller, GqlRequest request) { var exception = error.GetBaseException(); if (exception is ValidationError) { return(null); } if (exception is UnauthorizedException uex) { return(controller.StatusCode((int)HttpStatusCode.Forbidden)); } throw new GqlException(exception.Message, exception, request, error.Code); }
/// <summary> /// Converts execution result to <see cref="ActionResult"/> or throw. /// </summary> /// <param name="result">Result to convert.</param> /// <param name="controller">Current controller.</param> /// <param name="request"></param> /// <returns>Returns action result to return.</returns> public static ActionResult ToActionResult(this ExecutionResult result, ControllerBase controller, GqlRequest request) { if (!(result.Errors?.Count > 0)) { return(new GqlExecutionResult(result)); } foreach (var error in result.Errors) { var actionResult = GetResultForException(error, controller, request); if (actionResult != null) { return(actionResult); } } return(new GqlExecutionResult(result, StatusCodes.Status400BadRequest)); }