|
|
|
using SqlSugar;
|
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Linq;
|
|
|
|
using System.Net.Http.Headers;
|
|
|
|
using System.Runtime.CompilerServices;
|
|
|
|
using System.Text;
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
namespace ReZero.SuperAPI
|
|
|
|
{
|
|
|
|
internal class ValidateParameters
|
|
|
|
{
|
|
|
|
public static async Task<List<ErrorParameter>> CheckAsync(DataModel dataModel)
|
|
|
|
{
|
|
|
|
List<ErrorParameter> errorLists = new List<ErrorParameter>();
|
|
|
|
|
|
|
|
// 记录所有参数的状态,帮助调试
|
|
|
|
Console.WriteLine("==== 开始参数验证 ====");
|
|
|
|
foreach (var item in dataModel.DefaultParameters ?? new List<DataModelDefaultParameter>())
|
|
|
|
{
|
|
|
|
Console.WriteLine($"参数: {item.Name}, 值类型: {(item.Value?.GetType().Name ?? "null")}, 值: {(item.Value?.ToString() ?? "null")}");
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach (var item in dataModel.DefaultParameters ?? new List<DataModelDefaultParameter>())
|
|
|
|
{
|
|
|
|
// 记录Name参数的检查
|
|
|
|
if (item?.Name?.Equals("Name", StringComparison.OrdinalIgnoreCase) == true)
|
|
|
|
{
|
|
|
|
Console.WriteLine($"检查Name参数:Name={item.Name}, Value={(item.Value ?? "null")}, ValueType={(item.Value?.GetType().Name ?? "null")}");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (IsRequired(item))
|
|
|
|
{
|
|
|
|
Console.WriteLine($"参数 {item.Name} 验证失败: 必填但为空");
|
|
|
|
AddReuiredError(errorLists, item);
|
|
|
|
}
|
|
|
|
if (IsInsertUnique(dataModel, item))
|
|
|
|
{
|
|
|
|
await AddInsertUniqueError(dataModel, errorLists, item);
|
|
|
|
}
|
|
|
|
if (item?.ParameterValidate?.IsUnique == true && dataModel.ActionType == ActionType.InsertObject)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Console.WriteLine("==== 参数验证结束 ====");
|
|
|
|
return errorLists;
|
|
|
|
}
|
|
|
|
|
|
|
|
#region Add Error
|
|
|
|
private static async Task AddInsertUniqueError(DataModel dataModel, List<ErrorParameter> errorLists, DataModelDefaultParameter item)
|
|
|
|
{
|
|
|
|
var type = await EntityGeneratorManager.GetTypeAsync(dataModel.TableId);
|
|
|
|
var db = App.GetDbTableId(dataModel.TableId);
|
|
|
|
new CommonDataService().InitDb(type, db!);
|
|
|
|
var entityInfo = db!.EntityMaintenance.GetEntityInfo(type);
|
|
|
|
var dbColumnInfo = entityInfo.Columns.FirstOrDefault(it => it.PropertyName.EqualsCase(item.Name!));
|
|
|
|
var isDeleteIdColumn = entityInfo.Columns.FirstOrDefault(it => it.PropertyName.EqualsCase(nameof(DbBase.IsDeleted)));
|
|
|
|
bool isAny = await IsAnyValue(item, type, db, dbColumnInfo, isDeleteIdColumn, dataModel);
|
|
|
|
if (isAny)
|
|
|
|
{
|
|
|
|
errorLists.Add(new ErrorParameter() { Name = item.Name, ErrorType = "IsUnique", Message = TextHandler.GetCommonText("唯一", "Unique") });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
private static void AddReuiredError(List<ErrorParameter> errorLists, DataModelDefaultParameter item)
|
|
|
|
{
|
|
|
|
errorLists.Add(new ErrorParameter() { Name = item.Name, ErrorType = "IsRequired", Message = TextHandler.GetCommonText("必填", "Required") });
|
|
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region Validate
|
|
|
|
private static bool IsInsertUnique(DataModel dataModel, DataModelDefaultParameter item)
|
|
|
|
{
|
|
|
|
return item?.ParameterValidate?.IsUnique == true && dataModel.ActionType == ActionType.InsertObject;
|
|
|
|
}
|
|
|
|
|
|
|
|
private static bool IsRequired(DataModelDefaultParameter item)
|
|
|
|
{
|
|
|
|
// 如果不是必填字段,直接返回false
|
|
|
|
if (item?.ParameterValidate?.IsRequired != true)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
// 如果值为null,则视为空
|
|
|
|
if (item.Value == null)
|
|
|
|
return true;
|
|
|
|
|
|
|
|
// 如果是字符串类型,检查是否为空字符串
|
|
|
|
if (item.Value is string stringValue)
|
|
|
|
return string.IsNullOrWhiteSpace(stringValue);
|
|
|
|
|
|
|
|
// 基本数值类型通常不视为空
|
|
|
|
if (item.Value is int || item.Value is long || item.Value is decimal ||
|
|
|
|
item.Value is double || item.Value is float || item.Value is bool)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
// JSON类型对象不视为空
|
|
|
|
if (item.Value.GetType().FullName?.Contains("Newtonsoft.Json") == true)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
// 其他类型转换为字符串后判断
|
|
|
|
string valueAsString = Convert.ToString(item.Value);
|
|
|
|
return string.IsNullOrWhiteSpace(valueAsString);
|
|
|
|
}
|
|
|
|
|
|
|
|
private static async Task<bool> IsAnyValue(DataModelDefaultParameter? item, Type type, SqlSugarClient? db, EntityColumnInfo dbColumnInfo, EntityColumnInfo isDeleteIdColumn, DataModel dataModel)
|
|
|
|
{
|
|
|
|
var condition = new ConditionalModel()
|
|
|
|
{
|
|
|
|
ConditionalType = ConditionalType.Equal,
|
|
|
|
CSharpTypeName = dbColumnInfo.UnderType.Name,
|
|
|
|
FieldValue = item!.Value + "",
|
|
|
|
FieldName = dbColumnInfo.DbColumnName
|
|
|
|
|
|
|
|
};
|
|
|
|
var whereColumns = new List<IConditionalModel>() { condition };
|
|
|
|
if (isDeleteIdColumn != null)
|
|
|
|
{
|
|
|
|
var condition2 = new ConditionalModel()
|
|
|
|
{
|
|
|
|
ConditionalType = ConditionalType.Equal,
|
|
|
|
CSharpTypeName = typeof(bool).Name,
|
|
|
|
FieldValue = false.ToString().ToLower(),
|
|
|
|
FieldName = isDeleteIdColumn.DbColumnName
|
|
|
|
};
|
|
|
|
whereColumns.Add(condition2);
|
|
|
|
}
|
|
|
|
if (type.Name == nameof(ZeroEntityInfo))
|
|
|
|
{
|
|
|
|
var condition3 = new ConditionalModel()
|
|
|
|
{
|
|
|
|
ConditionalType = ConditionalType.Equal,
|
|
|
|
CSharpTypeName = typeof(long).Name,
|
|
|
|
FieldValue = dataModel.DefaultParameters.First(it => it.Name!.EqualsCase(nameof(ZeroEntityInfo.DataBaseId))).Value + "",
|
|
|
|
FieldName = db!.EntityMaintenance.GetEntityInfo(type).Columns.First(it => it.PropertyName == nameof(ZeroEntityInfo.DataBaseId)).DbColumnName
|
|
|
|
};
|
|
|
|
whereColumns.Add(condition3);
|
|
|
|
}
|
|
|
|
return await db!.QueryableByObject(type)
|
|
|
|
.Where(whereColumns)
|
|
|
|
.AnyAsync();
|
|
|
|
}
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|