using System.Collections.Generic; using System.Linq; using FluentValidation; using FluentValidation.Results; using Microsoft.AspNetCore.Mvc; using NzbDrone.Common.Extensions; using NzbDrone.Core.Organizer; using Radarr.Http; using Radarr.Http.REST; using Radarr.Http.REST.Attributes; namespace Radarr.Api.V3.Config { [V3ApiController("config/naming")] public class NamingConfigController : RestController { private readonly INamingConfigService _namingConfigService; private readonly IFilenameSampleService _filenameSampleService; private readonly IFilenameValidationService _filenameValidationService; private readonly IBuildFileNames _filenameBuilder; public NamingConfigController(INamingConfigService namingConfigService, IFilenameSampleService filenameSampleService, IFilenameValidationService filenameValidationService, IBuildFileNames filenameBuilder) { _namingConfigService = namingConfigService; _filenameSampleService = filenameSampleService; _filenameValidationService = filenameValidationService; _filenameBuilder = filenameBuilder; SharedValidator.RuleFor(c => c.StandardMovieFormat).ValidMovieFormat(); SharedValidator.RuleFor(c => c.MovieFolderFormat).ValidMovieFolderFormat(); } public override NamingConfigResource GetResourceById(int id) { return GetNamingConfig(); } [HttpGet] public NamingConfigResource GetNamingConfig() { var nameSpec = _namingConfigService.GetConfig(); var resource = nameSpec.ToResource(); if (resource.StandardMovieFormat.IsNotNullOrWhiteSpace()) { var basicConfig = _filenameBuilder.GetBasicNamingConfig(nameSpec); basicConfig.AddToResource(resource); } return resource; } [RestPutById] public ActionResult UpdateNamingConfig(NamingConfigResource resource) { var nameSpec = resource.ToModel(); ValidateFormatResult(nameSpec); _namingConfigService.Save(nameSpec); return Accepted(resource.Id); } [HttpGet("examples")] public object GetExamples([FromQuery]NamingConfigResource config) { if (config.Id == 0) { config = GetNamingConfig(); } var nameSpec = config.ToModel(); var sampleResource = new NamingExampleResource(); var movieSampleResult = _filenameSampleService.GetMovieSample(nameSpec); sampleResource.MovieExample = nameSpec.StandardMovieFormat.IsNullOrWhiteSpace() ? "Invalid Format" : movieSampleResult.FileName; sampleResource.MovieFolderExample = nameSpec.MovieFolderFormat.IsNullOrWhiteSpace() ? "Invalid format" : _filenameSampleService.GetMovieFolderSample(nameSpec); return sampleResource; } private void ValidateFormatResult(NamingConfig nameSpec) { var movieSampleResult = _filenameSampleService.GetMovieSample(nameSpec); var standardMovieValidationResult = _filenameValidationService.ValidateMovieFilename(movieSampleResult); var validationFailures = new List(); if (validationFailures.Any()) { throw new ValidationException(validationFailures.DistinctBy(v => v.PropertyName).ToArray()); } } } }