コード例 #1
0
        public static void SetDefaultQuerySettings(this IServiceProvider serviceProvider, DefaultQuerySettings defaultQuerySettings)
        {
            if (serviceProvider == null)
            {
                throw Error.ArgumentNull(nameof(serviceProvider));
            }

            if (defaultQuerySettings == null)
            {
                throw Error.ArgumentNull(nameof(defaultQuerySettings));
            }

            if (!defaultQuerySettings.MaxTop.HasValue || defaultQuerySettings.MaxTop > 0)
            {
                ModelBoundQuerySettings.DefaultModelBoundQuerySettings.MaxTop = defaultQuerySettings.MaxTop;
            }

            DefaultQuerySettings querySettings = serviceProvider.GetRequiredService <DefaultQuerySettings>();

            if (querySettings == null)
            {
                throw Error.InvalidOperation(SRResources.MissingODataServices, nameof(DefaultQuerySettings));
            }

            querySettings = defaultQuerySettings;
        }
コード例 #2
0
        /// <summary>
        /// Sets the <see cref="DefaultQuerySettings"/> in route builder.
        /// </summary>
        /// <param name="builder">The <see cref="IRouteBuilder"/>.</param>
        /// <param name="defaultQuerySettings">The default query settings.</param>
        public static IRouteBuilder SetDefaultQuerySettings(this IRouteBuilder builder, DefaultQuerySettings defaultQuerySettings)
        {
            if (builder == null)
            {
                throw Error.ArgumentNull("builder");
            }

            if (defaultQuerySettings == null)
            {
                throw Error.ArgumentNull("defaultQuerySettings");
            }

            if (!defaultQuerySettings.MaxTop.HasValue || defaultQuerySettings.MaxTop > 0)
            {
                ModelBoundQuerySettings.DefaultModelBoundQuerySettings.MaxTop = defaultQuerySettings.MaxTop;
            }

            DefaultQuerySettings querySettings = builder.ServiceProvider.GetRequiredService <DefaultQuerySettings>();

            if (querySettings == null)
            {
                throw Error.InvalidOperation(SRResources.MissingODataServices, nameof(DefaultQuerySettings));
            }

            querySettings = defaultQuerySettings;
            return(builder);
        }
コード例 #3
0
        public void apply_to_should_use_default_query_settings()
        {
            // arrange
            var description          = NewApiDescription();
            var defaultQuerySettings = new DefaultQuerySettings()
            {
                EnableCount   = true,
                EnableExpand  = true,
                EnableFilter  = true,
                EnableOrderBy = true,
                EnableSelect  = true,
            };
            var validationSettings = new ODataValidationSettings()
            {
                AllowedQueryOptions = AllowedQueryOptions.None
            };
            var settings   = new TestODataQueryOptionSettings(typeof(object), defaultQuerySettings);
            var convention = new ODataValidationSettingsConvention(validationSettings, settings);

            // act
            convention.ApplyTo(description);

            // assert
            description.ParameterDescriptions.Count.Should().Be(5);
        }
コード例 #4
0
        /// <summary>
        /// Sets the EnableCount of <see cref="DefaultQuerySettings"/> in the configuration,
        /// depends on <see cref="QueryOptionSetting"/>.
        /// </summary>
        public static HttpConfiguration Count(this HttpConfiguration configuration, QueryOptionSetting setting)
        {
            DefaultQuerySettings defaultQuerySettings = configuration.GetDefaultQuerySettings();

            defaultQuerySettings.EnableCount = setting == QueryOptionSetting.Allowed;
            return(configuration);
        }
コード例 #5
0
        /// <summary>
        /// Sets the EnableCount to true of <see cref="DefaultQuerySettings"/> in the configuration.
        /// </summary>
        public static HttpConfiguration Count(this HttpConfiguration configuration)
        {
            DefaultQuerySettings defaultQuerySettings = configuration.GetDefaultQuerySettings();

            defaultQuerySettings.EnableCount = true;
            return(configuration);
        }
