using System.Collections.Generic; using System.Linq; using FluentValidation; using Microsoft.AspNetCore.Mvc; using NzbDrone.Common.Extensions; using NzbDrone.Core.CustomFormats; using NzbDrone.Core.Profiles.Qualities; using Sonarr.Http; using Sonarr.Http.REST; using Sonarr.Http.REST.Attributes; namespace Sonarr.Api.V3.Profiles.Quality { [V3ApiController] public class QualityProfileController : RestController { private readonly IQualityProfileService _profileService; private readonly ICustomFormatService _formatService; public QualityProfileController(IQualityProfileService profileService, ICustomFormatService formatService) { _profileService = profileService; _formatService = formatService; SharedValidator.RuleFor(c => c.Name).NotEmpty(); SharedValidator.RuleFor(c => c.Cutoff).ValidCutoff(); SharedValidator.RuleFor(c => c.Items).ValidItems(); SharedValidator.RuleFor(c => c.FormatItems).Must(items => { var all = _formatService.All().Select(f => f.Id).ToList(); var ids = items.Select(i => i.Format); return all.Except(ids).Empty(); }).WithMessage("All Custom Formats and no extra ones need to be present inside your Profile! Try refreshing your browser."); SharedValidator.RuleFor(c => c).Custom((profile, context) => { if (profile.FormatItems.Where(x => x.Score > 0).Sum(x => x.Score) < profile.MinFormatScore && profile.FormatItems.Max(x => x.Score) < profile.MinFormatScore) { context.AddFailure("Minimum Custom Format Score can never be satisfied"); } }); } [RestPostById] [Consumes("application/json")] public ActionResult Create(QualityProfileResource resource) { var model = resource.ToModel(); model = _profileService.Add(model); return Created(model.Id); } [RestDeleteById] public void DeleteProfile(int id) { _profileService.Delete(id); } [RestPutById] [Consumes("application/json")] public ActionResult Update(QualityProfileResource resource) { var model = resource.ToModel(); _profileService.Update(model); return Accepted(model.Id); } protected override QualityProfileResource GetResourceById(int id) { return _profileService.Get(id).ToResource(); } [HttpGet] [Produces("application/json")] public List GetAll() { return _profileService.All().ToResource(); } } }