From 22576edd7063f89e870780e5441ac254dc90bb6e Mon Sep 17 00:00:00 2001 From: Mole Date: Tue, 13 Sep 2022 08:04:45 +0200 Subject: [PATCH] Backoffice api: Refactor controllers (#12934) * Refactor install controller * Removed unused InstallationTypeTarget * Add ApiVersion to controllers * Refactor upgrade controller * Add missing RequireRuntimeLevelAttribute (cherry picked from commit a356cf4f40c9d61f8b41a4f14fcedaa5f504ce3e) --- .../Install/InstallControllerBase.cs | 15 +++ .../Install/SettingsInstallController.cs | 43 +++++++ .../Install/SetupInstallController.cs | 47 ++++++++ .../ValidateDatabaseInstallController.cs | 52 ++++++++ .../Controllers/NewInstallController.cs | 111 ------------------ .../Upgrade/AuthorizeUpgradeController.cs | 24 ++++ .../SettingsUpgradeController.cs} | 28 +---- .../Upgrade/UpgradeControllerBase.cs | 18 +++ .../Installer/SignInUserStep.cs | 2 - 9 files changed, 202 insertions(+), 138 deletions(-) create mode 100644 src/Umbraco.Cms.ManagementApi/Controllers/Install/InstallControllerBase.cs create mode 100644 src/Umbraco.Cms.ManagementApi/Controllers/Install/SettingsInstallController.cs create mode 100644 src/Umbraco.Cms.ManagementApi/Controllers/Install/SetupInstallController.cs create mode 100644 src/Umbraco.Cms.ManagementApi/Controllers/Install/ValidateDatabaseInstallController.cs delete mode 100644 src/Umbraco.Cms.ManagementApi/Controllers/NewInstallController.cs create mode 100644 src/Umbraco.Cms.ManagementApi/Controllers/Upgrade/AuthorizeUpgradeController.cs rename src/Umbraco.Cms.ManagementApi/Controllers/{UpgradeController.cs => Upgrade/SettingsUpgradeController.cs} (58%) create mode 100644 src/Umbraco.Cms.ManagementApi/Controllers/Upgrade/UpgradeControllerBase.cs diff --git a/src/Umbraco.Cms.ManagementApi/Controllers/Install/InstallControllerBase.cs b/src/Umbraco.Cms.ManagementApi/Controllers/Install/InstallControllerBase.cs new file mode 100644 index 0000000000..275a5cd7b7 --- /dev/null +++ b/src/Umbraco.Cms.ManagementApi/Controllers/Install/InstallControllerBase.cs @@ -0,0 +1,15 @@ +using Microsoft.AspNetCore.Mvc; +using NSwag.Annotations; +using Umbraco.Cms.Core; +using Umbraco.Cms.ManagementApi.Filters; +using Umbraco.New.Cms.Web.Common.Routing; + +namespace Umbraco.Cms.ManagementApi.Controllers.Install; + +[ApiController] +[BackOfficeRoute("api/v{version:apiVersion}/install")] +[OpenApiTag("Install")] +[RequireRuntimeLevel(RuntimeLevel.Install)] +public abstract class InstallControllerBase : Controller +{ +} diff --git a/src/Umbraco.Cms.ManagementApi/Controllers/Install/SettingsInstallController.cs b/src/Umbraco.Cms.ManagementApi/Controllers/Install/SettingsInstallController.cs new file mode 100644 index 0000000000..53bae5ffaf --- /dev/null +++ b/src/Umbraco.Cms.ManagementApi/Controllers/Install/SettingsInstallController.cs @@ -0,0 +1,43 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Umbraco.Cms.Core.Mapping; +using Umbraco.Cms.Infrastructure.Install; +using Umbraco.Cms.ManagementApi.ViewModels.Installer; +using Umbraco.New.Cms.Core.Factories; +using Umbraco.New.Cms.Core.Models.Installer; + +namespace Umbraco.Cms.ManagementApi.Controllers.Install; + +[ApiVersion("1.0")] +public class SettingsInstallController : InstallControllerBase +{ + private readonly InstallHelper _installHelper; + private readonly IInstallSettingsFactory _installSettingsFactory; + private readonly IUmbracoMapper _mapper; + + public SettingsInstallController( + InstallHelper installHelper, + IInstallSettingsFactory installSettingsFactory, + IUmbracoMapper mapper) + { + _installHelper = installHelper; + _installSettingsFactory = installSettingsFactory; + _mapper = mapper; + } + + [HttpGet("settings")] + [MapToApiVersion("1.0")] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status428PreconditionRequired)] + [ProducesResponseType(typeof(InstallSettingsViewModel), StatusCodes.Status200OK)] + public async Task> Settings() + { + // Register that the install has started + await _installHelper.SetInstallStatusAsync(false, string.Empty); + + InstallSettingsModel installSettings = _installSettingsFactory.GetInstallSettings(); + InstallSettingsViewModel viewModel = _mapper.Map(installSettings)!; + + return viewModel; + } +} diff --git a/src/Umbraco.Cms.ManagementApi/Controllers/Install/SetupInstallController.cs b/src/Umbraco.Cms.ManagementApi/Controllers/Install/SetupInstallController.cs new file mode 100644 index 0000000000..f639ad3d96 --- /dev/null +++ b/src/Umbraco.Cms.ManagementApi/Controllers/Install/SetupInstallController.cs @@ -0,0 +1,47 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; +using Umbraco.Cms.Core.Configuration.Models; +using Umbraco.Cms.Core.Hosting; +using Umbraco.Cms.Core.Mapping; +using Umbraco.Cms.ManagementApi.ViewModels.Installer; +using Umbraco.Extensions; +using Umbraco.New.Cms.Core.Models.Installer; +using Umbraco.New.Cms.Core.Services.Installer; + +namespace Umbraco.Cms.ManagementApi.Controllers.Install; + +[ApiVersion("1.0")] +public class SetupInstallController : InstallControllerBase +{ + private readonly IUmbracoMapper _mapper; + private readonly IInstallService _installService; + private readonly IHostingEnvironment _hostingEnvironment; + private readonly GlobalSettings _globalSettings; + + public SetupInstallController( + IUmbracoMapper mapper, + IInstallService installService, + IOptions globalSettings, + IHostingEnvironment hostingEnvironment) + { + _mapper = mapper; + _installService = installService; + _hostingEnvironment = hostingEnvironment; + _globalSettings = globalSettings.Value; + } + + [HttpPost("setup")] + [MapToApiVersion("1.0")] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status428PreconditionRequired)] + [ProducesResponseType(StatusCodes.Status200OK)] + public async Task Setup(InstallViewModel installData) + { + InstallData data = _mapper.Map(installData)!; + await _installService.Install(data); + + var backOfficePath = _globalSettings.GetBackOfficePath(_hostingEnvironment); + return Created(backOfficePath, null); + } +} diff --git a/src/Umbraco.Cms.ManagementApi/Controllers/Install/ValidateDatabaseInstallController.cs b/src/Umbraco.Cms.ManagementApi/Controllers/Install/ValidateDatabaseInstallController.cs new file mode 100644 index 0000000000..ae5e26c2c1 --- /dev/null +++ b/src/Umbraco.Cms.ManagementApi/Controllers/Install/ValidateDatabaseInstallController.cs @@ -0,0 +1,52 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Umbraco.Cms.Core.Install.Models; +using Umbraco.Cms.Core.Mapping; +using Umbraco.Cms.Infrastructure.Migrations.Install; +using Umbraco.Cms.ManagementApi.ViewModels.Installer; + +namespace Umbraco.Cms.ManagementApi.Controllers.Install; + +[ApiVersion("1.0")] +public class ValidateDatabaseInstallController : InstallControllerBase +{ + private readonly DatabaseBuilder _databaseBuilder; + private readonly IUmbracoMapper _mapper; + + public ValidateDatabaseInstallController( + DatabaseBuilder databaseBuilder, + IUmbracoMapper mapper) + { + _databaseBuilder = databaseBuilder; + _mapper = mapper; + } + + [HttpPost("validateDatabase")] + [MapToApiVersion("1.0")] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status200OK)] + public async Task ValidateDatabase(DatabaseInstallViewModel viewModel) + { + // TODO: Async - We need to figure out what we want to do with async endpoints that doesn't do anything async + // We want these to be async for future use (Ideally we'll have more async things), + // But we need to figure out how we want to handle it in the meantime? use Task.FromResult or? + DatabaseModel databaseModel = _mapper.Map(viewModel)!; + + var success = _databaseBuilder.ConfigureDatabaseConnection(databaseModel, true); + + if (success) + { + return Ok(); + } + + var invalidModelProblem = new ProblemDetails + { + Title = "Invalid database configuration", + Detail = "The provided database configuration is invalid", + Status = StatusCodes.Status400BadRequest, + Type = "Error", + }; + + return BadRequest(invalidModelProblem); + } +} diff --git a/src/Umbraco.Cms.ManagementApi/Controllers/NewInstallController.cs b/src/Umbraco.Cms.ManagementApi/Controllers/NewInstallController.cs deleted file mode 100644 index 94029edad4..0000000000 --- a/src/Umbraco.Cms.ManagementApi/Controllers/NewInstallController.cs +++ /dev/null @@ -1,111 +0,0 @@ -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Options; -using Umbraco.Cms.Core; -using Umbraco.Cms.Core.Configuration.Models; -using Umbraco.Cms.Core.Hosting; -using Umbraco.Cms.Core.Install.Models; -using Umbraco.Cms.Core.Mapping; -using Umbraco.Cms.Infrastructure.Install; -using Umbraco.Cms.Infrastructure.Migrations.Install; -using Umbraco.Cms.ManagementApi.Filters; -using Umbraco.Cms.ManagementApi.ViewModels.Installer; -using Umbraco.Extensions; -using Umbraco.New.Cms.Core.Factories; -using Umbraco.New.Cms.Core.Models.Installer; -using Umbraco.New.Cms.Core.Services.Installer; -using Umbraco.New.Cms.Web.Common.Routing; - -namespace Umbraco.Cms.ManagementApi.Controllers; - -[ApiController] -[ApiVersion("1.0")] -[BackOfficeRoute("api/v{version:apiVersion}/install")] -[RequireRuntimeLevel(RuntimeLevel.Install)] -public class NewInstallController : Controller -{ - private readonly IUmbracoMapper _mapper; - private readonly IInstallSettingsFactory _installSettingsFactory; - private readonly IInstallService _installService; - private readonly GlobalSettings _globalSettings; - private readonly IHostingEnvironment _hostingEnvironment; - private readonly InstallHelper _installHelper; - private readonly DatabaseBuilder _databaseBuilder; - - public NewInstallController( - IUmbracoMapper mapper, - IInstallSettingsFactory installSettingsFactory, - IInstallService installService, - IOptions globalSettings, - IHostingEnvironment hostingEnvironment, - InstallHelper installHelper, - DatabaseBuilder databaseBuilder) - { - _mapper = mapper; - _installSettingsFactory = installSettingsFactory; - _installService = installService; - _globalSettings = globalSettings.Value; - _hostingEnvironment = hostingEnvironment; - _installHelper = installHelper; - _databaseBuilder = databaseBuilder; - } - - [HttpGet("settings")] - [MapToApiVersion("1.0")] - [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] - [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status428PreconditionRequired)] - [ProducesResponseType(typeof(InstallSettingsViewModel), StatusCodes.Status200OK)] - public async Task> Settings() - { - // Register that the install has started - await _installHelper.SetInstallStatusAsync(false, string.Empty); - - InstallSettingsModel installSettings = _installSettingsFactory.GetInstallSettings(); - InstallSettingsViewModel viewModel = _mapper.Map(installSettings)!; - - return viewModel; - } - - [HttpPost("setup")] - [MapToApiVersion("1.0")] - [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] - [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status428PreconditionRequired)] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task Setup(InstallViewModel installData) - { - InstallData data = _mapper.Map(installData)!; - await _installService.Install(data); - - var backOfficePath = _globalSettings.GetBackOfficePath(_hostingEnvironment); - return Created(backOfficePath, null); - } - - [HttpPost("validateDatabase")] - [MapToApiVersion("1.0")] - [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task ValidateDatabase(DatabaseInstallViewModel viewModel) - { - // TODO: Async - We need to figure out what we want to do with async endpoints that doesn't do anything async - // We want these to be async for future use (Ideally we'll have more async things), - // But we need to figure out how we want to handle it in the meantime? use Task.FromResult or? - DatabaseModel databaseModel = _mapper.Map(viewModel)!; - - var success = _databaseBuilder.ConfigureDatabaseConnection(databaseModel, true); - - if (success) - { - return Ok(); - } - - var invalidModelProblem = new ProblemDetails - { - Title = "Invalid database configuration", - Detail = "The provided database configuration is invalid", - Status = StatusCodes.Status400BadRequest, - Type = "Error", - }; - - return BadRequest(invalidModelProblem); - } -} diff --git a/src/Umbraco.Cms.ManagementApi/Controllers/Upgrade/AuthorizeUpgradeController.cs b/src/Umbraco.Cms.ManagementApi/Controllers/Upgrade/AuthorizeUpgradeController.cs new file mode 100644 index 0000000000..1c8740e0ad --- /dev/null +++ b/src/Umbraco.Cms.ManagementApi/Controllers/Upgrade/AuthorizeUpgradeController.cs @@ -0,0 +1,24 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Umbraco.New.Cms.Core.Services.Installer; + +namespace Umbraco.Cms.ManagementApi.Controllers.Upgrade; + +[ApiVersion("1.0")] +public class AuthorizeUpgradeController : UpgradeControllerBase +{ + private readonly IUpgradeService _upgradeService; + + public AuthorizeUpgradeController(IUpgradeService upgradeService) => _upgradeService = upgradeService; + + [HttpPost("authorize")] + [MapToApiVersion("1.0")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status428PreconditionRequired)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)] + public async Task Authorize() + { + await _upgradeService.Upgrade(); + return Ok(); + } +} diff --git a/src/Umbraco.Cms.ManagementApi/Controllers/UpgradeController.cs b/src/Umbraco.Cms.ManagementApi/Controllers/Upgrade/SettingsUpgradeController.cs similarity index 58% rename from src/Umbraco.Cms.ManagementApi/Controllers/UpgradeController.cs rename to src/Umbraco.Cms.ManagementApi/Controllers/Upgrade/SettingsUpgradeController.cs index 29164adfb2..a7a92cddc7 100644 --- a/src/Umbraco.Cms.ManagementApi/Controllers/UpgradeController.cs +++ b/src/Umbraco.Cms.ManagementApi/Controllers/Upgrade/SettingsUpgradeController.cs @@ -1,48 +1,26 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; -using Umbraco.Cms.Core; using Umbraco.Cms.Core.Mapping; -using Umbraco.Cms.ManagementApi.Filters; using Umbraco.Cms.ManagementApi.ViewModels.Installer; using Umbraco.New.Cms.Core.Factories; using Umbraco.New.Cms.Core.Models.Installer; -using Umbraco.New.Cms.Core.Services.Installer; -using Umbraco.New.Cms.Web.Common.Routing; -namespace Umbraco.Cms.ManagementApi.Controllers; +namespace Umbraco.Cms.ManagementApi.Controllers.Upgrade; -// TODO: This needs to be an authorized controller. -[ApiController] [ApiVersion("1.0")] -[RequireRuntimeLevel(RuntimeLevel.Upgrade)] -[BackOfficeRoute("api/v{version:apiVersion}/upgrade")] -public class UpgradeController : Controller +public class SettingsUpgradeController : UpgradeControllerBase { private readonly IUpgradeSettingsFactory _upgradeSettingsFactory; - private readonly IUpgradeService _upgradeService; private readonly IUmbracoMapper _mapper; - public UpgradeController( + public SettingsUpgradeController( IUpgradeSettingsFactory upgradeSettingsFactory, - IUpgradeService upgradeService, IUmbracoMapper mapper) { _upgradeSettingsFactory = upgradeSettingsFactory; - _upgradeService = upgradeService; _mapper = mapper; } - [HttpPost("authorize")] - [MapToApiVersion("1.0")] - [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status428PreconditionRequired)] - [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)] - public async Task Authorize() - { - await _upgradeService.Upgrade(); - return Ok(); - } - [HttpGet("settings")] [MapToApiVersion("1.0")] [ProducesResponseType(typeof(UpgradeSettingsViewModel), StatusCodes.Status200OK)] diff --git a/src/Umbraco.Cms.ManagementApi/Controllers/Upgrade/UpgradeControllerBase.cs b/src/Umbraco.Cms.ManagementApi/Controllers/Upgrade/UpgradeControllerBase.cs new file mode 100644 index 0000000000..2b489501ec --- /dev/null +++ b/src/Umbraco.Cms.ManagementApi/Controllers/Upgrade/UpgradeControllerBase.cs @@ -0,0 +1,18 @@ +using Microsoft.AspNetCore.Mvc; +using NSwag.Annotations; +using Umbraco.Cms.Core; +using Umbraco.Cms.ManagementApi.Filters; +using Umbraco.New.Cms.Web.Common.Routing; + +namespace Umbraco.Cms.ManagementApi.Controllers.Upgrade; + +// TODO: This needs to be an authorized controller. + +[ApiController] +[RequireRuntimeLevel(RuntimeLevel.Upgrade)] +[BackOfficeRoute("api/v{version:apiVersion}/upgrade")] +[OpenApiTag("Upgrade")] +public abstract class UpgradeControllerBase : Controller +{ + +} diff --git a/src/Umbraco.New.Cms.Web.Common/Installer/SignInUserStep.cs b/src/Umbraco.New.Cms.Web.Common/Installer/SignInUserStep.cs index 62954c61e0..0a923da01d 100644 --- a/src/Umbraco.New.Cms.Web.Common/Installer/SignInUserStep.cs +++ b/src/Umbraco.New.Cms.Web.Common/Installer/SignInUserStep.cs @@ -20,8 +20,6 @@ public class SignInUserStep : IInstallStep _backOfficeUserManager = backOfficeUserManager; } - public InstallationType InstallationTypeTarget => InstallationType.NewInstall; - public async Task ExecuteAsync(InstallData model) { BackOfficeIdentityUser identityUser = await _backOfficeUserManager.FindByIdAsync(Constants.Security.SuperUserIdAsString);