コード例 #6
0
        /// <summary>
        /// Validates a <see cref="SelectExpandQueryOption" />.
        /// </summary>
        /// <param name="selectExpandQueryOption">The $select and $expand query.</param>
        /// <param name="validationSettings">The validation settings.</param>
        public virtual void Validate(SelectExpandQueryOption selectExpandQueryOption, ODataValidationSettings validationSettings)
        {
            if (selectExpandQueryOption == null)
            {
                throw Error.ArgumentNull(nameof(selectExpandQueryOption));
            }

            if (validationSettings == null)
            {
                throw Error.ArgumentNull(nameof(validationSettings));
            }

            _defaultQuerySettings = selectExpandQueryOption.Context.DefaultQuerySettings;

            _orderByQueryValidator   = new OrderByModelLimitationsValidator(selectExpandQueryOption.Context, _defaultQuerySettings.EnableOrderBy);
            _selectExpandQueryOption = selectExpandQueryOption;
            ValidateRestrictions(null, 0, selectExpandQueryOption.SelectExpandClause, null, validationSettings);

            if (validationSettings.MaxExpansionDepth > 0)
            {
                if (selectExpandQueryOption.LevelsMaxLiteralExpansionDepth < 0)
                {
                    selectExpandQueryOption.LevelsMaxLiteralExpansionDepth = validationSettings.MaxExpansionDepth;
                }
                else if (selectExpandQueryOption.LevelsMaxLiteralExpansionDepth > validationSettings.MaxExpansionDepth)
                {
                    throw new ODataException(Error.Format(
                                                 SRResources.InvalidExpansionDepthValue,
                                                 "LevelsMaxLiteralExpansionDepth",
                                                 "MaxExpansionDepth"));
                }

                ValidateDepth(selectExpandQueryOption.SelectExpandClause, validationSettings.MaxExpansionDepth);
            }
        }
コード例 #7
0
        /// <summary>
        /// Sets the EnableSkipToken to true of <see cref="DefaultQuerySettings"/> in the configuration.
        /// </summary>
        public static HttpConfiguration SkipToken(this HttpConfiguration configuration)
        {
            DefaultQuerySettings defaultQuerySettings = configuration.GetDefaultQuerySettings();

            defaultQuerySettings.EnableSkipToken = true;
            return(configuration);
        }
コード例 #8
0
        /// <summary>
        /// Sets the EnableOrderBy to true of <see cref="DefaultQuerySettings"/> in the configuration.
        /// </summary>
        public static HttpConfiguration OrderBy(this HttpConfiguration configuration)
        {
            DefaultQuerySettings defaultQuerySettings = configuration.GetDefaultQuerySettings();

            defaultQuerySettings.EnableOrderBy = true;
            return(configuration);
        }
コード例 #9
0
        private static ModelBoundQuerySettings GetModelBoundQuerySettings <T>(T key, IEdmModel edmModel,
                                                                              DefaultQuerySettings defaultQuerySettings = null)
            where T : IEdmElement
        {
            Contract.Assert(edmModel != null);

            if (key == null)
            {
                return(null);
            }
            else
            {
                ModelBoundQuerySettings querySettings = edmModel.GetAnnotationValue <ModelBoundQuerySettings>(key);
                if (querySettings == null)
                {
                    querySettings = new ModelBoundQuerySettings();
                    if (defaultQuerySettings != null &&
                        (!defaultQuerySettings.MaxTop.HasValue || defaultQuerySettings.MaxTop > 0))
                    {
                        querySettings.MaxTop = defaultQuerySettings.MaxTop;
                    }
                }
                return(querySettings);
            }
        }
コード例 #10
0
 internal virtual void Validate(IEdmProperty property, IEdmStructuredType structuredType,
                                FilterClause filterClause, ODataValidationSettings settings, IEdmModel model, DefaultQuerySettings querySettings)
 {
     _property             = property;
     _structuredType       = structuredType;
     _defaultQuerySettings = querySettings;
     Validate(filterClause, settings, model);
 }
コード例 #11
0
 internal TestODataQueryOptionSettings(Type type, DefaultQuerySettings defaultQuerySettings, bool dollarPrefix = true)
 {
     MockDescriptionProvider = new Mock <IODataQueryOptionDescriptionProvider>();
     MockDescriptionProvider.Setup(p => p.Describe(It.IsAny <AllowedQueryOptions>(), It.IsAny <ODataQueryOptionDescriptionContext>())).Returns("Test");
     NoDollarPrefix        = !dollarPrefix;
     DescriptionProvider   = MockDescriptionProvider.Object;
     ModelMetadataProvider = NewModelMetadataProvider(type);
     DefaultQuerySettings  = defaultQuerySettings;
 }
