From 68a101371ace23f05bdfbe2549d4ed1581c14624 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Wed, 28 Feb 2024 11:11:56 +0000 Subject: [PATCH] Allow operation id selector to work for non-CMS API's (#15771) * Allow OperationIdSelector to work for non CMS APIs https://github.com/umbraco/Umbraco-CMS/issues/15716 * Fixed condition to be more readable --------- Co-authored-by: Elitsa --- .../OpenApi/OperationIdSelector.cs | 24 +++++++++++++++++-- .../OpenApi/UmbracoOperationIdSettings.cs | 16 +++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 src/Umbraco.Cms.Api.Common/OpenApi/UmbracoOperationIdSettings.cs diff --git a/src/Umbraco.Cms.Api.Common/OpenApi/OperationIdSelector.cs b/src/Umbraco.Cms.Api.Common/OpenApi/OperationIdSelector.cs index aa3bbfc699..908c8c8a92 100644 --- a/src/Umbraco.Cms.Api.Common/OpenApi/OperationIdSelector.cs +++ b/src/Umbraco.Cms.Api.Common/OpenApi/OperationIdSelector.cs @@ -1,16 +1,36 @@ using Asp.Versioning; using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.AspNetCore.Mvc.Controllers; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Extensions; namespace Umbraco.Cms.Api.Common.OpenApi; public class OperationIdSelector : IOperationIdSelector { + private readonly UmbracoOperationIdSettings _umbracoOperationIdSettings; + + [Obsolete("Use non obsolete constructor")] + public OperationIdSelector() : this(StaticServiceProvider.Instance.GetRequiredService>()) + { + } + + public OperationIdSelector(IOptions umbracoOperationIdSettings) + { + _umbracoOperationIdSettings = umbracoOperationIdSettings.Value; + } + public virtual string? OperationId(ApiDescription apiDescription, ApiVersioningOptions apiVersioningOptions) { - if (apiDescription.ActionDescriptor is not ControllerActionDescriptor controllerActionDescriptor - || controllerActionDescriptor.ControllerTypeInfo.Namespace?.StartsWith("Umbraco.Cms.Api") is not true) + if (apiDescription.ActionDescriptor is not ControllerActionDescriptor controllerActionDescriptor) + { + return null; + } + + var controllerTypeInfoNamespace = controllerActionDescriptor.ControllerTypeInfo.Namespace; + if (controllerTypeInfoNamespace is not null && _umbracoOperationIdSettings.NameSpacePrefixes.Any(prefix => controllerTypeInfoNamespace.StartsWith(prefix)) is false) { return null; } diff --git a/src/Umbraco.Cms.Api.Common/OpenApi/UmbracoOperationIdSettings.cs b/src/Umbraco.Cms.Api.Common/OpenApi/UmbracoOperationIdSettings.cs new file mode 100644 index 0000000000..6b7ee622a0 --- /dev/null +++ b/src/Umbraco.Cms.Api.Common/OpenApi/UmbracoOperationIdSettings.cs @@ -0,0 +1,16 @@ +namespace Umbraco.Cms.Api.Common.OpenApi; + +public class UmbracoOperationIdSettings +{ + private HashSet _nameSpacePrefixes = new HashSet() + { + "Umbraco.Cms.Api" + }; + + public IReadOnlySet NameSpacePrefixes + { + get => _nameSpacePrefixes; + } + + public bool AddNameSpacePrefix(string prefix) => _nameSpacePrefixes.Add(prefix); +}