Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move manifest endpoints to their own, independent API group and fix access policies accordingly #15989

Merged
merged 12 commits into from
Apr 9, 2024
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,21 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.ViewModels.Package;
using Umbraco.Cms.Api.Management.ViewModels.Manifest;
using Umbraco.Cms.Core.Manifest;
using Umbraco.Cms.Core.Mapping;
using Umbraco.Cms.Web.Common.Authorization;

namespace Umbraco.Cms.Api.Management.Controllers.Package;
namespace Umbraco.Cms.Api.Management.Controllers.Manifest;

[ApiVersion("1.0")]
[Authorize(Policy = AuthorizationPolicies.BackOfficeAccess)]
public class AllPackageManifestController : PackageControllerBase
public class AllManifestController : ManifestControllerBase
{
private readonly IPackageManifestService _packageManifestService;
private readonly IUmbracoMapper _umbracoMapper;

public AllPackageManifestController(IPackageManifestService packageManifestService, IUmbracoMapper umbracoMapper)
public AllManifestController(IPackageManifestService packageManifestService, IUmbracoMapper umbracoMapper)
{
_packageManifestService = packageManifestService;
_umbracoMapper = umbracoMapper;
Expand All @@ -25,10 +25,10 @@ public AllPackageManifestController(IPackageManifestService packageManifestServi
// NOTE: this endpoint is deliberately created as non-paginated to ensure the fastest possible client initialization
[HttpGet("manifest")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(IEnumerable<PackageManifestResponseModel>), StatusCodes.Status200OK)]
public async Task<IActionResult> AllPackageManifests()
[ProducesResponseType(typeof(IEnumerable<ManifestResponseModel>), StatusCodes.Status200OK)]
public async Task<IActionResult> AllManifests()
{
PackageManifest[] packageManifests = (await _packageManifestService.GetAllPackageManifestsAsync()).ToArray();
return Ok(_umbracoMapper.MapEnumerable<PackageManifest, PackageManifestResponseModel>(packageManifests));
return Ok(_umbracoMapper.MapEnumerable<PackageManifest, ManifestResponseModel>(packageManifests));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.Routing;

namespace Umbraco.Cms.Api.Management.Controllers.Manifest;

[VersionedApiBackOfficeRoute("manifest")]
[ApiExplorerSettings(GroupName = "Manifest")]
public abstract class ManifestControllerBase : ManagementApiControllerBase
{
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.ViewModels.Manifest;
using Umbraco.Cms.Core.Manifest;
using Umbraco.Cms.Core.Mapping;
using Umbraco.Cms.Web.Common.Authorization;

namespace Umbraco.Cms.Api.Management.Controllers.Manifest;

[ApiVersion("1.0")]
[Authorize(Policy = AuthorizationPolicies.BackOfficeAccess)]
public class PrivateManifestManifestController : ManifestControllerBase
{
private readonly IPackageManifestService _packageManifestService;
private readonly IUmbracoMapper _umbracoMapper;

public PrivateManifestManifestController(IPackageManifestService packageManifestService, IUmbracoMapper umbracoMapper)
{
_packageManifestService = packageManifestService;
_umbracoMapper = umbracoMapper;
}

// NOTE: this endpoint is deliberately created as non-paginated to ensure the fastest possible client initialization
[HttpGet("manifest/private")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(IEnumerable<ManifestResponseModel>), StatusCodes.Status200OK)]
public async Task<IActionResult> PrivateManifests()
{
PackageManifest[] packageManifests = (await _packageManifestService.GetPrivatePackageManifestsAsync()).ToArray();
kjac marked this conversation as resolved.
Show resolved Hide resolved
return Ok(_umbracoMapper.MapEnumerable<PackageManifest, ManifestResponseModel>(packageManifests));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,20 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.ViewModels.Package;
using Umbraco.Cms.Api.Management.ViewModels.Manifest;
using Umbraco.Cms.Core.Manifest;
using Umbraco.Cms.Core.Mapping;

namespace Umbraco.Cms.Api.Management.Controllers.Package;
namespace Umbraco.Cms.Api.Management.Controllers.Manifest;

[ApiVersion("1.0")]
[AllowAnonymous]
public class PublicPackageManifestController : PackageControllerBase
public class PublicManifestManifestController : ManifestControllerBase
{
private readonly IPackageManifestService _packageManifestService;
private readonly IUmbracoMapper _umbracoMapper;

public PublicPackageManifestController(IPackageManifestService packageManifestService, IUmbracoMapper umbracoMapper)
public PublicManifestManifestController(IPackageManifestService packageManifestService, IUmbracoMapper umbracoMapper)
{
_packageManifestService = packageManifestService;
_umbracoMapper = umbracoMapper;
Expand All @@ -24,10 +24,10 @@ public PublicPackageManifestController(IPackageManifestService packageManifestSe
// NOTE: this endpoint is deliberately created as non-paginated to ensure the fastest possible client initialization
[HttpGet("manifest/public")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(IEnumerable<PackageManifestResponseModel>), StatusCodes.Status200OK)]
public async Task<IActionResult> PublicPackageManifests()
[ProducesResponseType(typeof(IEnumerable<ManifestResponseModel>), StatusCodes.Status200OK)]
public async Task<IActionResult> PublicManifests()
{
PackageManifest[] packageManifests = (await _packageManifestService.GetPublicPackageManifestsAsync()).ToArray();
return Ok(_umbracoMapper.MapEnumerable<PackageManifest, PackageManifestResponseModel>(packageManifests));
return Ok(_umbracoMapper.MapEnumerable<PackageManifest, ManifestResponseModel>(packageManifests));
kjac marked this conversation as resolved.
Show resolved Hide resolved
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using Umbraco.Cms.Api.Management.Mapping.Manifest;
using Umbraco.Cms.Core.DependencyInjection;
using Umbraco.Cms.Core.Mapping;

namespace Umbraco.Cms.Api.Management.DependencyInjection;

internal static class ManifestBuilderExtensions
{
internal static IUmbracoBuilder AddManifests(this IUmbracoBuilder builder)
{
builder
.WithCollectionBuilder<MapDefinitionCollectionBuilder>()
.Add<ManifestViewModelMapDefinition>();

return builder;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@ internal static IUmbracoBuilder AddPackages(this IUmbracoBuilder builder)

builder
.WithCollectionBuilder<MapDefinitionCollectionBuilder>()
.Add<PackageViewModelMapDefinition>()
.Add<PackageManifestViewModelMapDefinition>();
.Add<PackageViewModelMapDefinition>();

return builder;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
.AddUserGroups()
.AddTours()
.AddPackages()
.AddManifests()

Check warning on line 59 in src/Umbraco.Cms.Api.Management/DependencyInjection/UmbracoBuilderExtensions.cs

View check run for this annotation

CodeScene Delta Analysis / CodeScene Cloud Delta Analysis (v14/dev)

❌ Getting worse: Large Method

AddUmbracoManagementApi increases from 70 to 71 lines of code, threshold = 70. Large functions with many lines of code are generally harder to understand and lower the code health. Avoid adding more lines to this function.
.AddEntities()
.AddScripts()
.AddPartialViews()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using Umbraco.Cms.Api.Management.ViewModels.Manifest;
using Umbraco.Cms.Core.Manifest;
using Umbraco.Cms.Core.Mapping;

namespace Umbraco.Cms.Api.Management.Mapping.Manifest;

public class ManifestViewModelMapDefinition : IMapDefinition
{
public void DefineMaps(IUmbracoMapper mapper)
=> mapper.Define<PackageManifest, ManifestResponseModel>((_, _) => new ManifestResponseModel(), Map);

// Umbraco.Code.MapAll
private static void Map(PackageManifest source, ManifestResponseModel target, MapperContext context)
{
target.Name = source.Name;
target.Version = source.Version;
target.Extensions = source.Extensions;
}
}

This file was deleted.

Loading
Loading