コード例 #12
0
 public QueryValidator1Attribute()
 {
     defaultQuerySettings = new DefaultQuerySettings
     {
         EnableExpand = true,
         EnableSelect = true,
         EnableCount  = true,
         EnableFilter = true
     };
 }
コード例 #13
0
        public static void Select(this IServiceProvider serviceProvider, QueryOptionSetting setting)
        {
            if (serviceProvider == null)
            {
                throw Error.ArgumentNull(nameof(serviceProvider));
            }

            DefaultQuerySettings defaultQuerySettings = serviceProvider.GetDefaultQuerySettings();

            defaultQuerySettings.EnableSelect = setting == QueryOptionSetting.Allowed;
        }
コード例 #14
0
        public static void Expand(this IServiceProvider serviceProvider)
        {
            if (serviceProvider == null)
            {
                throw Error.ArgumentNull(nameof(serviceProvider));
            }

            DefaultQuerySettings defaultQuerySettings = serviceProvider.GetDefaultQuerySettings();

            defaultQuerySettings.EnableExpand = true;
        }
        public static void SkipToken(this IServiceProvider serviceProvider)
        {
            if (serviceProvider == null)
            {
                throw Error.ArgumentNull("serviceProvider");
            }

            DefaultQuerySettings defaultQuerySettings = serviceProvider.GetDefaultQuerySettings();

            defaultQuerySettings.EnableSkipToken = true;
        }
        public static void Expand(this IServiceProvider serviceProvider, QueryOptionSetting setting)
        {
            if (serviceProvider == null)
            {
                throw Error.ArgumentNull("serviceProvider");
            }

            DefaultQuerySettings defaultQuerySettings = serviceProvider.GetDefaultQuerySettings();

            defaultQuerySettings.EnableExpand = setting == QueryOptionSetting.Allowed;
        }
コード例 #17
0
        /// <summary>
        /// Sets the MaxTop of <see cref="DefaultQuerySettings"/> in the configuration.
        /// </summary>
        public static HttpConfiguration MaxTop(this HttpConfiguration configuration, int?maxTopValue)
        {
            DefaultQuerySettings defaultQuerySettings = configuration.GetDefaultQuerySettings();

            defaultQuerySettings.MaxTop = maxTopValue;
            if (!maxTopValue.HasValue || maxTopValue > 0)
            {
                ModelBoundQuerySettings.DefaultModelBoundQuerySettings.MaxTop = maxTopValue;
            }

            return(configuration);
        }
コード例 #18
0
        /// <summary>
        /// Sets the EnableCount of <see cref="DefaultQuerySettings"/> in route builder,
        /// depends on <see cref="QueryOptionSetting"/>.
        /// </summary>
        public static IRouteBuilder Count(this IRouteBuilder builder, QueryOptionSetting setting)
        {
            if (builder == null)
            {
                throw Error.ArgumentNull("builder");
            }

            DefaultQuerySettings defaultQuerySettings = builder.GetDefaultQuerySettings();

            defaultQuerySettings.EnableCount = setting == QueryOptionSetting.Allowed;
            return(builder);
        }
コード例 #19
0
        /// <summary>
        /// Sets the EnableCount to true of <see cref="DefaultQuerySettings"/> in route builder.
        /// </summary>
        public static IRouteBuilder Count(this IRouteBuilder builder)
        {
            if (builder == null)
            {
                throw Error.ArgumentNull("builder");
            }

            DefaultQuerySettings defaultQuerySettings = builder.GetDefaultQuerySettings();

            defaultQuerySettings.EnableCount = true;
            return(builder);
        }
コード例 #20
0
        /// <summary>
        /// Gets the <see cref="DefaultQuerySettings"/> from the configuration.
        /// </summary>
        /// <param name="configuration">The server configuration.</param>
        public static DefaultQuerySettings GetDefaultQuerySettings(this HttpConfiguration configuration)
        {
            object instance;

            if (!configuration.Properties.TryGetValue(DefaultQuerySettingsKey, out instance))
            {
                DefaultQuerySettings defaultQuerySettings = new DefaultQuerySettings();
                configuration.SetDefaultQuerySettings(defaultQuerySettings);
                return(defaultQuerySettings);
            }

            return(instance as DefaultQuerySettings);
        }
