using FluentValidation.Results; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; namespace zero.Core.Entities { [DataContract(Name = "result", Namespace = "")] public class EntityResult { [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 EntityResult() { } public EntityResult(ValidationResult validation) { IsSuccess = validation.IsValid; Errors = validation.Errors.Select(x => new EntityResultError() { Property = x.PropertyName, Message = x.ErrorMessage }).ToList(); } public static EntityResult From(EntityResult with, T model = default) { EntityResult result = new EntityResult(); result.IsSuccess = with.IsSuccess; result.Errors = with.Errors; result.Model = model; return result; } public void AddError(string property, string message) { IsSuccess = false; Errors.Add(new EntityResultError() { Property = property, Message = message }); } public void AddError(string message) { IsSuccess = false; Errors.Add(new EntityResultError() { Property = Constants.ErrorFieldNone, Message = message }); } public EntityResult Combine(EntityResult with) { if (IsSuccess && !with.IsSuccess) { IsSuccess = false; } foreach (EntityResultError error in with.Errors) { Errors.Add(error); } return this; } public static EntityResult Success() => new EntityResult() { IsSuccess = true }; public static EntityResult Success(T model) => new EntityResult() { IsSuccess = true, Model = model }; public static EntityResult Fail() => new EntityResult() { }; public static EntityResult Fail(string property, string message) { EntityResult result = new EntityResult(); result.AddError(property, message); return result; } public static EntityResult Fail(string message) { EntityResult result = new EntityResult(); result.AddError(message); return result; } public static EntityResult Fail(ValidationResult validation) => new EntityResult(validation); public static EntityResult Fail(EntityResultError error) => Fail(error.Property, error.Message); public static EntityResult Fail(IEnumerable errors) => new EntityResult() { IsSuccess = !errors.Any(), Errors = errors.ToList() }; } public class EntityResult : EntityResult { public EntityResult() : base() { } public EntityResult(ValidationResult validation) : base(validation) { } public static EntityResult Maybe(bool isSuccess) => isSuccess ? Success() : Fail(); public new static EntityResult Success() => new EntityResult() { IsSuccess = true }; public new static EntityResult Fail() => new EntityResult() { }; } [DataContract(Name = "resultError", Namespace = "")] public class EntityResultError { [DataMember(Name = "property")] public string Property { get; set; } [DataMember(Name = "message")] public string Message { get; set; } } }