From 2a70642ad0fcbf759515e4c46ce6a1d5c754ad6e Mon Sep 17 00:00:00 2001 From: Chris Martinez Date: Sun, 14 Apr 2024 11:45:44 -0700 Subject: [PATCH] Render Swagger UI links in a fancier, more useful way --- .../OpenApiODataWebApiExample/Startup.cs | 31 +++++++++++++++--- .../SomeOpenApiODataWebApiExample/Startup.cs | 31 +++++++++++++++--- .../WebApi/OpenApiWebApiExample/Startup.cs | 32 ++++++++++++++++--- .../ConfigureSwaggerOptions.cs | 23 ++++++++++--- .../ConfigureSwaggerOptions.cs | 23 ++++++++++--- .../ConfigureSwaggerOptions.cs | 23 ++++++++++--- .../OpenApiExample/ConfigureSwaggerOptions.cs | 23 ++++++++++--- 7 files changed, 155 insertions(+), 31 deletions(-) diff --git a/examples/AspNet/OData/OpenApiODataWebApiExample/Startup.cs b/examples/AspNet/OData/OpenApiODataWebApiExample/Startup.cs index e867f18d..e9041933 100644 --- a/examples/AspNet/OData/OpenApiODataWebApiExample/Startup.cs +++ b/examples/AspNet/OData/OpenApiODataWebApiExample/Startup.cs @@ -5,6 +5,7 @@ using Asp.Versioning.Conventions; using Asp.Versioning.OData; using Microsoft.AspNet.OData.Extensions; +using Microsoft.Extensions.Primitives; using Microsoft.OData; using Newtonsoft.Json.Serialization; using Owin; @@ -131,25 +132,45 @@ public void Configuration( IAppBuilder builder ) { description.AppendLine(); + var rendered = false; + for ( var i = 0; i < policy.Links.Count; i++ ) { var link = policy.Links[i]; if ( link.Type == "text/html" ) { - description.AppendLine(); - - if ( link.Title.HasValue ) + if ( !rendered ) { - description.Append( link.Title.Value ).Append( ": " ); + description.AppendLine(); + description.Append( "**Links**" ); + description.AppendLine(); + rendered = true; } - description.Append( link.LinkTarget.OriginalString ); + if ( StringSegment.IsNullOrEmpty( link.Title ) ) + { + if ( link.LinkTarget.IsAbsoluteUri ) + { + description.AppendLine( $"- {link.LinkTarget.OriginalString}" ); + } + else + { + description.AppendFormat( "- {0}", link.LinkTarget.OriginalString ); + description.AppendLine(); + } + } + else + { + description.AppendLine( $"- [{link.Title}]({link.LinkTarget.OriginalString})" ); + } } } } } + description.AppendLine(); + description.AppendLine( "**Additional Information**" ); info.Version( group.Name, $"Sample API {group.ApiVersion}" ) .Contact( c => c.Name( "Bill Mei" ).Email( "bill.mei@somewhere.com" ) ) .Description( description.ToString() ) diff --git a/examples/AspNet/OData/SomeOpenApiODataWebApiExample/Startup.cs b/examples/AspNet/OData/SomeOpenApiODataWebApiExample/Startup.cs index dca602ca..9e223a7e 100644 --- a/examples/AspNet/OData/SomeOpenApiODataWebApiExample/Startup.cs +++ b/examples/AspNet/OData/SomeOpenApiODataWebApiExample/Startup.cs @@ -3,6 +3,7 @@ using Asp.Versioning; using Asp.Versioning.Conventions; using Microsoft.AspNet.OData.Extensions; +using Microsoft.Extensions.Primitives; using Microsoft.OData; using Newtonsoft.Json.Serialization; using Owin; @@ -105,25 +106,45 @@ public void Configuration( IAppBuilder builder ) { description.AppendLine(); + var rendered = false; + for ( var i = 0; i < policy.Links.Count; i++ ) { var link = policy.Links[i]; if ( link.Type == "text/html" ) { - description.AppendLine(); - - if ( link.Title.HasValue ) + if ( !rendered ) { - description.Append( link.Title.Value ).Append( ": " ); + description.AppendLine(); + description.Append( "**Links**" ); + description.AppendLine(); + rendered = true; } - description.Append( link.LinkTarget.OriginalString ); + if ( StringSegment.IsNullOrEmpty( link.Title ) ) + { + if ( link.LinkTarget.IsAbsoluteUri ) + { + description.AppendLine( $"- {link.LinkTarget.OriginalString}" ); + } + else + { + description.AppendFormat( "- {0}", link.LinkTarget.OriginalString ); + description.AppendLine(); + } + } + else + { + description.AppendLine( $"- [{link.Title}]({link.LinkTarget.OriginalString})" ); + } } } } } + description.AppendLine(); + description.AppendLine( "**Additional Information**" ); info.Version( group.Name, $"Sample API {group.ApiVersion}" ) .Contact( c => c.Name( "Bill Mei" ).Email( "bill.mei@somewhere.com" ) ) .Description( description.ToString() ) diff --git a/examples/AspNet/WebApi/OpenApiWebApiExample/Startup.cs b/examples/AspNet/WebApi/OpenApiWebApiExample/Startup.cs index b3651855..848f77f5 100644 --- a/examples/AspNet/WebApi/OpenApiWebApiExample/Startup.cs +++ b/examples/AspNet/WebApi/OpenApiWebApiExample/Startup.cs @@ -2,6 +2,7 @@ using Asp.Versioning; using Asp.Versioning.Routing; +using Microsoft.Extensions.Primitives; using Owin; using Swashbuckle.Application; using System.IO; @@ -10,6 +11,7 @@ using System.Web.Http; using System.Web.Http.Description; using System.Web.Http.Routing; +using static System.Net.Mime.MediaTypeNames; /// /// Represents the startup process for the application. @@ -88,25 +90,45 @@ public void Configuration( IAppBuilder builder ) { description.AppendLine(); + var rendered = false; + for ( var i = 0; i < policy.Links.Count; i++ ) { var link = policy.Links[i]; if ( link.Type == "text/html" ) { - description.AppendLine(); - - if ( link.Title.HasValue ) + if ( !rendered ) { - description.Append( link.Title.Value ).Append( ": " ); + description.AppendLine(); + description.Append( "**Links**" ); + description.AppendLine(); + rendered = true; } - description.Append( link.LinkTarget.OriginalString ); + if ( StringSegment.IsNullOrEmpty( link.Title ) ) + { + if ( link.LinkTarget.IsAbsoluteUri ) + { + description.AppendLine( $"- {link.LinkTarget.OriginalString}" ); + } + else + { + description.AppendFormat( "- {0}", link.LinkTarget.OriginalString ); + description.AppendLine(); + } + } + else + { + description.AppendLine( $"- [{link.Title}]({link.LinkTarget.OriginalString})" ); + } } } } } + description.AppendLine(); + description.AppendLine( "**Additional Information**" ); info.Version( group.Name, $"Example API {group.ApiVersion}" ) .Contact( c => c.Name( "Bill Mei" ).Email( "bill.mei@somewhere.com" ) ) .Description( description.ToString() ) diff --git a/examples/AspNetCore/OData/ODataOpenApiExample/ConfigureSwaggerOptions.cs b/examples/AspNetCore/OData/ODataOpenApiExample/ConfigureSwaggerOptions.cs index d0575a5e..f81ed540 100644 --- a/examples/AspNetCore/OData/ODataOpenApiExample/ConfigureSwaggerOptions.cs +++ b/examples/AspNetCore/OData/ODataOpenApiExample/ConfigureSwaggerOptions.cs @@ -4,6 +4,7 @@ using Asp.Versioning.ApiExplorer; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; +using Microsoft.Extensions.Primitives; using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen; using System.Text; @@ -63,25 +64,39 @@ private static OpenApiInfo CreateInfoForApiVersion( ApiVersionDescription descri { text.AppendLine(); + var rendered = false; + 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 ) + if ( !rendered ) { - text.Append( link.Title.Value ).Append( ": " ); + text.Append( "