コード例 #21
0
        public static bool IsTopLimitExceeded(IEdmProperty property, IEdmStructuredType structuredType,
                                              IEdmModel edmModel, int top, DefaultQuerySettings defaultQuerySettings, out int maxTop)
        {
            maxTop = 0;
            ModelBoundQuerySettings querySettings = GetModelBoundQuerySettings(property, structuredType, edmModel,
                                                                               defaultQuerySettings);

            if (querySettings != null && top > querySettings.MaxTop)
            {
                maxTop = querySettings.MaxTop.Value;
                return(true);
            }
            return(false);
        }
コード例 #22
0
        public void UseAutoPocoSetsUpOdataOnHttpConfig()
        {
            builder.UseAutoPoco(config);

            Assert.IsInstanceOfType(config.Properties.First(c => (string)c.Key == "Microsoft.AspNet.OData.NonODataRootContainerKey").Value, typeof(ServiceProvider));
            Assert.IsInstanceOfType(config.Properties.First(c => (string)c.Key == "Microsoft.AspNet.OData.PerRouteContainerKey").Value, typeof(Microsoft.AspNet.OData.PerRouteContainer));

            DefaultQuerySettings odataSettings = (DefaultQuerySettings)config.Properties.First(c => (string)c.Key == "Microsoft.AspNet.OData.DefaultQuerySettings").Value;

            Assert.IsTrue(odataSettings.EnableCount);
            Assert.IsTrue(odataSettings.EnableOrderBy);
            Assert.IsTrue(odataSettings.EnableExpand);
            Assert.IsTrue(odataSettings.EnableSelect);
            Assert.AreEqual(1000, odataSettings.MaxTop);
        }
コード例 #23
0
        public static void MaxTop(this IServiceProvider serviceProvider, int?maxTopValue)
        {
            if (serviceProvider == null)
            {
                throw Error.ArgumentNull(nameof(serviceProvider));
            }

            DefaultQuerySettings defaultQuerySettings = serviceProvider.GetDefaultQuerySettings();

            defaultQuerySettings.MaxTop = maxTopValue;
            if (!maxTopValue.HasValue || maxTopValue > 0)
            {
                ModelBoundQuerySettings.DefaultModelBoundQuerySettings.MaxTop = maxTopValue;
            }
        }
コード例 #24
0
        public static DefaultQuerySettings GetDefaultQuerySettings(this IServiceProvider serviceProvider)
        {
            if (serviceProvider == null)
            {
                throw Error.ArgumentNull(nameof(serviceProvider));
            }

            DefaultQuerySettings querySettings = serviceProvider.GetRequiredService <DefaultQuerySettings>();

            if (querySettings == null)
            {
                throw Error.InvalidOperation(SRResources.MissingODataServices, nameof(DefaultQuerySettings));
            }

            return(querySettings);
        }
コード例 #25
0
        public void ConfigureServices_CanSet_QueryConfiguration()
        {
            // Arrange
            HttpConfiguration config = new HttpConfiguration();

            // Act
            config.Filter().Count(QueryOptionSetting.Disabled).Expand().OrderBy().MaxTop(10);
            DefaultQuerySettings defaultQuerySettings = config.GetDefaultQuerySettings();

            // Assert
            Assert.True(defaultQuerySettings.EnableFilter);
            Assert.False(defaultQuerySettings.EnableCount);
            Assert.True(defaultQuerySettings.EnableExpand);
            Assert.True(defaultQuerySettings.EnableOrderBy);
            Assert.Equal(10, defaultQuerySettings.MaxTop);
        }
コード例 #26
0
        /// <summary>
        /// Sets the MaxTop of <see cref="DefaultQuerySettings"/> in route builder.
        /// </summary>
        public static IRouteBuilder MaxTop(this IRouteBuilder builder, int?maxTopValue)
        {
            if (builder == null)
            {
                throw Error.ArgumentNull("builder");
            }

            DefaultQuerySettings defaultQuerySettings = builder.GetDefaultQuerySettings();

            defaultQuerySettings.MaxTop = maxTopValue;
            if (!maxTopValue.HasValue || maxTopValue > 0)
            {
                ModelBoundQuerySettings.DefaultModelBoundQuerySettings.MaxTop = maxTopValue;
            }

            return(builder);
        }
