using NCC.Dependency;
using NCC.FriendlyException;
using Microsoft.AspNetCore.Http;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text.RegularExpressions;
namespace NCC.DataValidation
{
///
/// 数据验证拓展类
///
[SuppressSniffer]
public static class DataValidationExtensions
{
///
/// 拓展方法,验证类类型对象
///
/// 对象实例
/// 是否验证所有属性
/// 验证结果
public static DataValidationResult TryValidate(this object obj, bool validateAllProperties = true)
{
return DataValidator.TryValidateObject(obj, validateAllProperties);
}
///
/// 拓展方法,验证单个值
///
/// 单个值
/// 验证特性
///
public static DataValidationResult TryValidate(this object value, params ValidationAttribute[] validationAttributes)
{
return DataValidator.TryValidateValue(value, validationAttributes);
}
///
/// 拓展方法,验证单个值
///
/// 单个值
/// 验证类型
///
public static DataValidationResult TryValidate(this object value, params object[] validationTypes)
{
return DataValidator.TryValidateValue(value, validationTypes);
}
///
/// 拓展方法,验证单个值
///
/// 单个值
/// 验证逻辑
/// 验证类型
///
public static DataValidationResult TryValidate(this object value, ValidationPattern validationOptionss, params object[] validationTypes)
{
return DataValidator.TryValidateValue(value, validationOptionss, validationTypes);
}
///
/// 拓展方法,验证类类型对象
///
/// 对象实例
/// 是否验证所有属性
public static void Validate(this object obj, bool validateAllProperties = true)
{
DataValidator.TryValidateObject(obj, validateAllProperties).ThrowValidateFailedModel();
}
///
/// 拓展方法,验证单个值
///
/// 单个值
/// 验证特性
public static void Validate(this object value, params ValidationAttribute[] validationAttributes)
{
DataValidator.TryValidateValue(value, validationAttributes).ThrowValidateFailedModel();
}
///
/// 拓展方法,验证单个值
///
/// 单个值
/// 验证类型
public static void Validate(this object value, params object[] validationTypes)
{
DataValidator.TryValidateValue(value, validationTypes).ThrowValidateFailedModel();
}
///
/// 拓展方法,验证单个值
///
/// 单个值
/// 验证逻辑
/// 验证类型
public static void Validate(this object value, ValidationPattern validationOptionss, params object[] validationTypes)
{
DataValidator.TryValidateValue(value, validationOptionss, validationTypes).ThrowValidateFailedModel();
}
///
/// 拓展方法,验证单个值
///
/// 单个值
/// 正则表达式
/// 正则表达式选项
///
public static bool TryValidate(this object value, string regexPattern, RegexOptions regexOptions = RegexOptions.None)
{
return DataValidator.TryValidateValue(value, regexPattern, regexOptions);
}
///
/// 直接抛出异常信息
///
///
public static void ThrowValidateFailedModel(this DataValidationResult dataValidationResult)
{
if (!dataValidationResult.IsValid)
{
// 解析验证失败消息,输出统一格式
var validationFailMessage =
dataValidationResult.ValidationResults
.Select(u => new
{
MemberNames = u.MemberNames.Any() ? u.MemberNames : new[] { $"{dataValidationResult.MemberOrValue}" },
u.ErrorMessage
})
.OrderBy(u => u.MemberNames.First())
.GroupBy(u => u.MemberNames.First())
.ToDictionary(x => x.Key, u => u.Select(c => c.ErrorMessage).ToArray());
// 抛出验证失败异常
throw new AppFriendlyException(default, default, new ValidationException())
{
StatusCode = StatusCodes.Status400BadRequest,
ValidationException = true,
ErrorMessage = validationFailMessage,
};
}
}
}
}