diff --git a/src/Lidarr.Api.V1/Profiles/Quality/QualityItemsValidator.cs b/src/Lidarr.Api.V1/Profiles/Quality/QualityItemsValidator.cs index 772a18bb0..2664a8d99 100644 --- a/src/Lidarr.Api.V1/Profiles/Quality/QualityItemsValidator.cs +++ b/src/Lidarr.Api.V1/Profiles/Quality/QualityItemsValidator.cs @@ -17,6 +17,8 @@ namespace Lidarr.Api.V1.Profiles.Quality ruleBuilder.SetValidator(new ItemGroupIdValidator()); ruleBuilder.SetValidator(new UniqueIdValidator()); ruleBuilder.SetValidator(new UniqueQualityIdValidator()); + ruleBuilder.SetValidator(new AllQualitiesValidator()); + return ruleBuilder.SetValidator(new ItemGroupNameValidator()); } } @@ -151,4 +153,46 @@ namespace Lidarr.Api.V1.Profiles.Quality return true; } } + + public class AllQualitiesValidator : PropertyValidator + { + protected override string GetDefaultMessageTemplate() => "Must contain all qualities"; + + protected override bool IsValid(PropertyValidatorContext context) + { + if (context.PropertyValue is not IList items) + { + return false; + } + + var qualityIds = new HashSet(); + + foreach (var item in items) + { + if (item.Id > 0) + { + foreach (var quality in item.Items) + { + qualityIds.Add(quality.Quality.Id); + } + } + else + { + qualityIds.Add(item.Quality.Id); + } + } + + var allQualityIds = NzbDrone.Core.Qualities.Quality.All; + + foreach (var quality in allQualityIds) + { + if (!qualityIds.Contains(quality.Id)) + { + return false; + } + } + + return true; + } + } } diff --git a/src/Lidarr.Api.V1/Profiles/Quality/QualityProfileController.cs b/src/Lidarr.Api.V1/Profiles/Quality/QualityProfileController.cs index c9e936112..5078f96a4 100644 --- a/src/Lidarr.Api.V1/Profiles/Quality/QualityProfileController.cs +++ b/src/Lidarr.Api.V1/Profiles/Quality/QualityProfileController.cs @@ -24,6 +24,7 @@ namespace Lidarr.Api.V1.Profiles.Quality 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(); @@ -31,6 +32,7 @@ namespace Lidarr.Api.V1.Profiles.Quality 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 &&