From 7215aca67ce3b171426b873c366dbf8a159d51b0 Mon Sep 17 00:00:00 2001 From: Kevin J Lambert Date: Fri, 11 Dec 2020 17:52:44 -0500 Subject: [PATCH] Splitting the validation result models from the main package --- YuckQi.Domain.sln | 6 +++++ .../Extensions/AbstractValidatorExtensions.cs | 23 ++++++++++++++++ .../Result.cs | 16 ++++++++--- .../ResultCode.cs | 9 ++++++- src/YuckQi.Domain.Validation/ResultDetail.cs | 27 +++++++++++++++++++ src/YuckQi.Domain.Validation/ResultMessage.cs | 23 ++++++++++++++++ .../ResultType.cs | 2 +- .../YuckQi.Domain.Validation.csproj | 22 +++++++++++++++ .../Application/{ => Queries}/Results/Page.cs | 2 +- .../Application/Results/ResultDetail.cs | 20 -------------- 10 files changed, 124 insertions(+), 26 deletions(-) create mode 100644 src/YuckQi.Domain.Validation/Extensions/AbstractValidatorExtensions.cs rename src/{YuckQi.Domain/Application/Results => YuckQi.Domain.Validation}/Result.cs (55%) rename src/{YuckQi.Domain/Application/Results => YuckQi.Domain.Validation}/ResultCode.cs (81%) create mode 100644 src/YuckQi.Domain.Validation/ResultDetail.cs create mode 100644 src/YuckQi.Domain.Validation/ResultMessage.cs rename src/{YuckQi.Domain/Application/Results => YuckQi.Domain.Validation}/ResultType.cs (68%) create mode 100644 src/YuckQi.Domain.Validation/YuckQi.Domain.Validation.csproj rename src/YuckQi.Domain/Application/{ => Queries}/Results/Page.cs (93%) delete mode 100644 src/YuckQi.Domain/Application/Results/ResultDetail.cs diff --git a/YuckQi.Domain.sln b/YuckQi.Domain.sln index e056197..2f7da45 100644 --- a/YuckQi.Domain.sln +++ b/YuckQi.Domain.sln @@ -5,6 +5,8 @@ VisualStudioVersion = 16.0.30804.86 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YuckQi.Domain", "src\YuckQi.Domain\YuckQi.Domain.csproj", "{D1B3FB54-0212-41AE-AB29-30AD97269375}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YuckQi.Domain.Validation", "src\YuckQi.Domain.Validation\YuckQi.Domain.Validation.csproj", "{A620A320-F2E9-43A7-858C-9BAF1D76CD8E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -15,6 +17,10 @@ Global {D1B3FB54-0212-41AE-AB29-30AD97269375}.Debug|Any CPU.Build.0 = Debug|Any CPU {D1B3FB54-0212-41AE-AB29-30AD97269375}.Release|Any CPU.ActiveCfg = Release|Any CPU {D1B3FB54-0212-41AE-AB29-30AD97269375}.Release|Any CPU.Build.0 = Release|Any CPU + {A620A320-F2E9-43A7-858C-9BAF1D76CD8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A620A320-F2E9-43A7-858C-9BAF1D76CD8E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A620A320-F2E9-43A7-858C-9BAF1D76CD8E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A620A320-F2E9-43A7-858C-9BAF1D76CD8E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/YuckQi.Domain.Validation/Extensions/AbstractValidatorExtensions.cs b/src/YuckQi.Domain.Validation/Extensions/AbstractValidatorExtensions.cs new file mode 100644 index 0000000..bd9de6f --- /dev/null +++ b/src/YuckQi.Domain.Validation/Extensions/AbstractValidatorExtensions.cs @@ -0,0 +1,23 @@ +using System; +using System.Linq; +using FluentValidation; + +namespace YuckQi.Domain.Validation.Extensions +{ + public static class AbstractValidatorExtensions + { + private const string AbstractValidatorFailedMessageId = "YQDV.01"; + + public static Result GetResult(this AbstractValidator validator, T item) + { + var result = validator.Validate(item); + if (result == null) + throw new ArgumentNullException(nameof(result)); + + if (result.IsValid) + return new Result(item); + + return new Result(default, result.Errors.Select(t => new ResultDetail(ResultCode.InvalidRequestDetail, new ResultMessage(AbstractValidatorFailedMessageId, t.ErrorMessage), t.PropertyName)).ToList()); + } + } +} \ No newline at end of file diff --git a/src/YuckQi.Domain/Application/Results/Result.cs b/src/YuckQi.Domain.Validation/Result.cs similarity index 55% rename from src/YuckQi.Domain/Application/Results/Result.cs rename to src/YuckQi.Domain.Validation/Result.cs index 63557f4..25d1b7a 100644 --- a/src/YuckQi.Domain/Application/Results/Result.cs +++ b/src/YuckQi.Domain.Validation/Result.cs @@ -1,17 +1,27 @@ using System.Collections.Generic; using System.Linq; -namespace YuckQi.Domain.Application.Results +namespace YuckQi.Domain.Validation { public class Result { #region Properties - public IEnumerable Detail { get; } + public IReadOnlyCollection Detail { get; } public bool IsValid => Detail.All(t => t.Type != ResultType.Error); #endregion + + + #region Constructors + + public Result(IReadOnlyCollection detail) + { + Detail = detail; + } + + #endregion } public class Result : Result @@ -25,7 +35,7 @@ public class Result : Result #region Constructors - public Result(T payload) + public Result(T payload, IReadOnlyCollection detail = null) : base(detail) { Payload = payload; } diff --git a/src/YuckQi.Domain/Application/Results/ResultCode.cs b/src/YuckQi.Domain.Validation/ResultCode.cs similarity index 81% rename from src/YuckQi.Domain/Application/Results/ResultCode.cs rename to src/YuckQi.Domain.Validation/ResultCode.cs index db2ac21..89accc8 100644 --- a/src/YuckQi.Domain/Application/Results/ResultCode.cs +++ b/src/YuckQi.Domain.Validation/ResultCode.cs @@ -1,4 +1,4 @@ -namespace YuckQi.Domain.Application.Results +namespace YuckQi.Domain.Validation { public readonly struct ResultCode { @@ -19,6 +19,13 @@ public static implicit operator string(ResultCode resultCode) #endregion + #region Constants + + public static readonly ResultCode InvalidRequestDetail = new ResultCode("invalidRequestDetail"); + + #endregion + + #region Constructors public ResultCode(string code) diff --git a/src/YuckQi.Domain.Validation/ResultDetail.cs b/src/YuckQi.Domain.Validation/ResultDetail.cs new file mode 100644 index 0000000..df1da92 --- /dev/null +++ b/src/YuckQi.Domain.Validation/ResultDetail.cs @@ -0,0 +1,27 @@ +namespace YuckQi.Domain.Validation +{ + public class ResultDetail + { + #region Properties + + public ResultCode Code { get; } + public ResultMessage Message { get; } + public string Property { get; } + public ResultType Type { get; } + + #endregion + + + #region Constructors + + public ResultDetail(ResultCode code, ResultMessage message, string property = null, ResultType type = ResultType.Error) + { + Code = code; + Message = message; + Property = property; + Type = type; + } + + #endregion + } +} \ No newline at end of file diff --git a/src/YuckQi.Domain.Validation/ResultMessage.cs b/src/YuckQi.Domain.Validation/ResultMessage.cs new file mode 100644 index 0000000..048750d --- /dev/null +++ b/src/YuckQi.Domain.Validation/ResultMessage.cs @@ -0,0 +1,23 @@ +namespace YuckQi.Domain.Validation +{ + public readonly struct ResultMessage + { + #region Properties + + public string Id { get; } + public string Text { get; } + + #endregion + + + #region Constructors + + public ResultMessage(string id, string text = null) + { + Id = id; + Text = text; + } + + #endregion + } +} \ No newline at end of file diff --git a/src/YuckQi.Domain/Application/Results/ResultType.cs b/src/YuckQi.Domain.Validation/ResultType.cs similarity index 68% rename from src/YuckQi.Domain/Application/Results/ResultType.cs rename to src/YuckQi.Domain.Validation/ResultType.cs index 2f4652e..fcd3f59 100644 --- a/src/YuckQi.Domain/Application/Results/ResultType.cs +++ b/src/YuckQi.Domain.Validation/ResultType.cs @@ -1,4 +1,4 @@ -namespace YuckQi.Domain.Application.Results +namespace YuckQi.Domain.Validation { public enum ResultType { diff --git a/src/YuckQi.Domain.Validation/YuckQi.Domain.Validation.csproj b/src/YuckQi.Domain.Validation/YuckQi.Domain.Validation.csproj new file mode 100644 index 0000000..3d997fd --- /dev/null +++ b/src/YuckQi.Domain.Validation/YuckQi.Domain.Validation.csproj @@ -0,0 +1,22 @@ + + + + netstandard2.0 + true + Kevin J Lambert + 0.1.1 + LICENSE + + + + + True + + + + + + + + + diff --git a/src/YuckQi.Domain/Application/Results/Page.cs b/src/YuckQi.Domain/Application/Queries/Results/Page.cs similarity index 93% rename from src/YuckQi.Domain/Application/Results/Page.cs rename to src/YuckQi.Domain/Application/Queries/Results/Page.cs index de745fc..c016fb3 100644 --- a/src/YuckQi.Domain/Application/Results/Page.cs +++ b/src/YuckQi.Domain/Application/Queries/Results/Page.cs @@ -2,7 +2,7 @@ using YuckQi.Domain.Application.Abstract; using YuckQi.Domain.Entities.Abstract; -namespace YuckQi.Domain.Application.Results +namespace YuckQi.Domain.Application.Queries.Results { public class Page : IPage where TEntity : class, IEntity where TKey : struct { diff --git a/src/YuckQi.Domain/Application/Results/ResultDetail.cs b/src/YuckQi.Domain/Application/Results/ResultDetail.cs deleted file mode 100644 index 5d5706a..0000000 --- a/src/YuckQi.Domain/Application/Results/ResultDetail.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace YuckQi.Domain.Application.Results -{ - public class ResultDetail - { - #region Properties - - public ResultCode Code { get; } - public string Detail { get; } - public string Message { get; } - public string Property { get; } - public ResultType Type { get; } - - #endregion - - - #region Constructors - - #endregion - } -} \ No newline at end of file