コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }