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 <elm@umbraco.dk>
This commit is contained in:
Bjarke Berg
2024-02-28 11:11:56 +00:00
committed by GitHub
parent cc6ebf35fb
commit 68a101371a
2 changed files with 38 additions and 2 deletions

View File

@@ -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<IOptions<UmbracoOperationIdSettings>>())
{
}
public OperationIdSelector(IOptions<UmbracoOperationIdSettings> 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;
}

View File

@@ -0,0 +1,16 @@
namespace Umbraco.Cms.Api.Common.OpenApi;
public class UmbracoOperationIdSettings
{
private HashSet<string> _nameSpacePrefixes = new HashSet<string>()
{
"Umbraco.Cms.Api"
};
public IReadOnlySet<string> NameSpacePrefixes
{
get => _nameSpacePrefixes;
}
public bool AddNameSpacePrefix(string prefix) => _nameSpacePrefixes.Add(prefix);
}