diff --git a/src/NSwag.Generation.AspNetCore.Tests.Web/Controllers/VersionedValuesController.cs b/src/NSwag.Generation.AspNetCore.Tests.Web/Controllers/VersionedValuesController.cs index fceac1b361..8d7f1d53f1 100644 --- a/src/NSwag.Generation.AspNetCore.Tests.Web/Controllers/VersionedValuesController.cs +++ b/src/NSwag.Generation.AspNetCore.Tests.Web/Controllers/VersionedValuesController.cs @@ -5,7 +5,7 @@ namespace NSwag.Generation.AspNetCore.Tests.Web.Controllers { [ApiVersion("1")] - [ApiVersion("2")] + [ApiVersion("2", Deprecated = true)] [Route("api/v{version:apiVersion}/[controller]")] [ApiController] [SwaggerTag("VersionedValues", Description = "Old operations")] diff --git a/src/NSwag.Generation.AspNetCore.Tests/ApiVersionProcessorWithAspNetCoreTests.cs b/src/NSwag.Generation.AspNetCore.Tests/ApiVersionProcessorWithAspNetCoreTests.cs index abc3b4f861..0d3cf93bac 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/ApiVersionProcessorWithAspNetCoreTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/ApiVersionProcessorWithAspNetCoreTests.cs @@ -1,7 +1,6 @@ using System.Linq; using System.Threading.Tasks; using NSwag.Generation.AspNetCore.Tests.Web.Controllers; -using NSwag.Generation.Processors; using Xunit; namespace NSwag.Generation.AspNetCore.Tests @@ -60,6 +59,7 @@ public async Task When_generating_v2_then_only_v2_operations_are_included() Assert.Equal(2, operations.Count()); Assert.True(operations.All(o => o.Path.Contains("/v2/"))); + Assert.True(operations.All(o => o.Operation.IsDeprecated)); // VersionedIgnoredValues tag should not be in json document Assert.Equal(1, document.Tags.Count); diff --git a/src/NSwag.Generation.AspNetCore/AspNetCoreOpenApiDocumentGenerator.cs b/src/NSwag.Generation.AspNetCore/AspNetCoreOpenApiDocumentGenerator.cs index 82fa6f5f41..230394d20c 100644 --- a/src/NSwag.Generation.AspNetCore/AspNetCoreOpenApiDocumentGenerator.cs +++ b/src/NSwag.Generation.AspNetCore/AspNetCoreOpenApiDocumentGenerator.cs @@ -7,6 +7,7 @@ //----------------------------------------------------------------------- using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -159,7 +160,7 @@ private List GenerateForControllers( Method = httpMethod, Operation = new OpenApiOperation { - IsDeprecated = method.GetCustomAttribute() != null, + IsDeprecated = IsOperationDeprecated(item.Item1, controllerActionDescriptor, method), OperationId = GetOperationId(document, controllerActionDescriptor, method), Consumes = apiDescription.SupportedRequestFormats .Select(f => f.MediaType) @@ -189,6 +190,25 @@ private List GenerateForControllers( return usedControllerTypes; } + private bool IsOperationDeprecated(ApiDescription apiDescription, ControllerActionDescriptor controllerActionDescriptor, MethodInfo methodInfo) + { + if (methodInfo.GetCustomAttribute() != null) + { + return true; + } + + dynamic apiVersionModel = controllerActionDescriptor? + .Properties + .FirstOrDefault(p => p.Key is Type type && type.Name == "ApiVersionModel") + .Value; + + var isDeprecated = (bool)(apiVersionModel != null) && + ((IEnumerable)apiVersionModel.DeprecatedApiVersions).OfType() + .Any(v => v.ToString() == apiDescription.GroupName); + + return isDeprecated; + } + private List> AddOperationDescriptionsToDocument( OpenApiDocument document, Type controllerType, List> operations,