using FluentValidation.Results; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; namespace zero.Core.Entities { [DataContract(Name = "result", Namespace = "")] public class EntityChangeResult { [DataMember(Name = "model")] public T Model { get; set; } [DataMember(Name = "success")] public bool IsSuccess { get; set; } [DataMember(Name = "errors")] public IList Errors { get; set; } = new List(); public EntityChangeResult() { } public EntityChangeResult(ValidationResult validation) { IsSuccess = validation.IsValid; Errors = validation.Errors.Select(x => new EntityChangeResultError() { Property = x.PropertyName, Message = x.ErrorMessage }).ToList(); } public void AddError(string property, string message) { IsSuccess = false; Errors.Add(new EntityChangeResultError() { Property = property, Message = message }); } public EntityChangeResult Combine(EntityChangeResult with) { if (IsSuccess && !with.IsSuccess) { IsSuccess = false; } foreach (EntityChangeResultError error in with.Errors) { Errors.Add(error); } return this; } public static EntityChangeResult Success() => new EntityChangeResult() { IsSuccess = true }; public static EntityChangeResult Success(T model) => new EntityChangeResult() { IsSuccess = true, Model = model }; public static EntityChangeResult Fail() => new EntityChangeResult() { }; public static EntityChangeResult Fail(string property, string message) { EntityChangeResult result = new EntityChangeResult(); result.AddError(property, message); return result; } public static EntityChangeResult Fail(ValidationResult validation) => new EntityChangeResult(validation); public static EntityChangeResult Fail(EntityChangeResultError error) => Fail(error.Property, error.Message); } [DataContract(Name = "resultError", Namespace = "")] public class EntityChangeResultError { [DataMember(Name = "property")] public string Property { get; set; } [DataMember(Name = "message")] public string Message { get; set; } } }