* Update signatures to always return ActionResult<> or IActionResult * Make a few endpoints more RESTish * Update OpenAPI json
67 lines
2.7 KiB
C#
67 lines
2.7 KiB
C#
using Microsoft.AspNetCore.Http;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Umbraco.Cms.Core.Mapping;
|
|
using Umbraco.Cms.Core.Models;
|
|
using Umbraco.Cms.Core.Services;
|
|
using Umbraco.Cms.Api.Management.ViewModels.Language;
|
|
using Umbraco.New.Cms.Core.Services.Installer;
|
|
|
|
namespace Umbraco.Cms.Api.Management.Controllers.Language;
|
|
|
|
public class UpdateLanguageController : LanguageControllerBase
|
|
{
|
|
private readonly ILanguageService _languageService;
|
|
private readonly IUmbracoMapper _umbracoMapper;
|
|
private readonly ILocalizationService _localizationService;
|
|
|
|
public UpdateLanguageController(ILanguageService languageService, IUmbracoMapper umbracoMapper, ILocalizationService localizationService)
|
|
{
|
|
_languageService = languageService;
|
|
_umbracoMapper = umbracoMapper;
|
|
_localizationService = localizationService;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Updates a language
|
|
/// </summary>
|
|
[HttpPut("{id:int}")]
|
|
[MapToApiVersion("1.0")]
|
|
[ProducesResponseType(typeof(NotFoundResult), StatusCodes.Status404NotFound)]
|
|
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]
|
|
[ProducesResponseType(StatusCodes.Status200OK)]
|
|
// TODO: This needs to be an authorized endpoint.
|
|
public async Task<ActionResult> Update(int id, LanguageViewModel language)
|
|
{
|
|
ILanguage? existingById = _localizationService.GetLanguageById(id);
|
|
if (existingById is null)
|
|
{
|
|
return await Task.FromResult(NotFound());
|
|
}
|
|
|
|
// note that the service will prevent the default language from being "un-defaulted"
|
|
// but does not hurt to test here - though the UI should prevent it too
|
|
if (existingById.IsDefault && !language.IsDefault)
|
|
{
|
|
ModelState.AddModelError("IsDefault", "Cannot un-default the default language.");
|
|
return await Task.FromResult(ValidationProblem(ModelState));
|
|
}
|
|
|
|
existingById = _umbracoMapper.Map(language, existingById);
|
|
|
|
if (!_languageService.CanUseLanguagesFallbackLanguage(existingById))
|
|
{
|
|
ModelState.AddModelError("FallbackLanguage", "The selected fall back language does not exist.");
|
|
return await Task.FromResult(ValidationProblem(ModelState));
|
|
}
|
|
|
|
if (!_languageService.CanGetProperFallbackLanguage(existingById))
|
|
{
|
|
ModelState.AddModelError("FallbackLanguage", $"The selected fall back language {_localizationService.GetLanguageById(existingById.FallbackLanguageId!.Value)} would create a circular path.");
|
|
return await Task.FromResult(ValidationProblem(ModelState));
|
|
}
|
|
|
|
_localizationService.Save(existingById);
|
|
return await Task.FromResult(Ok());
|
|
}
|
|
}
|