コード例 #27
0
        public void UseAutoPocoSetsUpOdata()
        {
            IApplicationBuilder appBuilder = null;

            builder = c => appBuilder = c.UseAutoPoco();
            _       = new TestServer(hostBuilder);

            Assert.IsNotNull(appBuilder.ApplicationServices.GetService <ODataOptions>());
            Assert.IsNotNull(appBuilder.ApplicationServices.GetService <IPerRouteContainer>());

            DefaultQuerySettings odataSettings = appBuilder.ApplicationServices.GetService <DefaultQuerySettings>();

            Assert.IsTrue(odataSettings.EnableCount);
            Assert.IsTrue(odataSettings.EnableOrderBy);
            Assert.IsTrue(odataSettings.EnableExpand);
            Assert.IsTrue(odataSettings.EnableSelect);
            Assert.AreEqual(1000, odataSettings.MaxTop);
        }
コード例 #28
0
        public override void ValidateQuery(HttpRequest request, ODataQueryOptions queryOptions)
        {
            if (queryOptions.Filter != null)
            {
                // Filter is must!
                var settings = new DefaultQuerySettings
                {
                    EnableFilter    = true,
                    EnableSkipToken = true,
                    EnableCount     = true,
                    EnableExpand    = true,
                    EnableOrderBy   = true,
                    EnableSelect    = true,
                    MaxTop          = 100,
                };

                queryOptions.Filter.Validator = new HomeIDQueryValidator(settings);
            }

            base.ValidateQuery(request, queryOptions);
        }
コード例 #29
0
        /// <summary>
        /// Validates a <see cref="SkipTokenQueryOption" />.
        /// </summary>
        /// <param name="skipToken">The $skiptoken query.</param>
        /// <param name="validationSettings">The validation settings.</param>
        public virtual void Validate(SkipTokenQueryOption skipToken, ODataValidationSettings validationSettings)
        {
            if (skipToken == null)
            {
                throw Error.ArgumentNull(nameof(skipToken));
            }

            if (validationSettings == null)
            {
                throw Error.ArgumentNull(nameof(validationSettings));
            }

            if (skipToken.Context != null)
            {
                DefaultQuerySettings defaultSetting = skipToken.Context.DefaultQuerySettings;
                if (!defaultSetting.EnableSkipToken)
                {
                    throw new ODataException(Error.Format(SRResources.NotAllowedQueryOption, AllowedQueryOptions.SkipToken, "AllowedQueryOptions"));
                }
            }
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="ODataApiDescriptionProvider"/> class.
        /// </summary>
        /// <param name="routeCollectionProvider">The <see cref="IODataRouteCollectionProvider">OData route collection provider</see> associated with the description provider.</param>
        /// <param name="inlineConstraintResolver">The <see cref="IInlineConstraintResolver">inline constraint resolver</see> used to parse route template constraints.</param>
        /// <param name="metadataProvider">The <see cref="IModelMetadataProvider">provider</see> used to retrieve model metadata.</param>
        /// <param name="defaultQuerySettings">The OData <see cref="DefaultQuerySettings">default query setting</see>.</param>
        /// <param name="options">The <see cref="IOptions{TOptions}">container</see> of configured <see cref="ODataApiExplorerOptions">API explorer options</see>.</param>
        /// <param name="mvcOptions">A <see cref="IOptions{TOptions}">holder</see> containing the current <see cref="Mvc.MvcOptions">MVC options</see>.</param>
        public ODataApiDescriptionProvider(
            IODataRouteCollectionProvider routeCollectionProvider,
            IInlineConstraintResolver inlineConstraintResolver,
            IModelMetadataProvider metadataProvider,
            DefaultQuerySettings defaultQuerySettings,
            IOptions <ODataApiExplorerOptions> options,
            IOptions <MvcOptions> mvcOptions)
        {
            Arg.NotNull(routeCollectionProvider, nameof(routeCollectionProvider));
            Arg.NotNull(metadataProvider, nameof(metadataProvider));
            Arg.NotNull(options, nameof(options));
            Arg.NotNull(mvcOptions, nameof(mvcOptions));

            RouteCollectionProvider = routeCollectionProvider;
            ModelTypeBuilder        = new DefaultModelTypeBuilder();
            ConstraintResolver      = inlineConstraintResolver;
            MetadataProvider        = metadataProvider;
            DefaultQuerySettings    = defaultQuerySettings;
            this.options            = options;
            MvcOptions    = mvcOptions.Value;
            modelMetadata = new Lazy <ModelMetadata>(NewModelMetadata);
        }