diff --git a/src/AspNet/OData/src/Asp.Versioning.WebApi.OData.ApiExplorer/Asp.Versioning.WebApi.OData.ApiExplorer.csproj b/src/AspNet/OData/src/Asp.Versioning.WebApi.OData.ApiExplorer/Asp.Versioning.WebApi.OData.ApiExplorer.csproj index a3983eab..7edcd033 100644 --- a/src/AspNet/OData/src/Asp.Versioning.WebApi.OData.ApiExplorer/Asp.Versioning.WebApi.OData.ApiExplorer.csproj +++ b/src/AspNet/OData/src/Asp.Versioning.WebApi.OData.ApiExplorer/Asp.Versioning.WebApi.OData.ApiExplorer.csproj @@ -1,7 +1,7 @@  - 6.4.0 + 6.4.1 6.4.0.0 net45;net472 Asp.Versioning diff --git a/src/AspNet/OData/src/Asp.Versioning.WebApi.OData.ApiExplorer/ReleaseNotes.txt b/src/AspNet/OData/src/Asp.Versioning.WebApi.OData.ApiExplorer/ReleaseNotes.txt index 5f282702..977a8d55 100644 --- a/src/AspNet/OData/src/Asp.Versioning.WebApi.OData.ApiExplorer/ReleaseNotes.txt +++ b/src/AspNet/OData/src/Asp.Versioning.WebApi.OData.ApiExplorer/ReleaseNotes.txt @@ -1 +1 @@ - \ No newline at end of file +Fix: `EnableQueryAttribute` should override _Model Bound_ settings (Related to [#928](https://github.com/dotnet/aspnet-api-versioning/issues/928)) \ No newline at end of file diff --git a/src/AspNetCore/OData/src/Asp.Versioning.OData.ApiExplorer/Asp.Versioning.OData.ApiExplorer.csproj b/src/AspNetCore/OData/src/Asp.Versioning.OData.ApiExplorer/Asp.Versioning.OData.ApiExplorer.csproj index 78a1e926..07877cbe 100644 --- a/src/AspNetCore/OData/src/Asp.Versioning.OData.ApiExplorer/Asp.Versioning.OData.ApiExplorer.csproj +++ b/src/AspNetCore/OData/src/Asp.Versioning.OData.ApiExplorer/Asp.Versioning.OData.ApiExplorer.csproj @@ -1,7 +1,7 @@  - 6.4.0 + 6.4.1 6.4.0.0 net6.0;netcoreapp3.1 Asp.Versioning diff --git a/src/AspNetCore/OData/src/Asp.Versioning.OData.ApiExplorer/ReleaseNotes.txt b/src/AspNetCore/OData/src/Asp.Versioning.OData.ApiExplorer/ReleaseNotes.txt index 5f282702..977a8d55 100644 --- a/src/AspNetCore/OData/src/Asp.Versioning.OData.ApiExplorer/ReleaseNotes.txt +++ b/src/AspNetCore/OData/src/Asp.Versioning.OData.ApiExplorer/ReleaseNotes.txt @@ -1 +1 @@ - \ No newline at end of file +Fix: `EnableQueryAttribute` should override _Model Bound_ settings (Related to [#928](https://github.com/dotnet/aspnet-api-versioning/issues/928)) \ No newline at end of file diff --git a/src/AspNetCore/OData/test/Asp.Versioning.OData.ApiExplorer.Tests/Conventions/ODataValidationSettingsConventionTest.cs b/src/AspNetCore/OData/test/Asp.Versioning.OData.ApiExplorer.Tests/Conventions/ODataValidationSettingsConventionTest.cs index e5cd95ce..1193606f 100644 --- a/src/AspNetCore/OData/test/Asp.Versioning.OData.ApiExplorer.Tests/Conventions/ODataValidationSettingsConventionTest.cs +++ b/src/AspNetCore/OData/test/Asp.Versioning.OData.ApiExplorer.Tests/Conventions/ODataValidationSettingsConventionTest.cs @@ -19,6 +19,7 @@ namespace Asp.Versioning.Conventions; using Microsoft.OData.ModelBuilder; using Microsoft.OData.ModelBuilder.Config; using System.Reflection; +using Xunit; using static Microsoft.AspNetCore.Http.StatusCodes; using static Microsoft.AspNetCore.Mvc.ModelBinding.BindingSource; using static Microsoft.AspNetCore.OData.Query.AllowedArithmeticOperators; @@ -469,6 +470,50 @@ public void apply_to_should_use_model_bound_query_attributes() options => options.ExcludingMissingMembers() ); } + [Fact] + public void apply_should_override_model_bound_settings_with_enable_query_attribute() + { + // arrange + var builder = new ODataConventionModelBuilder().EnableLowerCamelCase(); + + builder.EntitySet( "Customers" ); + + var validationSettings = new ODataValidationSettings() + { + AllowedQueryOptions = AllowedQueryOptions.None, + AllowedArithmeticOperators = AllowedArithmeticOperators.None, + AllowedLogicalOperators = AllowedLogicalOperators.None, + AllowedFunctions = AllowedFunctions.None, + }; + var settings = new TestODataQueryOptionSettings( typeof( Customer ) ); + var convention = new ODataValidationSettingsConvention( validationSettings, settings ); + var model = builder.GetEdmModel(); + var description = NewApiDescription( typeof( CustomersController ), typeof( IEnumerable ), model ); + + // act + convention.ApplyTo( description ); + + // assert + var parameter = description.ParameterDescriptions.Single(); + + parameter.Should().BeEquivalentTo( + new + { + Name = "$filter", + Source = Query, + Type = typeof( string ), + DefaultValue = default( object ), + IsRequired = false, + ModelMetadata = new { Description = "Test" }, + ParameterDescriptor = new + { + Name = "$filter", + ParameterType = typeof( string ), + }, + }, + options => options.ExcludingMissingMembers() ); + } + [Fact] public void apply_to_should_process_odataX2Dlike_api_description() { @@ -678,6 +723,13 @@ public class OrdersController : ODataController public IActionResult Get( ODataQueryOptions options ) => Ok(); } + public class CustomersController : ODataController + { + [EnableQuery( AllowedQueryOptions = Filter )] + [ProducesResponseType( typeof( IEnumerable ), Status200OK )] + public IActionResult Get( ODataQueryOptions options ) => Ok(); + } + [Select] [Filter] [Count] @@ -693,6 +745,12 @@ public class Order public int Quantity { get; set; } } + [Page( MaxTop = 25, PageSize = 25 )] + public class Customer + { + public int CustomerId { get; set; } + } + private sealed class TestODataQueryOptionSettings : ODataQueryOptionSettings { internal TestODataQueryOptionSettings( Type type, bool dollarPrefix = true ) : diff --git a/src/Common/src/Common.OData.ApiExplorer/Conventions/ODataAttributeVisitor.cs b/src/Common/src/Common.OData.ApiExplorer/Conventions/ODataAttributeVisitor.cs index 1ee25007..4afba308 100644 --- a/src/Common/src/Common.OData.ApiExplorer/Conventions/ODataAttributeVisitor.cs +++ b/src/Common/src/Common.OData.ApiExplorer/Conventions/ODataAttributeVisitor.cs @@ -38,14 +38,14 @@ internal ODataAttributeVisitor( internal void Visit( ApiDescription apiDescription ) { - VisitAction( apiDescription.ActionDescriptor ); - var modelType = context.ReturnType; if ( modelType != null ) { VisitModel( modelType ); } + + VisitAction( apiDescription.ActionDescriptor ); } private void VisitModel( IEdmStructuredType modelType )