Links

" ); + } } } + text.Append( "

Additional Information

" ); info.Description = text.ToString(); return info; diff --git a/examples/AspNetCore/OData/SomeODataOpenApiExample/ConfigureSwaggerOptions.cs b/examples/AspNetCore/OData/SomeODataOpenApiExample/ConfigureSwaggerOptions.cs index 987145a1..4cad607a 100644 --- a/examples/AspNetCore/OData/SomeODataOpenApiExample/ConfigureSwaggerOptions.cs +++ b/examples/AspNetCore/OData/SomeODataOpenApiExample/ConfigureSwaggerOptions.cs @@ -4,6 +4,7 @@ using Asp.Versioning.ApiExplorer; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; +using Microsoft.Extensions.Primitives; using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen; using System.Text; @@ -63,25 +64,39 @@ private static OpenApiInfo CreateInfoForApiVersion( ApiVersionDescription descri { text.AppendLine(); + var rendered = false; + 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 ) + if ( !rendered ) { - text.Append( link.Title.Value ).Append( ": " ); + text.Append( "

Links

" ); + } } } + text.Append( "

Additional Information

" ); info.Description = text.ToString(); return info; diff --git a/examples/AspNetCore/WebApi/MinimalOpenApiExample/ConfigureSwaggerOptions.cs b/examples/AspNetCore/WebApi/MinimalOpenApiExample/ConfigureSwaggerOptions.cs index bee2b1f6..4673321d 100644 --- a/examples/AspNetCore/WebApi/MinimalOpenApiExample/ConfigureSwaggerOptions.cs +++ b/examples/AspNetCore/WebApi/MinimalOpenApiExample/ConfigureSwaggerOptions.cs @@ -4,6 +4,7 @@ using Asp.Versioning.ApiExplorer; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; +using Microsoft.Extensions.Primitives; using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen; using System.Text; @@ -63,25 +64,39 @@ private static OpenApiInfo CreateInfoForApiVersion( ApiVersionDescription descri { text.AppendLine(); + var rendered = false; + 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 ) + if ( !rendered ) { - text.Append( link.Title.Value ).Append( ": " ); + text.Append( "

Links

" ); + } } } + text.Append( "

Additional Information

" ); info.Description = text.ToString(); return info; diff --git a/examples/AspNetCore/WebApi/OpenApiExample/ConfigureSwaggerOptions.cs b/examples/AspNetCore/WebApi/OpenApiExample/ConfigureSwaggerOptions.cs index bee2b1f6..4673321d 100644 --- a/examples/AspNetCore/WebApi/OpenApiExample/ConfigureSwaggerOptions.cs +++ b/examples/AspNetCore/WebApi/OpenApiExample/ConfigureSwaggerOptions.cs @@ -4,6 +4,7 @@ using Asp.Versioning.ApiExplorer; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; +using Microsoft.Extensions.Primitives; using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen; using System.Text; @@ -63,25 +64,39 @@ private static OpenApiInfo CreateInfoForApiVersion( ApiVersionDescription descri { text.AppendLine(); + var rendered = false; + 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 ) + if ( !rendered ) { - text.Append( link.Title.Value ).Append( ": " ); + text.Append( "

Links

" ); + } } } + text.Append( "

Additional Information

" ); info.Description = text.ToString(); return info;