using System.Text; using Asp.Versioning; using Asp.Versioning.ApiExplorer; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen; namespace BuildingBlocks.Swagger; public class ConfigureSwaggerOptions : IConfigureOptions { private readonly IApiVersionDescriptionProvider provider; private readonly SwaggerOptions? _options; /// /// Initializes a new instance of the class. /// /// The provider used to generate Swagger documents. public ConfigureSwaggerOptions(IApiVersionDescriptionProvider provider, IOptions options) { this.provider = provider; _options = options.Value; } /// public void Configure(SwaggerGenOptions options) { // add a swagger document for each discovered API version // note: you might choose to skip or document deprecated API versions differently foreach (var description in provider.ApiVersionDescriptions) { options.SwaggerDoc(description.GroupName, CreateInfoForApiVersion(description)); } } private OpenApiInfo CreateInfoForApiVersion(ApiVersionDescription description) { var text = new StringBuilder("An example application with OpenAPI, Swashbuckle, and API versioning."); var info = new OpenApiInfo { Version = description.ApiVersion.ToString(), Title = _options?.Title ?? "APIs", Description = "An application with Swagger, Swashbuckle, and API versioning.", Contact = new OpenApiContact { Name = "", Email = "" }, License = new OpenApiLicense { Name = "MIT", Url = new Uri("https://opensource.org/licenses/MIT") } }; if (description.IsDeprecated) { text.Append("This API version has been deprecated."); } if (description.SunsetPolicy is SunsetPolicy policy) { if (policy.Date is DateTimeOffset when) { text.Append(" The API will be sunset on ") .Append(when.Date.ToShortDateString()) .Append('.'); } if (policy.HasLinks) { text.AppendLine(); for (var i = 0; i < policy.Links.Count; i++) { var link = policy.Links[i]; if (link.Type == "text/html") { text.AppendLine(); if (link.Title.HasValue) { text.Append(link.Title.Value).Append(": "); } text.Append(link.LinkTarget.OriginalString); } } } } info.Description = text.ToString(); return info; } }