diff --git a/src/Umbraco.Web/Editors/KeepAliveController.cs b/src/Umbraco.Web.BackOffice/Controllers/KeepAliveController.cs
similarity index 72%
rename from src/Umbraco.Web/Editors/KeepAliveController.cs
rename to src/Umbraco.Web.BackOffice/Controllers/KeepAliveController.cs
index 23815e1bbe..07393db1b6 100644
--- a/src/Umbraco.Web/Editors/KeepAliveController.cs
+++ b/src/Umbraco.Web.BackOffice/Controllers/KeepAliveController.cs
@@ -1,10 +1,10 @@
-using System.Runtime.Serialization;
-using System.Web.Http;
-using Umbraco.Web.Mvc;
-using Umbraco.Web.WebApi;
-using Umbraco.Web.WebApi.Filters;
+using System;
+using System.Runtime.Serialization;
+using Microsoft.AspNetCore.Mvc;
+using Umbraco.Web.BackOffice.Filters;
+using Umbraco.Web.Common.Controllers;
-namespace Umbraco.Web.Editors
+namespace Umbraco.Web.BackOffice.Controllers
{
public class KeepAliveController : UmbracoApiController
{
@@ -20,6 +20,7 @@ namespace Umbraco.Web.Editors
}
}
+
public class KeepAlivePingResult
{
[DataMember(Name = "success")]
diff --git a/src/Umbraco.Web/Editors/LanguageController.cs b/src/Umbraco.Web.BackOffice/Controllers/LanguageController.cs
similarity index 65%
rename from src/Umbraco.Web/Editors/LanguageController.cs
rename to src/Umbraco.Web.BackOffice/Controllers/LanguageController.cs
index 2bb2953227..8038e7841a 100644
--- a/src/Umbraco.Web/Editors/LanguageController.cs
+++ b/src/Umbraco.Web.BackOffice/Controllers/LanguageController.cs
@@ -1,25 +1,40 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
using System.Globalization;
using System.Linq;
-using System.Net;
-using System.Net.Http;
-using System.Web.Http;
+using Microsoft.AspNetCore.Mvc;
using Umbraco.Core;
+using Umbraco.Core.Configuration;
+using Umbraco.Core.Mapping;
using Umbraco.Core.Models;
-using Umbraco.Web.Mvc;
-using Umbraco.Web.WebApi;
-using Umbraco.Web.WebApi.Filters;
+using Umbraco.Core.Services;
+using Umbraco.Web.BackOffice.Filters;
+using Umbraco.Web.Common.Attributes;
+using Umbraco.Web.Common.Exceptions;
+using Umbraco.Web.Editors;
using Language = Umbraco.Web.Models.ContentEditing.Language;
-namespace Umbraco.Web.Editors
+namespace Umbraco.Web.BackOffice.Controllers
{
///
/// Backoffice controller supporting the dashboard for language administration.
///
[PluginController("UmbracoApi")]
- [PrefixlessBodyModelValidator]
public class LanguageController : UmbracoAuthorizedJsonController
{
+ private readonly ILocalizationService _localizationService;
+ private readonly UmbracoMapper _umbracoMapper;
+ private readonly IGlobalSettings _globalSettings;
+
+ public LanguageController(ILocalizationService localizationService,
+ UmbracoMapper umbracoMapper,
+ IGlobalSettings globalSettings)
+ {
+ _localizationService = localizationService ?? throw new ArgumentNullException(nameof(localizationService));
+ _umbracoMapper = umbracoMapper ?? throw new ArgumentNullException(nameof(umbracoMapper));
+ _globalSettings = globalSettings ?? throw new ArgumentNullException(nameof(globalSettings));
+ }
+
///
/// Returns all cultures available for creating languages.
///
@@ -44,30 +59,30 @@ namespace Umbraco.Web.Editors
[HttpGet]
public IEnumerable GetAllLanguages()
{
- var allLanguages = Services.LocalizationService.GetAllLanguages();
+ var allLanguages = _localizationService.GetAllLanguages();
- return Mapper.Map, IEnumerable>(allLanguages);
+ return _umbracoMapper.Map, IEnumerable>(allLanguages);
}
[HttpGet]
- public Language GetLanguage(int id)
+ public ActionResult GetLanguage(int id)
{
- var lang = Services.LocalizationService.GetLanguageById(id);
+ var lang = _localizationService.GetLanguageById(id);
if (lang == null)
- throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
+ return NotFound();
- return Mapper.Map(lang);
+ return _umbracoMapper.Map(lang);
}
///
/// Deletes a language with a given ID
///
- [UmbracoTreeAuthorize(Core.Constants.Trees.Languages)]
+ [TypeFilter(typeof(UmbracoTreeAuthorizeAttribute), Arguments = new object[]{new string[]{ Constants.Trees.Languages} })]
[HttpDelete]
[HttpPost]
- public IHttpActionResult DeleteLanguage(int id)
+ public IActionResult DeleteLanguage(int id)
{
- var language = Services.LocalizationService.GetLanguageById(id);
+ var language = _localizationService.GetLanguageById(id);
if (language == null)
{
return NotFound();
@@ -77,13 +92,13 @@ namespace Umbraco.Web.Editors
if (language.IsDefault)
{
var message = $"Language '{language.IsoCode}' is currently set to 'default' and can not be deleted.";
- throw new HttpResponseException(Request.CreateNotificationValidationErrorResponse(message));
+ throw HttpResponseException.CreateNotificationValidationErrorResponse(message);
}
// service is happy deleting a language that's fallback for another language,
// will just remove it - so no need to check here
- Services.LocalizationService.Delete(language);
+ _localizationService.Delete(language);
return Ok();
}
@@ -91,15 +106,15 @@ namespace Umbraco.Web.Editors
///
/// Creates or saves a language
///
- [UmbracoTreeAuthorize(Core.Constants.Trees.Languages)]
+ [TypeFilter(typeof(UmbracoTreeAuthorizeAttribute), Arguments = new object[]{new string[]{ Constants.Trees.Languages} })]
[HttpPost]
public Language SaveLanguage(Language language)
{
if (!ModelState.IsValid)
- throw new HttpResponseException(Request.CreateValidationErrorResponse(ModelState));
+ throw HttpResponseException.CreateValidationErrorResponse(ModelState);
// this is prone to race conditions but the service will not let us proceed anyways
- var existingByCulture = Services.LocalizationService.GetLanguageByIsoCode(language.IsoCode);
+ var existingByCulture = _localizationService.GetLanguageByIsoCode(language.IsoCode);
// the localization service might return the generic language even when queried for specific ones (e.g. "da" when queried for "da-DK")
// - we need to handle that explicitly
@@ -112,10 +127,10 @@ namespace Umbraco.Web.Editors
{
//someone is trying to create a language that already exist
ModelState.AddModelError("IsoCode", "The language " + language.IsoCode + " already exists");
- throw new HttpResponseException(Request.CreateValidationErrorResponse(ModelState));
+ throw HttpResponseException.CreateValidationErrorResponse(ModelState);
}
- var existingById = language.Id != default ? Services.LocalizationService.GetLanguageById(language.Id) : null;
+ var existingById = language.Id != default ? _localizationService.GetLanguageById(language.Id) : null;
if (existingById == null)
{
@@ -129,11 +144,11 @@ namespace Umbraco.Web.Editors
catch (CultureNotFoundException)
{
ModelState.AddModelError("IsoCode", "No Culture found with name " + language.IsoCode);
- throw new HttpResponseException(Request.CreateValidationErrorResponse(ModelState));
+ throw HttpResponseException.CreateValidationErrorResponse(ModelState);
}
// create it (creating a new language cannot create a fallback cycle)
- var newLang = new Core.Models.Language(GlobalSettings, culture.Name)
+ var newLang = new Core.Models.Language(_globalSettings, culture.Name)
{
CultureName = culture.DisplayName,
IsDefault = language.IsDefault,
@@ -141,8 +156,8 @@ namespace Umbraco.Web.Editors
FallbackLanguageId = language.FallbackLanguageId
};
- Services.LocalizationService.Save(newLang);
- return Mapper.Map(newLang);
+ _localizationService.Save(newLang);
+ return _umbracoMapper.Map(newLang);
}
existingById.IsMandatory = language.IsMandatory;
@@ -152,7 +167,7 @@ namespace Umbraco.Web.Editors
if (existingById.IsDefault && !language.IsDefault)
{
ModelState.AddModelError("IsDefault", "Cannot un-default the default language.");
- throw new HttpResponseException(Request.CreateValidationErrorResponse(ModelState));
+ throw HttpResponseException.CreateValidationErrorResponse(ModelState);
}
existingById.IsDefault = language.IsDefault;
@@ -163,21 +178,21 @@ namespace Umbraco.Web.Editors
// note that the service will check again, dealing with race conditions
if (existingById.FallbackLanguageId.HasValue)
{
- var languages = Services.LocalizationService.GetAllLanguages().ToDictionary(x => x.Id, x => x);
+ var languages = _localizationService.GetAllLanguages().ToDictionary(x => x.Id, x => x);
if (!languages.ContainsKey(existingById.FallbackLanguageId.Value))
{
ModelState.AddModelError("FallbackLanguage", "The selected fall back language does not exist.");
- throw new HttpResponseException(Request.CreateValidationErrorResponse(ModelState));
+ throw HttpResponseException.CreateValidationErrorResponse(ModelState);
}
if (CreatesCycle(existingById, languages))
{
ModelState.AddModelError("FallbackLanguage", $"The selected fall back language {languages[existingById.FallbackLanguageId.Value].IsoCode} would create a circular path.");
- throw new HttpResponseException(Request.CreateValidationErrorResponse(ModelState));
+ throw HttpResponseException.CreateValidationErrorResponse(ModelState);
}
}
- Services.LocalizationService.Save(existingById);
- return Mapper.Map(existingById);
+ _localizationService.Save(existingById);
+ return _umbracoMapper.Map(existingById);
}
// see LocalizationService
diff --git a/src/Umbraco.Web.BackOffice/Filters/OnlyLocalRequestsAttribute.cs b/src/Umbraco.Web.BackOffice/Filters/OnlyLocalRequestsAttribute.cs
index 9ee289a39c..598aa35219 100644
--- a/src/Umbraco.Web.BackOffice/Filters/OnlyLocalRequestsAttribute.cs
+++ b/src/Umbraco.Web.BackOffice/Filters/OnlyLocalRequestsAttribute.cs
@@ -1,6 +1,5 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
-using Microsoft.Extensions.DependencyInjection;
using Umbraco.Web.Common.Extensions;
namespace Umbraco.Web.BackOffice.Filters
diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj
index 6687660dc6..e18b9be839 100755
--- a/src/Umbraco.Web/Umbraco.Web.csproj
+++ b/src/Umbraco.Web/Umbraco.Web.csproj
@@ -159,7 +159,6 @@
-