private DynamicQueryOptions ExecuteAction( DynamicQueryAttribute attributeInstance, string query = null, DynamicQueryBuilderSettings settings = null, bool queryOnHeader = false) { ActionExecutingContext context = CreateContext(query, settings, queryOnHeader); attributeInstance.OnActionExecuting(context); return(context.ActionArguments.First().Value as DynamicQueryOptions); }
public void ShouldBeAbleToHandleEmptyQueries() { var attr = new DynamicQueryAttribute(); var settings = new DynamicQueryBuilderSettings { QueryOptionsResolver = new QueryStringResolver(DYNAMIC_QUERY_STRING_PARAM) }; var result = ExecuteAction(attr, string.Empty, settings); Assert.NotNull(result); Assert.Empty(result.Filters); Assert.Empty(result.SortOptions); }
private ActionExecutingContext CreateContext( string query = null, DynamicQueryBuilderSettings opts = null, bool queryOnHeader = false) { var actionDescriptor = new ActionDescriptor { Parameters = new List <ParameterDescriptor>() { new ParameterDescriptor { Name = nameof(DynamicQueryOptions), ParameterType = typeof(DynamicQueryOptions), BindingInfo = new BindingInfo() } } }; HttpContext httpContext = new DefaultHttpContext(); if (queryOnHeader) { var hhResolver = opts.QueryOptionsResolver as HttpHeaderResolver; httpContext.Request.Headers.Add( DYNAMIC_QUERY_STRING_PARAM, query ?? DYNAMIC_QUERY_STRING); } else { httpContext.Request.QueryString = new QueryString(query ?? DYNAMIC_QUERY_STRING); } if (opts != null) { var serviceProvider = new ServiceCollection(); serviceProvider.AddSingleton(opts); httpContext.RequestServices = serviceProvider.BuildServiceProvider(true); } var actionContext = new ActionExecutingContext( new ActionContext(httpContext, new RouteData(), actionDescriptor), new List <IFilterMetadata>(), new Dictionary <string, object>(), null); return(actionContext); }
public override void OnActionExecuting(ActionExecutingContext context) { ParameterDescriptor dynamicQueryParameter = context.ActionDescriptor .Parameters .FirstOrDefault(x => x.ParameterType == typeof(DynamicQueryOptions)); DynamicQueryBuilderSettings dqbSettings = context .HttpContext .RequestServices? .GetService(typeof(DynamicQueryBuilderSettings)) as DynamicQueryBuilderSettings ?? new DynamicQueryBuilderSettings(); if (dynamicQueryParameter == null) { base.OnActionExecuting(context); return; } string queryValue = context.HttpContext.Request.QueryString.Value; if (dqbSettings.QueryOptionsResolver != null) { if (dqbSettings.QueryOptionsResolver is QueryStringResolver qsResolver) { string[] values; if (!string.IsNullOrEmpty(qsResolver.ResolveFrom)) { NameValueCollection resolveParameterValues = HttpUtility.ParseQueryString(queryValue); values = resolveParameterValues.GetValues(qsResolver.ResolveFrom) ?? new string[] { string.Empty }; } else { values = new string[] { queryValue }; } queryValue = values[0]; if (qsResolver.DecodeFunction != null) { queryValue = qsResolver.DecodeFunction(queryValue); } else if (QueryStringParser.IsQueryStringEncoded(queryValue)) { queryValue = HttpUtility.UrlDecode(queryValue); } } else if (dqbSettings.QueryOptionsResolver is HttpHeaderResolver hhResolver) { string rawHeaderValue = context .HttpContext .Request .Headers[hhResolver.HttpHeaderName] .FirstOrDefault() ?? string.Empty; queryValue = hhResolver.DecodeFunction != null ? hhResolver.DecodeFunction(rawHeaderValue) : rawHeaderValue; } } DynamicQueryOptions parsedOptions = ExpressionBuilder.ParseQueryOptions( queryValue, dqbSettings.CustomOpCodes); parsedOptions.UsesCaseInsensitiveSource = dqbSettings.UsesCaseInsensitiveSource; parsedOptions.IgnorePredefinedOrders = dqbSettings.IgnorePredefinedOrders; if (parsedOptions.PaginationOption != null) { parsedOptions.PaginationOption.AssignDataSetCount = _includeDataSetCountToPagination; if (parsedOptions.PaginationOption.Count > _maxCountSize) { if (_exceededPaginationCountBehaviour == PaginationBehaviour.GetMax) { parsedOptions.PaginationOption.Count = _maxCountSize; } else { throw new MaximumResultSetExceededException( $"Given count {parsedOptions.PaginationOption.Count} exceeds the maximum amount"); } } else if (parsedOptions.PaginationOption.Count <= 0) { parsedOptions.PaginationOption.Count = 1; } if (parsedOptions.PaginationOption.Offset < 0) { parsedOptions.PaginationOption.Offset = 0; } } else if (_includeDataSetCountToPagination && parsedOptions.PaginationOption == null) { parsedOptions.PaginationOption = new PaginationOption { AssignDataSetCount = true }; } context.ActionArguments[dynamicQueryParameter.Name] = parsedOptions; base.OnActionExecuting(context); }