Skip to content

Commit fccfa50

Browse files
committed
add tag ordering transformer and update OpenAPI options
1 parent 69ecb71 commit fccfa50

File tree

4 files changed

+88
-35
lines changed

4 files changed

+88
-35
lines changed

src/SharedKernel/OpenApi/OpenApiExtensions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public static WebApplicationBuilder AddOpenApi(this WebApplicationBuilder builde
3333
options.AddDocument(document, openApiConfiguration);
3434
options.AddSchemaTransformer<EnumSchemaTransformer>();
3535
options.UseApiSecuritySchemes(openApiConfiguration);
36+
options.AddDocumentTransformer<TagOrderingTransformer>();
3637
configureOptions?.Invoke(options);
3738
});
3839
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
using Microsoft.AspNetCore.OpenApi;
2+
using Microsoft.OpenApi.Models;
3+
4+
namespace SharedKernel.OpenApi;
5+
6+
internal sealed class TagOrderingTransformer : IOpenApiDocumentTransformer
7+
{
8+
public Task TransformAsync(OpenApiDocument document,
9+
OpenApiDocumentTransformerContext context,
10+
CancellationToken cancellationToken)
11+
{
12+
var tags = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
13+
foreach (var path in document.Paths.Values)
14+
{
15+
foreach (var op in path.Operations.Values)
16+
{
17+
foreach (var t in op.Tags ?? [])
18+
{
19+
tags.Add(t.Name);
20+
}
21+
}
22+
}
23+
24+
var ordered = tags.OrderBy(t => t, StringComparer.OrdinalIgnoreCase)
25+
.ToList();
26+
27+
document.Tags = ordered.Select(t => new OpenApiTag
28+
{
29+
Name = t
30+
})
31+
.ToList();
32+
33+
var index = document.Tags
34+
.Select((t, i) => (t.Name, i))
35+
.ToDictionary(x => x.Name, x => x.i, StringComparer.OrdinalIgnoreCase);
36+
37+
foreach (var path in document.Paths.Values)
38+
{
39+
foreach (var op in path.Operations.Values)
40+
{
41+
if (op.Tags is { Count: > 1 })
42+
{
43+
op.Tags = op.Tags
44+
.OrderBy(t => index[t.Name])
45+
.ToList();
46+
}
47+
}
48+
}
49+
50+
return Task.CompletedTask;
51+
}
52+
}

