From 933c23ce57dbd373b603657023152e4c65278cbe Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 20 May 2023 22:22:04 +0300 Subject: [PATCH] New: Improve validation messages (cherry picked from commit a117001de673e80abd90d54a34a7c86292b3a649) --- src/NzbDrone.Core/Validation/FolderValidator.cs | 4 +++- .../Validation/Paths/FileExistsValidator.cs | 4 +++- .../Validation/Paths/FolderWritableValidator.cs | 5 ++++- .../Validation/Paths/MovieAncestorValidator.cs | 4 +++- .../Validation/Paths/MoviePathValidation.cs | 4 ++-- .../Validation/Paths/PathExistsValidator.cs | 4 +++- src/NzbDrone.Core/Validation/Paths/PathValidator.cs | 4 +++- .../Validation/Paths/RecycleBinValidator.cs | 6 ++++-- .../Validation/Paths/RootFolderAncestorValidator.cs | 4 +++- .../Validation/Paths/RootFolderValidator.cs | 4 +++- .../Validation/Paths/StartupFolderValidator.cs | 3 ++- .../Validation/Paths/SystemFolderValidator.cs | 3 ++- src/NzbDrone.Core/Validation/UrlValidator.cs | 4 +++- .../Movies/MovieFolderAsRootFolderValidator.cs | 9 +++++---- 14 files changed, 43 insertions(+), 19 deletions(-) diff --git a/src/NzbDrone.Core/Validation/FolderValidator.cs b/src/NzbDrone.Core/Validation/FolderValidator.cs index 405fe14bd..99d1bcee8 100644 --- a/src/NzbDrone.Core/Validation/FolderValidator.cs +++ b/src/NzbDrone.Core/Validation/FolderValidator.cs @@ -6,7 +6,7 @@ namespace NzbDrone.Core.Validation { public class FolderValidator : PropertyValidator { - protected override string GetDefaultMessageTemplate() => "Invalid Path"; + protected override string GetDefaultMessageTemplate() => "Invalid Path: '{path}'"; protected override bool IsValid(PropertyValidatorContext context) { @@ -15,6 +15,8 @@ protected override bool IsValid(PropertyValidatorContext context) return false; } + context.MessageFormatter.AppendArgument("path", context.PropertyValue.ToString()); + return context.PropertyValue.ToString().IsPathValid(PathValidationType.CurrentOs); } } diff --git a/src/NzbDrone.Core/Validation/Paths/FileExistsValidator.cs b/src/NzbDrone.Core/Validation/Paths/FileExistsValidator.cs index 02e2aef81..5393ce57b 100644 --- a/src/NzbDrone.Core/Validation/Paths/FileExistsValidator.cs +++ b/src/NzbDrone.Core/Validation/Paths/FileExistsValidator.cs @@ -12,7 +12,7 @@ public FileExistsValidator(IDiskProvider diskProvider) _diskProvider = diskProvider; } - protected override string GetDefaultMessageTemplate() => "File does not exist"; + protected override string GetDefaultMessageTemplate() => "File '{file}' does not exist"; protected override bool IsValid(PropertyValidatorContext context) { @@ -21,6 +21,8 @@ protected override bool IsValid(PropertyValidatorContext context) return false; } + context.MessageFormatter.AppendArgument("file", context.PropertyValue.ToString()); + return _diskProvider.FileExists(context.PropertyValue.ToString()); } } diff --git a/src/NzbDrone.Core/Validation/Paths/FolderWritableValidator.cs b/src/NzbDrone.Core/Validation/Paths/FolderWritableValidator.cs index 6838b3ea6..c9bfdbf58 100644 --- a/src/NzbDrone.Core/Validation/Paths/FolderWritableValidator.cs +++ b/src/NzbDrone.Core/Validation/Paths/FolderWritableValidator.cs @@ -13,7 +13,7 @@ public FolderWritableValidator(IDiskProvider diskProvider) _diskProvider = diskProvider; } - protected override string GetDefaultMessageTemplate() => $"Folder is not writable by user {Environment.UserName}"; + protected override string GetDefaultMessageTemplate() => "Folder '{path}' is not writable by user '{user}'"; protected override bool IsValid(PropertyValidatorContext context) { @@ -22,6 +22,9 @@ protected override bool IsValid(PropertyValidatorContext context) return false; } + context.MessageFormatter.AppendArgument("path", context.PropertyValue.ToString()); + context.MessageFormatter.AppendArgument("user", Environment.UserName); + return _diskProvider.FolderWritable(context.PropertyValue.ToString()); } } diff --git a/src/NzbDrone.Core/Validation/Paths/MovieAncestorValidator.cs b/src/NzbDrone.Core/Validation/Paths/MovieAncestorValidator.cs index 48fa1119f..5b5db4111 100644 --- a/src/NzbDrone.Core/Validation/Paths/MovieAncestorValidator.cs +++ b/src/NzbDrone.Core/Validation/Paths/MovieAncestorValidator.cs @@ -14,7 +14,7 @@ public MovieAncestorValidator(IMovieService movieService) _movieService = movieService; } - protected override string GetDefaultMessageTemplate() => "Path is an ancestor of an existing movie"; + protected override string GetDefaultMessageTemplate() => "Path '{path}' is an ancestor of an existing movie"; protected override bool IsValid(PropertyValidatorContext context) { @@ -23,6 +23,8 @@ protected override bool IsValid(PropertyValidatorContext context) return true; } + context.MessageFormatter.AppendArgument("path", context.PropertyValue.ToString()); + return !_movieService.AllMoviePaths().Any(s => context.PropertyValue.ToString().IsParentPath(s.Value)); } } diff --git a/src/NzbDrone.Core/Validation/Paths/MoviePathValidation.cs b/src/NzbDrone.Core/Validation/Paths/MoviePathValidation.cs index 0010d4a7b..010024aaa 100644 --- a/src/NzbDrone.Core/Validation/Paths/MoviePathValidation.cs +++ b/src/NzbDrone.Core/Validation/Paths/MoviePathValidation.cs @@ -14,7 +14,7 @@ public MoviePathValidator(IMovieService moviesService) _moviesService = moviesService; } - protected override string GetDefaultMessageTemplate() => "Path is already configured for an existing movie: {moviePath}"; + protected override string GetDefaultMessageTemplate() => "Path '{path}' is already configured for an existing movie"; protected override bool IsValid(PropertyValidatorContext context) { @@ -26,7 +26,7 @@ protected override bool IsValid(PropertyValidatorContext context) dynamic instance = context.ParentContext.InstanceToValidate; var instanceId = (int)instance.Id; - context.MessageFormatter.AppendArgument("moviePath", context.PropertyValue.ToString()); + context.MessageFormatter.AppendArgument("path", context.PropertyValue.ToString()); return !_moviesService.AllMoviePaths().Any(s => s.Value.PathEquals(context.PropertyValue.ToString()) && s.Key != instanceId); } diff --git a/src/NzbDrone.Core/Validation/Paths/PathExistsValidator.cs b/src/NzbDrone.Core/Validation/Paths/PathExistsValidator.cs index 91493482f..fbf7b2690 100644 --- a/src/NzbDrone.Core/Validation/Paths/PathExistsValidator.cs +++ b/src/NzbDrone.Core/Validation/Paths/PathExistsValidator.cs @@ -12,7 +12,7 @@ public PathExistsValidator(IDiskProvider diskProvider) _diskProvider = diskProvider; } - protected override string GetDefaultMessageTemplate() => "Path does not exist"; + protected override string GetDefaultMessageTemplate() => "Path '{path}' does not exist"; protected override bool IsValid(PropertyValidatorContext context) { @@ -21,6 +21,8 @@ protected override bool IsValid(PropertyValidatorContext context) return false; } + context.MessageFormatter.AppendArgument("path", context.PropertyValue.ToString()); + return _diskProvider.FolderExists(context.PropertyValue.ToString()); } } diff --git a/src/NzbDrone.Core/Validation/Paths/PathValidator.cs b/src/NzbDrone.Core/Validation/Paths/PathValidator.cs index 831d0e2a7..13da8a937 100644 --- a/src/NzbDrone.Core/Validation/Paths/PathValidator.cs +++ b/src/NzbDrone.Core/Validation/Paths/PathValidator.cs @@ -15,7 +15,7 @@ public static IRuleBuilderOptions IsValidPath(this IRuleBuilder "Invalid Path"; + protected override string GetDefaultMessageTemplate() => "Invalid Path: '{path}'"; protected override bool IsValid(PropertyValidatorContext context) { @@ -24,6 +24,8 @@ protected override bool IsValid(PropertyValidatorContext context) return false; } + context.MessageFormatter.AppendArgument("path", context.PropertyValue.ToString()); + return context.PropertyValue.ToString().IsPathValid(PathValidationType.CurrentOs); } } diff --git a/src/NzbDrone.Core/Validation/Paths/RecycleBinValidator.cs b/src/NzbDrone.Core/Validation/Paths/RecycleBinValidator.cs index 1299b72ac..0c30f7bb7 100644 --- a/src/NzbDrone.Core/Validation/Paths/RecycleBinValidator.cs +++ b/src/NzbDrone.Core/Validation/Paths/RecycleBinValidator.cs @@ -13,18 +13,20 @@ public RecycleBinValidator(IConfigService configService) _configService = configService; } - protected override string GetDefaultMessageTemplate() => "Path is {relationship} configured recycle bin folder"; + protected override string GetDefaultMessageTemplate() => "Path '{path}' is {relationship} configured recycle bin folder"; protected override bool IsValid(PropertyValidatorContext context) { var recycleBin = _configService.RecycleBin; - var folder = context.PropertyValue.ToString(); if (context.PropertyValue == null || recycleBin.IsNullOrWhiteSpace()) { return true; } + var folder = context.PropertyValue.ToString(); + context.MessageFormatter.AppendArgument("path", folder); + if (recycleBin.PathEquals(folder)) { context.MessageFormatter.AppendArgument("relationship", "set to"); diff --git a/src/NzbDrone.Core/Validation/Paths/RootFolderAncestorValidator.cs b/src/NzbDrone.Core/Validation/Paths/RootFolderAncestorValidator.cs index 1b7dd0bfa..c7d9db864 100644 --- a/src/NzbDrone.Core/Validation/Paths/RootFolderAncestorValidator.cs +++ b/src/NzbDrone.Core/Validation/Paths/RootFolderAncestorValidator.cs @@ -14,7 +14,7 @@ public RootFolderAncestorValidator(IRootFolderService rootFolderService) _rootFolderService = rootFolderService; } - protected override string GetDefaultMessageTemplate() => "Path is an ancestor of an existing root folder"; + protected override string GetDefaultMessageTemplate() => "Path '{path}' is an ancestor of an existing root folder"; protected override bool IsValid(PropertyValidatorContext context) { @@ -23,6 +23,8 @@ protected override bool IsValid(PropertyValidatorContext context) return true; } + context.MessageFormatter.AppendArgument("path", context.PropertyValue.ToString()); + return !_rootFolderService.All().Any(s => context.PropertyValue.ToString().IsParentPath(s.Path)); } } diff --git a/src/NzbDrone.Core/Validation/Paths/RootFolderValidator.cs b/src/NzbDrone.Core/Validation/Paths/RootFolderValidator.cs index 7ceffdd7a..7f3db8ed3 100644 --- a/src/NzbDrone.Core/Validation/Paths/RootFolderValidator.cs +++ b/src/NzbDrone.Core/Validation/Paths/RootFolderValidator.cs @@ -13,7 +13,7 @@ public RootFolderValidator(IRootFolderService rootFolderService) _rootFolderService = rootFolderService; } - protected override string GetDefaultMessageTemplate() => "Path is already configured as a root folder"; + protected override string GetDefaultMessageTemplate() => "Path '{path}' is already configured as a root folder"; protected override bool IsValid(PropertyValidatorContext context) { @@ -22,6 +22,8 @@ protected override bool IsValid(PropertyValidatorContext context) return true; } + context.MessageFormatter.AppendArgument("path", context.PropertyValue.ToString()); + return !_rootFolderService.All().Exists(r => r.Path.PathEquals(context.PropertyValue.ToString())); } } diff --git a/src/NzbDrone.Core/Validation/Paths/StartupFolderValidator.cs b/src/NzbDrone.Core/Validation/Paths/StartupFolderValidator.cs index 0243923f1..bba19907f 100644 --- a/src/NzbDrone.Core/Validation/Paths/StartupFolderValidator.cs +++ b/src/NzbDrone.Core/Validation/Paths/StartupFolderValidator.cs @@ -13,7 +13,7 @@ public StartupFolderValidator(IAppFolderInfo appFolderInfo) _appFolderInfo = appFolderInfo; } - protected override string GetDefaultMessageTemplate() => "Path cannot be {relationship} the start up folder"; + protected override string GetDefaultMessageTemplate() => "Path '{path}' cannot be {relationship} the start up folder"; protected override bool IsValid(PropertyValidatorContext context) { @@ -24,6 +24,7 @@ protected override bool IsValid(PropertyValidatorContext context) var startupFolder = _appFolderInfo.StartUpFolder; var folder = context.PropertyValue.ToString(); + context.MessageFormatter.AppendArgument("path", folder); if (startupFolder.PathEquals(folder)) { diff --git a/src/NzbDrone.Core/Validation/Paths/SystemFolderValidator.cs b/src/NzbDrone.Core/Validation/Paths/SystemFolderValidator.cs index 6b891394e..8483bd8c4 100644 --- a/src/NzbDrone.Core/Validation/Paths/SystemFolderValidator.cs +++ b/src/NzbDrone.Core/Validation/Paths/SystemFolderValidator.cs @@ -6,11 +6,12 @@ namespace NzbDrone.Core.Validation.Paths { public class SystemFolderValidator : PropertyValidator { - protected override string GetDefaultMessageTemplate() => "Is {relationship} system folder {systemFolder}"; + protected override string GetDefaultMessageTemplate() => "Path '{path}' is {relationship} system folder {systemFolder}"; protected override bool IsValid(PropertyValidatorContext context) { var folder = context.PropertyValue.ToString(); + context.MessageFormatter.AppendArgument("path", folder); foreach (var systemFolder in SystemFolders.GetSystemFolders()) { diff --git a/src/NzbDrone.Core/Validation/UrlValidator.cs b/src/NzbDrone.Core/Validation/UrlValidator.cs index 8588b4848..26cb06d74 100644 --- a/src/NzbDrone.Core/Validation/UrlValidator.cs +++ b/src/NzbDrone.Core/Validation/UrlValidator.cs @@ -14,7 +14,7 @@ public static IRuleBuilderOptions IsValidUrl(this IRuleBuilder "Invalid Url"; + protected override string GetDefaultMessageTemplate() => "Invalid Url: '{url}'"; protected override bool IsValid(PropertyValidatorContext context) { @@ -23,6 +23,8 @@ protected override bool IsValid(PropertyValidatorContext context) return false; } + context.MessageFormatter.AppendArgument("url", context.PropertyValue.ToString()); + return context.PropertyValue.ToString().IsValidUrl(); } } diff --git a/src/Radarr.Api.V3/Movies/MovieFolderAsRootFolderValidator.cs b/src/Radarr.Api.V3/Movies/MovieFolderAsRootFolderValidator.cs index 2bb46a9d0..f7fd16c6d 100644 --- a/src/Radarr.Api.V3/Movies/MovieFolderAsRootFolderValidator.cs +++ b/src/Radarr.Api.V3/Movies/MovieFolderAsRootFolderValidator.cs @@ -15,7 +15,7 @@ public MovieFolderAsRootFolderValidator(IBuildFileNames fileNameBuilder) _fileNameBuilder = fileNameBuilder; } - protected override string GetDefaultMessageTemplate() => "Root folder path contains movie folder"; + protected override string GetDefaultMessageTemplate() => "Root folder path '{rootFolderPath}' contains movie folder '{movieFolder}'"; protected override bool IsValid(PropertyValidatorContext context) { @@ -24,9 +24,7 @@ protected override bool IsValid(PropertyValidatorContext context) return true; } - var movieResource = context.InstanceToValidate as MovieResource; - - if (movieResource == null) + if (context.InstanceToValidate is not MovieResource movieResource) { return true; } @@ -42,6 +40,9 @@ protected override bool IsValid(PropertyValidatorContext context) var movie = movieResource.ToModel(); var movieFolder = _fileNameBuilder.GetMovieFolder(movie); + context.MessageFormatter.AppendArgument("rootFolderPath", rootFolderPath); + context.MessageFormatter.AppendArgument("movieFolder", movieFolder); + if (movieFolder == rootFolder) { return false;