Skip to content

Commit daf5dd7

Browse files
author
Chris Young
committed
Merge branch 'release/5.1.0'
2 parents 0e9b547 + a7be97f commit daf5dd7

File tree

12 files changed

+198
-82
lines changed

12 files changed

+198
-82
lines changed

src/ArchitectNow.Web.Mongo/StartupSample.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,10 @@ public IServiceProvider ConfigureServices(IServiceCollection services)
5050

5151
//Register startup filters (order matters)
5252
services.AddTransient<IStartupFilter, AntiForgeryStartupFilter>();
53-
services.AddTransient<IStartupFilter, SwaggerStartupFilter>(serviceProvider =>
53+
services.AddTransient<IStartupFilter, SwaggerV2StartupFilter>(serviceProvider =>
5454
{
55-
return new SwaggerStartupFilter( serviceProvider.GetService<ILogger<SwaggerStartupFilter>>(),
56-
new SwaggerOptions
55+
return new SwaggerV2StartupFilter( serviceProvider.GetService<ILogger<SwaggerV2StartupFilter>>(),
56+
new SwaggerOptionsV2
5757
{
5858
Version = "1.0",
5959
Title = "API",

src/ArchitectNow.Web.Redis/StartupSample.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@ public IServiceProvider ConfigureServices(IServiceCollection services)
4949

5050
//Register startup filters (order matters)
5151
services.AddTransient<IStartupFilter, AntiForgeryStartupFilter>();
52-
services.AddTransient<IStartupFilter, SwaggerStartupFilter>(serviceProvider =>
52+
services.AddTransient<IStartupFilter, SwaggerV2StartupFilter>(serviceProvider =>
5353
{
54-
return new SwaggerStartupFilter( serviceProvider.GetService<ILogger<SwaggerStartupFilter>>(),
55-
new SwaggerOptions
54+
return new SwaggerV2StartupFilter( serviceProvider.GetService<ILogger<SwaggerV2StartupFilter>>(),
55+
new SwaggerOptionsV2
5656
{
5757
Version = "1.0",
5858
Title = "API",

src/ArchitectNow.Web.Sql/StartupSample.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@ public IServiceProvider ConfigureServices(IServiceCollection services)
4949

5050
//Register startup filters (order matters)
5151
services.AddTransient<IStartupFilter, AntiForgeryStartupFilter>();
52-
services.AddTransient<IStartupFilter, SwaggerStartupFilter>(serviceProvider =>
52+
services.AddTransient<IStartupFilter, SwaggerV2StartupFilter>(serviceProvider =>
5353
{
54-
return new SwaggerStartupFilter( serviceProvider.GetService<ILogger<SwaggerStartupFilter>>(),
55-
new SwaggerOptions
54+
return new SwaggerV2StartupFilter( serviceProvider.GetService<ILogger<SwaggerV2StartupFilter>>(),
55+
new SwaggerOptionsV2
5656
{
5757
Version = "1.0",
5858
Title = "API",

src/ArchitectNow.Web/ArchitectNow.Web.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="2.0.1" />
5252
<PackageReference Include="Microsoft.Extensions.Options" Version="2.0.1" />
5353
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.0.1" />
54-
5554
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
5655
<PackageReference Include="NSwag.AspNetCore" Version="11.17.3" />
5756
<PackageReference Include="Serilog" Version="2.6.0" />
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using System;
2+
using ArchitectNow.Web.Models;
3+
using Microsoft.AspNetCore.Builder;
4+
using Microsoft.AspNetCore.Hosting;
5+
6+
namespace ArchitectNow.Web.Configuration
7+
{
8+
public abstract class SwaggerStartupBase<TSettings, TSwaggerSettings> : IStartupFilter where TSettings : SwaggerOptionsBase
9+
{
10+
protected abstract void ConfigureSettings(TSwaggerSettings settings, TSettings option);
11+
public abstract Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next);
12+
}
13+
}

src/ArchitectNow.Web/Configuration/SwaggerStartupFilter.cs

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,29 @@
22
using System.Linq;
33
using ArchitectNow.Web.Models;
44
using Microsoft.AspNetCore.Builder;
5-
using Microsoft.AspNetCore.Hosting;
65
using Microsoft.Extensions.Logging;
76
using NJsonSchema;
87
using NSwag.AspNetCore;
98
using NSwag.SwaggerGeneration.WebApi;
109

1110
namespace ArchitectNow.Web.Configuration
1211
{
13-
public class SwaggerStartupFilter : IStartupFilter
12+
public class SwaggerV2StartupFilter : SwaggerStartupBase<SwaggerOptionsV2, SwaggerUiSettings<WebApiToSwaggerGeneratorSettings>>
1413
{
15-
private readonly ILogger<SwaggerStartupFilter> _logger;
16-
protected SwaggerOptions[] Options { get; }
14+
private readonly ILogger<SwaggerV2StartupFilter> _logger;
15+
protected SwaggerOptionsV2[] Options { get; }
1716

18-
public SwaggerStartupFilter(ILogger<SwaggerStartupFilter> logger, params SwaggerOptions[] options)
17+
public SwaggerV2StartupFilter(ILogger<SwaggerV2StartupFilter> logger, params SwaggerOptionsV2[] options)
1918
{
2019
_logger = logger;
2120
Options = options;
2221
}
2322

24-
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
23+
public override Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
2524
{
2625
return builder =>
2726
{
28-
_logger.LogInformation($"Configure Start: {nameof(SwaggerStartupFilter)}");
27+
_logger.LogInformation($"Configure Start: {nameof(SwaggerV2StartupFilter)}");
2928

3029
foreach (var option in Options)
3130
{
@@ -44,30 +43,29 @@ public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
4443
}
4544

4645
next(builder);
47-
_logger.LogInformation($"Configure End: {nameof(SwaggerStartupFilter)}");
46+
_logger.LogInformation($"Configure End: {nameof(SwaggerV2StartupFilter)}");
4847
};
4948
}
5049

51-
private void ConfigureSettings(SwaggerUiSettings<WebApiToSwaggerGeneratorSettings> settings, SwaggerOptions option)
50+
protected override void ConfigureSettings(SwaggerUiSettings<WebApiToSwaggerGeneratorSettings> settings, SwaggerOptionsV2 optionV2)
5251
{
53-
settings.SwaggerRoute = option.SwaggerRoute;
54-
settings.SwaggerUiRoute = option.SwaggerUiRoute;
55-
settings.UseJsonEditor = true;
52+
settings.SwaggerRoute = optionV2.SwaggerRoute;
53+
settings.SwaggerUiRoute = optionV2.SwaggerUiRoute;
5654
settings.GeneratorSettings.DefaultPropertyNameHandling = PropertyNameHandling.CamelCase;
57-
settings.GeneratorSettings.Title = option.Title;
55+
settings.GeneratorSettings.Title = optionV2.Title;
5856
settings.GeneratorSettings.FlattenInheritanceHierarchy = true;
5957
settings.GeneratorSettings.IsAspNetCore = true;
60-
61-
foreach (var optionDocumentProcessor in option.DocumentProcessors)
58+
59+
foreach (var optionDocumentProcessor in optionV2.DocumentProcessors)
6260
{
6361
settings.GeneratorSettings.DocumentProcessors.Add(optionDocumentProcessor);
6462
}
6563

66-
foreach (var operationProcessor in option.OperationProcessors)
64+
foreach (var operationProcessor in optionV2.OperationProcessors)
6765
{
6866
settings.GeneratorSettings.OperationProcessors.Add(operationProcessor);
6967
}
70-
var action = option.Configure;
68+
var action = optionV2.Configure;
7169
action?.Invoke(settings);
7270
}
7371
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
using System;
2+
using System.Linq;
3+
using ArchitectNow.Web.Models;
4+
using Microsoft.AspNetCore.Builder;
5+
using Microsoft.Extensions.Logging;
6+
using NJsonSchema;
7+
using NSwag.AspNetCore;
8+
using NSwag.SwaggerGeneration.WebApi;
9+
10+
namespace ArchitectNow.Web.Configuration
11+
{
12+
public class SwaggerV3StartupFilter : SwaggerStartupBase<SwaggerOptionsV3, SwaggerUi3Settings<WebApiToSwaggerGeneratorSettings>>
13+
{
14+
private readonly ILogger<SwaggerV3StartupFilter> _logger;
15+
protected SwaggerOptionsV3[] Options { get; }
16+
17+
public SwaggerV3StartupFilter(ILogger<SwaggerV3StartupFilter> logger, params SwaggerOptionsV3[] options)
18+
{
19+
_logger = logger;
20+
Options = options;
21+
}
22+
23+
public override Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
24+
{
25+
return builder =>
26+
{
27+
_logger.LogInformation($"Configure Start: {nameof(SwaggerV3StartupFilter)}");
28+
29+
foreach (var option in Options)
30+
{
31+
32+
if (option.Controllers?.Any() == true)
33+
{
34+
builder.UseSwaggerUi3(option.Controllers, settings =>
35+
{
36+
ConfigureSettings(settings, option);
37+
});
38+
}
39+
else
40+
{
41+
builder.UseSwaggerUi3(option.ControllerAssembly, settings => { ConfigureSettings(settings, option); });
42+
}
43+
}
44+
45+
next(builder);
46+
_logger.LogInformation($"Configure End: {nameof(SwaggerV3StartupFilter)}");
47+
};
48+
}
49+
50+
protected override void ConfigureSettings(SwaggerUi3Settings<WebApiToSwaggerGeneratorSettings> settings, SwaggerOptionsV3 option)
51+
{
52+
settings.SwaggerRoute = option.SwaggerRoute;
53+
settings.SwaggerUiRoute = option.SwaggerUiRoute;
54+
settings.GeneratorSettings.DefaultPropertyNameHandling = PropertyNameHandling.CamelCase;
55+
settings.GeneratorSettings.Title = option.Title;
56+
settings.GeneratorSettings.FlattenInheritanceHierarchy = true;
57+
settings.GeneratorSettings.IsAspNetCore = true;
58+
59+
foreach (var optionDocumentProcessor in option.DocumentProcessors)
60+
{
61+
settings.GeneratorSettings.DocumentProcessors.Add(optionDocumentProcessor);
62+
}
63+
64+
foreach (var operationProcessor in option.OperationProcessors)
65+
{
66+
settings.GeneratorSettings.OperationProcessors.Add(operationProcessor);
67+
}
68+
var action = option.Configure;
69+
action?.Invoke(settings);
70+
}
71+
}
72+
}

src/ArchitectNow.Web/Models/SwaggerOptions.cs

Lines changed: 0 additions & 51 deletions
This file was deleted.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Diagnostics.CodeAnalysis;
4+
using System.Reflection;
5+
using NSwag.SwaggerGeneration.Processors;
6+
7+
namespace ArchitectNow.Web.Models
8+
{
9+
public class SwaggerOptionsBase
10+
{
11+
[SuppressMessage("ReSharper", "UnusedMember.Global")]
12+
public readonly string DefaultSwaggerRoute = "/docs/v1/swagger.json";
13+
14+
[SuppressMessage("ReSharper", "UnusedMember.Global")]
15+
public readonly string DefaultSwaggerUiRoute = "/docs";
16+
17+
public string Name { get; set; }
18+
public string Version { get; set; }
19+
public string Description { get; set; }
20+
public string Title { get; set; }
21+
public string SwaggerRoute { get; set; } = "/docs/v1/swagger.json";
22+
public string SwaggerUiRoute { get; set; } = "/docs";
23+
public IEnumerable<Type> Controllers { get; set; }
24+
public Assembly ControllerAssembly { get; set; } = Assembly.GetEntryAssembly();
25+
public IList<IDocumentProcessor> DocumentProcessors { get; set; } = new List<IDocumentProcessor>();
26+
27+
[SuppressMessage("ReSharper", "CollectionNeverUpdated.Global")]
28+
public IList<IOperationProcessor> OperationProcessors { get; set; } = new List<IOperationProcessor>();
29+
}
30+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using System;
2+
using NSwag;
3+
using NSwag.AspNetCore;
4+
using NSwag.SwaggerGeneration.Processors.Security;
5+
using NSwag.SwaggerGeneration.WebApi;
6+
7+
namespace ArchitectNow.Web.Models
8+
{
9+
public class SwaggerOptionsV2 : SwaggerOptionsBase
10+
{
11+
public Action<SwaggerUiSettings<WebApiToSwaggerGeneratorSettings>> Configure { get; set; }
12+
13+
public SwaggerOptionsV2(bool includeAuthorizationHeader = true)
14+
{
15+
if (includeAuthorizationHeader)
16+
{
17+
DocumentProcessors.Add(
18+
new SecurityDefinitionAppender("Authorization", new SwaggerSecurityScheme
19+
{
20+
Type = SwaggerSecuritySchemeType.ApiKey,
21+
Name = "Authorization",
22+
In = SwaggerSecurityApiKeyLocation.Header
23+
})
24+
);
25+
}
26+
}
27+
}
28+
}

0 commit comments

Comments
 (0)