using System.Linq; using System.Reflection; using FluentValidation; using Microsoft.AspNetCore.Mvc; using NzbDrone.Core.Configuration; using NzbDrone.Core.Languages; using Radarr.Http; using Radarr.Http.REST.Attributes; namespace Radarr.Api.V3.Config { [V3ApiController("config/ui")] public class UiConfigController : ConfigController { private readonly IConfigFileProvider _configFileProvider; public UiConfigController(IConfigFileProvider configFileProvider, IConfigService configService) : base(configService) { _configFileProvider = configFileProvider; SharedValidator.RuleFor(c => c.UILanguage).Custom((value, context) => { if (!Language.All.Any(o => o.Id == value)) { context.AddFailure("Invalid UI Language ID"); } }); SharedValidator.RuleFor(c => c.UILanguage) .GreaterThanOrEqualTo(1) .WithMessage("The UI Language value cannot be less than 1"); } [RestPutById] public override ActionResult SaveConfig([FromBody] UiConfigResource resource) { var dictionary = resource.GetType() .GetProperties(BindingFlags.Instance | BindingFlags.Public) .ToDictionary(prop => prop.Name, prop => prop.GetValue(resource, null)); _configFileProvider.SaveConfigDictionary(dictionary); _configService.SaveConfigDictionary(dictionary); return Accepted(resource.Id); } protected override UiConfigResource ToResource(IConfigService model) { return UiConfigResourceMapper.ToResource(_configFileProvider, model); } } }