From a021f9e4be2c56e850f47bde18168dbbdf90535c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 13 Sep 2026 02:30:15 +0000 Subject: [PATCH 1/2] Bump the all-updates group with 24 updates Bumps Asp.Versioning.Mvc from 8.1.1 to 10.2.1 Bumps Asp.Versioning.Mvc.ApiExplorer from 8.1.1 to 10.2.1 Bumps FluentFTP from 54.2.0 to 54.2.1 Bumps Microsoft.AspNetCore.Mvc.Testing from 10.0.11 to 10.0.12 Bumps Microsoft.AspNetCore.OpenApi from 9.0.19 to 10.0.12 Bumps Microsoft.Extensions.Caching.Abstractions from 10.0.11 to 10.0.12 Bumps Microsoft.Extensions.Caching.Memory from 10.0.11 to 10.0.12 Bumps Microsoft.Extensions.Configuration from 10.0.11 to 10.0.12 Bumps Microsoft.Extensions.Configuration.UserSecrets from 10.0.11 to 10.0.12 Bumps Microsoft.Extensions.DependencyInjection from 10.0.11 to 10.0.12 Bumps Microsoft.Extensions.DependencyInjection.Abstractions from 10.0.11 to 10.0.12 Bumps Microsoft.Extensions.Logging from 10.0.11 to 10.0.12 Bumps Microsoft.Extensions.Logging.Abstractions from 10.0.11 to 10.0.12 Bumps Microsoft.Extensions.Options from 10.0.11 to 10.0.12 Bumps Microsoft.NET.Test.Sdk from 18.9.0 to 18.10.0 Bumps MX.Api.Abstractions from 2.3.77 to 2.3.80 Bumps MX.Api.Client from 2.3.77 to 2.3.80 Bumps MX.Api.Web.Extensions from 2.3.77 to 2.3.80 Bumps MX.Observability.ApplicationInsights.AspNetCore from 1.1.28 to 1.1.31 Bumps Scalar.AspNetCore from 2.17.2 to 2.17.3 Bumps XtremeIdiots.Portal.Repository.Abstractions.V1 from 4.2.22 to 4.2.34 Bumps XtremeIdiots.Portal.Repository.Api.Client.V1 from 4.2.22 to 4.2.34 Bumps XtremeIdiots.Portal.Server.Events.Abstractions.V1 from 1.1.174 to 1.1.181 Bumps XtremeIdiots.Portal.Settings.Contracts.V1 from 4.2.22 to 4.2.34 --- updated-dependencies: - dependency-name: Asp.Versioning.Mvc dependency-version: 10.2.1 dependency-type: direct:production update-type: version-update:semver-major dependency-group: all-updates - dependency-name: Asp.Versioning.Mvc.ApiExplorer dependency-version: 10.2.1 dependency-type: direct:production update-type: version-update:semver-major dependency-group: all-updates - dependency-name: FluentFTP dependency-version: 54.2.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: Microsoft.AspNetCore.Mvc.Testing dependency-version: 10.0.12 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: Microsoft.AspNetCore.Mvc.Testing dependency-version: 10.0.12 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: Microsoft.AspNetCore.Mvc.Testing dependency-version: 10.0.12 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: Microsoft.AspNetCore.OpenApi dependency-version: 10.0.12 dependency-type: direct:production update-type: version-update:semver-major dependency-group: all-updates - dependency-name: Microsoft.Extensions.Caching.Abstractions dependency-version: 10.0.12 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: Microsoft.Extensions.Caching.Memory dependency-version: 10.0.12 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: Microsoft.Extensions.Logging.Abstractions dependency-version: 10.0.12 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: Microsoft.Extensions.Options dependency-version: 10.0.12 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: Microsoft.Extensions.Caching.Memory dependency-version: 10.0.12 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: Microsoft.Extensions.Configuration dependency-version: 10.0.12 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: Microsoft.Extensions.Configuration.UserSecrets dependency-version: 10.0.12 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: Microsoft.Extensions.DependencyInjection dependency-version: 10.0.12 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: Microsoft.Extensions.DependencyInjection.Abstractions dependency-version: 10.0.12 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: Microsoft.Extensions.Logging dependency-version: 10.0.12 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 18.10.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-updates - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 18.10.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-updates - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 18.10.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-updates - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 18.10.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-updates - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 18.10.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-updates - dependency-name: MX.Api.Abstractions dependency-version: 2.3.80 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: MX.Api.Abstractions dependency-version: 2.3.80 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: MX.Api.Client dependency-version: 2.3.80 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: MX.Api.Client dependency-version: 2.3.80 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: MX.Api.Web.Extensions dependency-version: 2.3.80 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: MX.Observability.ApplicationInsights.AspNetCore dependency-version: 1.1.31 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: Scalar.AspNetCore dependency-version: 2.17.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: XtremeIdiots.Portal.Repository.Abstractions.V1 dependency-version: 4.2.34 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: XtremeIdiots.Portal.Repository.Api.Client.V1 dependency-version: 4.2.34 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: XtremeIdiots.Portal.Server.Events.Abstractions.V1 dependency-version: 1.1.181 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates - dependency-name: XtremeIdiots.Portal.Settings.Contracts.V1 dependency-version: 4.2.34 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-updates ... Signed-off-by: dependabot[bot] --- ...ntegrations.Servers.Abstractions.V1.csproj | 6 ++--- ...vers.Api.Client.IntegrationTests.V1.csproj | 4 ++-- ...ns.Servers.Api.Client.Testing.Tests.csproj | 4 ++-- ...grations.Servers.Api.Client.Testing.csproj | 4 ++-- ...rations.Servers.Api.Client.Tests.V1.csproj | 2 +- ....Integrations.Servers.Api.Client.V1.csproj | 14 +++++------ ...ons.Servers.Api.IntegrationTests.V1.csproj | 4 ++-- ...l.Integrations.Servers.Api.Tests.V1.csproj | 6 ++--- ....Portal.Integrations.Servers.Api.V1.csproj | 24 +++++++++---------- 9 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/XtremeIdiots.Portal.Integrations.Servers.Abstractions.V1/XtremeIdiots.Portal.Integrations.Servers.Abstractions.V1.csproj b/src/XtremeIdiots.Portal.Integrations.Servers.Abstractions.V1/XtremeIdiots.Portal.Integrations.Servers.Abstractions.V1.csproj index 9bb05ba4..c4cbd4f5 100644 --- a/src/XtremeIdiots.Portal.Integrations.Servers.Abstractions.V1/XtremeIdiots.Portal.Integrations.Servers.Abstractions.V1.csproj +++ b/src/XtremeIdiots.Portal.Integrations.Servers.Abstractions.V1/XtremeIdiots.Portal.Integrations.Servers.Abstractions.V1.csproj @@ -23,9 +23,9 @@ - - - + + + diff --git a/src/XtremeIdiots.Portal.Integrations.Servers.Api.Client.IntegrationTests.V1/XtremeIdiots.Portal.Integrations.Servers.Api.Client.IntegrationTests.V1.csproj b/src/XtremeIdiots.Portal.Integrations.Servers.Api.Client.IntegrationTests.V1/XtremeIdiots.Portal.Integrations.Servers.Api.Client.IntegrationTests.V1.csproj index e25e9f52..7499fb4a 100644 --- a/src/XtremeIdiots.Portal.Integrations.Servers.Api.Client.IntegrationTests.V1/XtremeIdiots.Portal.Integrations.Servers.Api.Client.IntegrationTests.V1.csproj +++ b/src/XtremeIdiots.Portal.Integrations.Servers.Api.Client.IntegrationTests.V1/XtremeIdiots.Portal.Integrations.Servers.Api.Client.IntegrationTests.V1.csproj @@ -11,8 +11,8 @@ - - + + diff --git a/src/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Testing.Tests/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Testing.Tests.csproj b/src/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Testing.Tests/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Testing.Tests.csproj index ffd98297..188b7dc9 100644 --- a/src/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Testing.Tests/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Testing.Tests.csproj +++ b/src/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Testing.Tests/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Testing.Tests.csproj @@ -12,8 +12,8 @@ - - + + all diff --git a/src/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Testing/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Testing.csproj b/src/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Testing/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Testing.csproj index c41986d7..518bfca2 100644 --- a/src/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Testing/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Testing.csproj +++ b/src/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Testing/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Testing.csproj @@ -17,8 +17,8 @@ - - + + diff --git a/src/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Tests.V1/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Tests.V1.csproj b/src/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Tests.V1/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Tests.V1.csproj index 120ac048..64beabb5 100644 --- a/src/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Tests.V1/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Tests.V1.csproj +++ b/src/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Tests.V1/XtremeIdiots.Portal.Integrations.Servers.Api.Client.Tests.V1.csproj @@ -12,7 +12,7 @@ - + diff --git a/src/XtremeIdiots.Portal.Integrations.Servers.Api.Client.V1/XtremeIdiots.Portal.Integrations.Servers.Api.Client.V1.csproj b/src/XtremeIdiots.Portal.Integrations.Servers.Api.Client.V1/XtremeIdiots.Portal.Integrations.Servers.Api.Client.V1.csproj index 91d94bbe..c488a1bd 100644 --- a/src/XtremeIdiots.Portal.Integrations.Servers.Api.Client.V1/XtremeIdiots.Portal.Integrations.Servers.Api.Client.V1.csproj +++ b/src/XtremeIdiots.Portal.Integrations.Servers.Api.Client.V1/XtremeIdiots.Portal.Integrations.Servers.Api.Client.V1.csproj @@ -22,13 +22,13 @@ - - - - - - - + + + + + + + diff --git a/src/XtremeIdiots.Portal.Integrations.Servers.Api.IntegrationTests.V1/XtremeIdiots.Portal.Integrations.Servers.Api.IntegrationTests.V1.csproj b/src/XtremeIdiots.Portal.Integrations.Servers.Api.IntegrationTests.V1/XtremeIdiots.Portal.Integrations.Servers.Api.IntegrationTests.V1.csproj index 697291eb..fee6289d 100644 --- a/src/XtremeIdiots.Portal.Integrations.Servers.Api.IntegrationTests.V1/XtremeIdiots.Portal.Integrations.Servers.Api.IntegrationTests.V1.csproj +++ b/src/XtremeIdiots.Portal.Integrations.Servers.Api.IntegrationTests.V1/XtremeIdiots.Portal.Integrations.Servers.Api.IntegrationTests.V1.csproj @@ -11,8 +11,8 @@ - - + + diff --git a/src/XtremeIdiots.Portal.Integrations.Servers.Api.Tests.V1/XtremeIdiots.Portal.Integrations.Servers.Api.Tests.V1.csproj b/src/XtremeIdiots.Portal.Integrations.Servers.Api.Tests.V1/XtremeIdiots.Portal.Integrations.Servers.Api.Tests.V1.csproj index 0356184a..1dea840d 100644 --- a/src/XtremeIdiots.Portal.Integrations.Servers.Api.Tests.V1/XtremeIdiots.Portal.Integrations.Servers.Api.Tests.V1.csproj +++ b/src/XtremeIdiots.Portal.Integrations.Servers.Api.Tests.V1/XtremeIdiots.Portal.Integrations.Servers.Api.Tests.V1.csproj @@ -12,9 +12,9 @@ - - - + + + diff --git a/src/XtremeIdiots.Portal.Integrations.Servers.Api.V1/XtremeIdiots.Portal.Integrations.Servers.Api.V1.csproj b/src/XtremeIdiots.Portal.Integrations.Servers.Api.V1/XtremeIdiots.Portal.Integrations.Servers.Api.V1.csproj index ee49b100..d28a437e 100644 --- a/src/XtremeIdiots.Portal.Integrations.Servers.Api.V1/XtremeIdiots.Portal.Integrations.Servers.Api.V1.csproj +++ b/src/XtremeIdiots.Portal.Integrations.Servers.Api.V1/XtremeIdiots.Portal.Integrations.Servers.Api.V1.csproj @@ -19,23 +19,23 @@ - - + + - - - - - - + + + + + + - - - - + + + + From 46122a0def1db8be70844cd3ea715421e022f615 Mon Sep 17 00:00:00 2001 From: Fraser Molyneux Date: Thu, 17 Sep 2026 18:19:38 +0100 Subject: [PATCH 2/2] fix: complete API versioning dependency upgrade Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/dependabot.yml | 5 +++- .../RepositoryApiClientRegistrationTests.cs | 18 +++++++++++++ .../BearerSecuritySchemeTransformer.cs | 14 +++-------- .../OpenApi/StripVersionPrefixTransformer.cs | 2 +- .../Program.cs | 25 ++++++++++++------- ....Portal.Integrations.Servers.Api.V1.csproj | 2 +- 6 files changed, 44 insertions(+), 22 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 1488a9a0..1fd77cb8 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -9,9 +9,12 @@ updates: time: "02:15" timezone: "Etc/UTC" groups: - all-updates: + minor-and-patch-updates: patterns: - "*" + update-types: + - "minor" + - "patch" ignore: - dependency-name: "Microsoft.ApplicationInsights*" versions: [">=3.0.0"] diff --git a/src/XtremeIdiots.Portal.Integrations.Servers.Api.Tests.V1/RepositoryApiClientRegistrationTests.cs b/src/XtremeIdiots.Portal.Integrations.Servers.Api.Tests.V1/RepositoryApiClientRegistrationTests.cs index 7f475922..69ca3b6e 100644 --- a/src/XtremeIdiots.Portal.Integrations.Servers.Api.Tests.V1/RepositoryApiClientRegistrationTests.cs +++ b/src/XtremeIdiots.Portal.Integrations.Servers.Api.Tests.V1/RepositoryApiClientRegistrationTests.cs @@ -1,5 +1,6 @@ using System.Security.Claims; using System.Text.Encodings.Web; +using System.Text.Json; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Hosting; @@ -122,6 +123,23 @@ public void HostBoot_Registers_LibraryCacheDefaults_ForCachedSubClients() Assert.NotEmpty(mapsPolicies!.Policies); } + [Fact] + public async Task HostBoot_ExposesVersionedOpenApiDocument() + { + using var client = _factory.CreateClient(); + + using var response = await client.GetAsync("/openapi/v1.0.json"); + response.EnsureSuccessStatusCode(); + + using var document = JsonDocument.Parse(await response.Content.ReadAsStreamAsync()); + var root = document.RootElement; + var paths = root.GetProperty("paths").EnumerateObject().Select(path => path.Name).ToArray(); + + Assert.NotEmpty(paths); + Assert.All(paths, path => Assert.False(path.StartsWith("/v1.0", StringComparison.OrdinalIgnoreCase))); + Assert.True(root.GetProperty("components").GetProperty("securitySchemes").TryGetProperty("Bearer", out _)); + } + [Fact] public void SharedRegistration_Extension_BuildsValidatedContainer() { diff --git a/src/XtremeIdiots.Portal.Integrations.Servers.Api.V1/OpenApi/BearerSecuritySchemeTransformer.cs b/src/XtremeIdiots.Portal.Integrations.Servers.Api.V1/OpenApi/BearerSecuritySchemeTransformer.cs index 489de92f..0bbe092f 100644 --- a/src/XtremeIdiots.Portal.Integrations.Servers.Api.V1/OpenApi/BearerSecuritySchemeTransformer.cs +++ b/src/XtremeIdiots.Portal.Integrations.Servers.Api.V1/OpenApi/BearerSecuritySchemeTransformer.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.OpenApi; -using Microsoft.OpenApi.Models; +using Microsoft.OpenApi; namespace XtremeIdiots.Portal.Integrations.Servers.Api.V1.OpenApi; @@ -15,7 +15,7 @@ public async Task TransformAsync(OpenApiDocument document, OpenApiDocumentTransf if (authenticationSchemes.Any(authScheme => authScheme.Name == "Bearer")) { - var requirements = new Dictionary + var requirements = new Dictionary { ["Bearer"] = new OpenApiSecurityScheme { @@ -31,16 +31,10 @@ public async Task TransformAsync(OpenApiDocument document, OpenApiDocumentTransf foreach (var operation in document.Paths.Values.SelectMany(path => path.Operations)) { + operation.Value.Security ??= []; operation.Value.Security.Add(new OpenApiSecurityRequirement { - [new OpenApiSecurityScheme - { - Reference = new OpenApiReference - { - Id = "Bearer", - Type = ReferenceType.SecurityScheme - } - }] = Array.Empty() + [new OpenApiSecuritySchemeReference("Bearer", document)] = [] }); } } diff --git a/src/XtremeIdiots.Portal.Integrations.Servers.Api.V1/OpenApi/StripVersionPrefixTransformer.cs b/src/XtremeIdiots.Portal.Integrations.Servers.Api.V1/OpenApi/StripVersionPrefixTransformer.cs index d0d07039..15cacc7d 100644 --- a/src/XtremeIdiots.Portal.Integrations.Servers.Api.V1/OpenApi/StripVersionPrefixTransformer.cs +++ b/src/XtremeIdiots.Portal.Integrations.Servers.Api.V1/OpenApi/StripVersionPrefixTransformer.cs @@ -1,6 +1,6 @@ using System.Text.RegularExpressions; using Microsoft.AspNetCore.OpenApi; -using Microsoft.OpenApi.Models; +using Microsoft.OpenApi; namespace XtremeIdiots.Portal.Integrations.Servers.Api.V1.OpenApi; diff --git a/src/XtremeIdiots.Portal.Integrations.Servers.Api.V1/Program.cs b/src/XtremeIdiots.Portal.Integrations.Servers.Api.V1/Program.cs index c6892736..95387109 100644 --- a/src/XtremeIdiots.Portal.Integrations.Servers.Api.V1/Program.cs +++ b/src/XtremeIdiots.Portal.Integrations.Servers.Api.V1/Program.cs @@ -82,24 +82,22 @@ // Configure API versioning builder.Services.AddApiVersioning(options => { - options.DefaultApiVersion = new ApiVersion(1, 0); options.AssumeDefaultVersionWhenUnspecified = true; options.ReportApiVersions = true; // Configure URL path versioning options.ApiVersionReader = new UrlSegmentApiVersionReader(); }) +.AddMvc() .AddApiExplorer(options => { // Format the version as "'v'major[.minor]" (e.g. v1.0) options.GroupNameFormat = "'v'VV"; options.SubstituteApiVersionInUrl = true; -}); - -// Configure OpenAPI -builder.Services.AddOpenApi("v1.0", options => +}) +.AddOpenApi(options => { - options.AddDocumentTransformer(); - options.AddDocumentTransformer(); + options.Document.AddDocumentTransformer(); + options.Document.AddDocumentTransformer(); }); builder.Services.AddSingleton(); @@ -141,8 +139,17 @@ } // Configure the HTTP request pipeline. -app.MapOpenApi(); -app.MapScalarApiReference(); +app.MapOpenApi().WithDocumentPerVersion(); +app.MapScalarApiReference(options => +{ + var descriptions = app.DescribeApiVersions(); + + for (var i = 0; i < descriptions.Count; i++) + { + var description = descriptions[i]; + options.AddDocument(description.GroupName, description.GroupName, isDefault: i == descriptions.Count - 1); + } +}); app.UseHttpsRedirection(); diff --git a/src/XtremeIdiots.Portal.Integrations.Servers.Api.V1/XtremeIdiots.Portal.Integrations.Servers.Api.V1.csproj b/src/XtremeIdiots.Portal.Integrations.Servers.Api.V1/XtremeIdiots.Portal.Integrations.Servers.Api.V1.csproj index d28a437e..a8f11bd7 100644 --- a/src/XtremeIdiots.Portal.Integrations.Servers.Api.V1/XtremeIdiots.Portal.Integrations.Servers.Api.V1.csproj +++ b/src/XtremeIdiots.Portal.Integrations.Servers.Api.V1/XtremeIdiots.Portal.Integrations.Servers.Api.V1.csproj @@ -14,13 +14,13 @@ + -