src/SharedKernel/OpenApi/UiExtensions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ internal static WebApplication MapScalarUi(this WebApplication app, OpenApiConfi
4040
{
4141
options.Theme = ScalarTheme.Kepler;
4242
options.Favicon = "/swagger-resources/favicon.svg";
43+
options.SortTagsAlphabetically();
4344

4445
foreach (var document in openApiConfigConfiguration.Documents)
4546
{

src/SharedKernel/SharedKernel.csproj

Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -14,51 +14,50 @@
1414
<PackageTags>Pandatech, shared kernel, library, OpenAPI, Swagger, utilities, scalar</PackageTags>
1515
<Description>Pandatech.SharedKernel provides centralized configurations, utilities, and extensions for ASP.NET Core projects. For more information refere to readme.md document.</Description>
1616
<RepositoryUrl>https://github.com/PandaTechAM/be-lib-sharedkernel</RepositoryUrl>
17-
<PackageReleaseNotes>nuget updates</PackageReleaseNotes>
17+
<PackageReleaseNotes>tag ordering added to open api</PackageReleaseNotes>
1818
</PropertyGroup>
1919

2020
<ItemGroup>
21-
<None Include="..\..\pandatech.png" Pack="true" PackagePath="\" />
22-
<None Include="..\..\Readme.md" Pack="true" PackagePath="\" />
21+
<None Include="..\..\pandatech.png" Pack="true" PackagePath="\"/>
22+
<None Include="..\..\Readme.md" Pack="true" PackagePath="\"/>
2323
</ItemGroup>
2424

2525
<ItemGroup>
26-
<EmbeddedResource Include="OpenApi\UiAssets\**\*" />
26+
<EmbeddedResource Include="OpenApi\UiAssets\**\*"/>
2727
</ItemGroup>
2828

2929
<ItemGroup>
30-
<PackageReference Include="AspNetCore.HealthChecks.Prometheus.Metrics" Version="9.0.0" />
31-
<PackageReference Include="AspNetCore.HealthChecks.UI.Client" Version="9.0.0" />
32-
<PackageReference Include="Elastic.CommonSchema.Serilog" Version="9.0.0" />
33-
<PackageReference Include="FluentDateTime" Version="3.0.0" />
34-
<PackageReference Include="FluentValidation.DependencyInjectionExtensions" Version="12.0.0" />
35-
<PackageReference Include="HtmlSanitizer" Version="9.0.886" />
36-
<PackageReference Include="MediatR" Version="[12.5.0]" />
37-
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.8" />
38-
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="9.0.8" />
39-
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" Version="9.0.8" />
40-
<PackageReference Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="9.0.8" />
41-
<PackageReference Include="Microsoft.Extensions.Http.Resilience" Version="9.8.0" />
42-
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.12.0" />
43-
<PackageReference Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.8.0-rc.1" />
44-
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.12.0" />
45-
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.12.0" />
46-
<PackageReference Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" Version="1.0.0-beta.12" />
47-
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.12.0" />
48-
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.12.0" />
49-
<PackageReference Include="Pandatech.CommissionCalculator" Version="4.0.1" />
30+
<PackageReference Include="AspNetCore.HealthChecks.Prometheus.Metrics" Version="9.0.0"/>
31+
<PackageReference Include="AspNetCore.HealthChecks.UI.Client" Version="9.0.0"/>
32+
<PackageReference Include="Elastic.CommonSchema.Serilog" Version="9.0.0"/>
33+
<PackageReference Include="FluentDateTime" Version="3.0.0"/>
34+
<PackageReference Include="FluentValidation.DependencyInjectionExtensions" Version="12.0.0"/>
35+
<PackageReference Include="HtmlSanitizer" Version="9.0.886"/>
36+
<PackageReference Include="MediatR" Version="[12.5.0]"/>
37+
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.8"/>
38+
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="9.0.8"/>
39+
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" Version="9.0.8"/>
40+
<PackageReference Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="9.0.8"/>
41+
<PackageReference Include="Microsoft.Extensions.Http.Resilience" Version="9.8.0"/>
42+
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.12.0"/>
43+
<PackageReference Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.8.0-rc.1"/>
44+
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.12.0"/>
45+
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.12.0"/>
46+
<PackageReference Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" Version="1.0.0-beta.12"/>
47+
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.12.0"/>
48+
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.12.0"/>
5049
<PackageReference Include="Pandatech.Crypto" Version="6.1.1" />
51-
<PackageReference Include="Pandatech.DistributedCache" Version="4.0.9" />
52-
<PackageReference Include="PandaTech.FileExporter" Version="4.1.2" />
53-
<PackageReference Include="PandaTech.FluentImporter" Version="3.0.9" />
54-
<PackageReference Include="Pandatech.FluentMinimalApiMapper" Version="2.0.4" />
55-
<PackageReference Include="Pandatech.PandaVaultClient" Version="4.0.6" />
56-
<PackageReference Include="Pandatech.ResponseCrafter" Version="5.2.2" />
57-
<PackageReference Include="Scalar.AspNetCore" Version="2.8.5" />
58-
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
59-
<PackageReference Include="Serilog.Sinks.Async" Version="2.1.0" />
60-
<PackageReference Include="Serilog.Sinks.Grafana.Loki" Version="8.3.1" />
61-
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="9.0.4" />
50+
<PackageReference Include="Pandatech.DistributedCache" Version="4.0.9"/>
51+
<PackageReference Include="PandaTech.FileExporter" Version="4.1.2"/>
52+
<PackageReference Include="PandaTech.FluentImporter" Version="3.0.9"/>
53+
<PackageReference Include="Pandatech.FluentMinimalApiMapper" Version="2.0.4"/>
54+
<PackageReference Include="Pandatech.PandaVaultClient" Version="4.0.6"/>
55+
<PackageReference Include="Pandatech.ResponseCrafter" Version="5.2.2"/>
56+
<PackageReference Include="Scalar.AspNetCore" Version="2.9.0" />
57+
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0"/>
58+
<PackageReference Include="Serilog.Sinks.Async" Version="2.1.0"/>
59+
<PackageReference Include="Serilog.Sinks.Grafana.Loki" Version="8.3.1"/>
60+
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="9.0.6" />
6261
</ItemGroup>
6362

6463
</Project>

0 commit comments

Comments
 (0)