You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
240 lines
9.7 KiB
240 lines
9.7 KiB
using Microsoft.AspNetCore.Http; |
|
using Newtonsoft.Json.Linq; |
|
using System; |
|
using System.Collections.Generic; |
|
using System.IO; |
|
using System.Linq; |
|
using System.Text; |
|
|
|
namespace ReZero.SuperAPI |
|
{ |
|
public partial class BindHttpParameters |
|
{ |
|
internal void Bind(DataModel? dataModel, HttpContext context, string? path, bool isUrlParameters, ZeroInterfaceList interInfo) |
|
{ |
|
var formDatas = GetFormDatas(context); |
|
BindPageParameters(dataModel, context, formDatas); |
|
BindDefaultParameters(dataModel, context, formDatas, interInfo); |
|
BindOrderByParameters(dataModel, context, formDatas); |
|
BindGroupByParameters(dataModel, context, formDatas); |
|
BindUrlParameters(isUrlParameters,path, dataModel!, interInfo); |
|
} |
|
|
|
private void BindUrlParameters(bool isUrlParameters, string? path, DataModel dataModel, ZeroInterfaceList interInfo) |
|
{ |
|
if (isUrlParameters) |
|
{ |
|
var parameterString = path!.Replace(interInfo.OriginalUrl!.ToLower(), string.Empty); |
|
var parameters= parameterString.Split('/').Where(it=>!string.IsNullOrWhiteSpace(it)).ToArray(); |
|
var index = 0; |
|
foreach (var item in dataModel.DefaultParameters??new List<DataModelDefaultParameter>()) |
|
{ |
|
item.Value= parameters[index]; |
|
index++; |
|
} |
|
} |
|
} |
|
|
|
private void BindGroupByParameters(DataModel? dataModel, HttpContext context, Dictionary<string, object> formDatas) |
|
{ |
|
if (dataModel?.GroupParemters != null) |
|
{ |
|
var groupBys = formDatas.FirstOrDefault(it => it.Key.EqualsCase(nameof(DataModel.GroupParemters))); |
|
if (groupBys.Value != null) |
|
{ |
|
dataModel!.GroupParemters = Newtonsoft.Json.JsonConvert.DeserializeObject<List<DataModelGroupParameter>>(groupBys.Value + ""); |
|
} |
|
} |
|
} |
|
|
|
private void BindOrderByParameters(DataModel? dataModel, HttpContext context, Dictionary<string, object> formDatas) |
|
{ |
|
if (dataModel?.OrderDynamicParemters != null) |
|
{ |
|
//var data = dataModel?.DefaultParameters?.FirstOrDefault(it => it?.Name?.EqualsCase(nameof(DataModel.OrderByFixedParemters )) == true); |
|
//if (data != null) |
|
//{ |
|
var orderDatas = formDatas.FirstOrDefault(it => it.Key.EqualsCase(nameof(DataModel.OrderDynamicParemters))); |
|
if (orderDatas.Value != null) |
|
{ |
|
dataModel!.OrderDynamicParemters = Newtonsoft.Json.JsonConvert.DeserializeObject<List<DataModelDynamicOrderParemter>>(orderDatas.Value + ""); |
|
} |
|
//} |
|
} |
|
} |
|
private void BindPageParameters(DataModel? dataModel, HttpContext context, Dictionary<string, object> formDatas) |
|
{ |
|
if (dataModel?.CommonPage != null) |
|
{ |
|
var pageNumberPar = dataModel?.DefaultParameters?.FirstOrDefault(it => it?.Name?.EqualsCase(SuperAPIModule._apiOptions?.InterfaceOptions.PageNumberPropName) == true); |
|
if (pageNumberPar != null) |
|
{ |
|
pageNumberPar.Value = GetParameterValueFromRequest(pageNumberPar, context, formDatas); |
|
dataModel!.CommonPage.PageNumber = Convert.ToInt32(pageNumberPar.Value ?? "1"); |
|
} |
|
var pageSizePar = dataModel?.DefaultParameters?.FirstOrDefault(it => it?.Name?.EqualsCase(SuperAPIModule._apiOptions?.InterfaceOptions.PageSizePropName) == true); |
|
if (pageSizePar != null) |
|
{ |
|
pageSizePar.Value = GetParameterValueFromRequest(pageSizePar, context, formDatas); |
|
dataModel!.CommonPage.PageSize = Convert.ToInt32(pageSizePar.Value ?? "20"); |
|
} |
|
} |
|
} |
|
|
|
private void BindDefaultParameters(DataModel? dataModel, HttpContext context, Dictionary<string, object> formDatas, ZeroInterfaceList interInfo) |
|
{ |
|
if (IsJObjct(dataModel, formDatas)) |
|
{ |
|
var data = dataModel?.DefaultParameters?.FirstOrDefault(); |
|
if (data != null) |
|
{ |
|
data.Value = App.Db.Utilities.SerializeObject(formDatas); |
|
} |
|
} |
|
else if (dataModel!.DefaultParameters != null) |
|
{ |
|
if (interInfo.IsAttributeMethod==true) |
|
{ |
|
// |
|
} |
|
else |
|
{ |
|
dataModel!.DefaultParameters = dataModel?.DefaultParameters?.Where(it => NoPageParameters(it)).ToList(); |
|
} |
|
foreach (var item in dataModel?.DefaultParameters ?? new List<DataModelDefaultParameter>()) |
|
{ |
|
UpdateWhereItemValue(context, formDatas, item); |
|
} |
|
} |
|
} |
|
|
|
private static bool IsJObjct(DataModel? dataModel, Dictionary<string, object> formDatas) |
|
{ |
|
var isJObject = dataModel?.DefaultParameters?.Count == 1 && dataModel!.DefaultParameters!.First().ValueType == nameof(JObject) && dataModel!.DefaultParameters!.First().IsSingleParameter == true; |
|
return isJObject; |
|
} |
|
|
|
private void UpdateWhereItemValue(HttpContext context, Dictionary<string, object> formDatas, DataModelDefaultParameter item) |
|
{ |
|
item.Value = GetParameterValueFromRequest(item, context, formDatas); |
|
if (IsDefaultValue(item)) |
|
{ |
|
item.Value = item.DefaultValue; |
|
} |
|
if (IsUserName(item)) |
|
{ |
|
var options = SuperAPIModule._apiOptions; |
|
item.Value = options?.DatabaseOptions!.GetCurrentUserCallback().UserName; |
|
} |
|
else if (IsDateTimeNow(item)) |
|
{ |
|
var options = SuperAPIModule._apiOptions; |
|
item.Value = DateTime.Now; |
|
} |
|
else if (IsFile(item)) |
|
{ |
|
item.Value = PubMethod.ConvertFromBase64(item.Value + ""); |
|
} |
|
//if (!string.IsNullOrEmpty(item?.FieldName)) |
|
//{ |
|
// item.Name = item.FieldName; |
|
//} |
|
} |
|
|
|
|
|
|
|
private static bool NoPageParameters(DataModelDefaultParameter it) |
|
{ |
|
return it.Name != SuperAPIModule._apiOptions?.InterfaceOptions.PageNumberPropName && |
|
it.Name != SuperAPIModule._apiOptions?.InterfaceOptions.PageSizePropName; |
|
} |
|
|
|
private static bool IsUserName(DataModelDefaultParameter item) |
|
{ |
|
return item?.InsertParameter?.IsUserName == true; |
|
} |
|
private static bool IsDateTimeNow(DataModelDefaultParameter item) |
|
{ |
|
return item?.InsertParameter?.IsDateTimeNow == true; |
|
} |
|
private bool IsFile(DataModelDefaultParameter item) |
|
{ |
|
return item?.ValueType == "Byte[]"; |
|
} |
|
private static bool IsDefaultValue(DataModelDefaultParameter item) |
|
{ |
|
return item.Value == null && item.DefaultValue != null; |
|
} |
|
|
|
private string GetParameterValueFromRequest(DataModelDefaultParameter parameter, HttpContext context, Dictionary<string, object> formDatas) |
|
{ |
|
if (parameter.ValueIsReadOnly) |
|
{ |
|
return parameter.Value + ""; |
|
} |
|
string parameterValue = context.Request.Query[parameter.Name]; |
|
var formData = formDatas.FirstOrDefault(it => it.Key.EqualsCase(parameter.Name ?? "")); |
|
if (formData.Key != null) |
|
{ |
|
parameterValue = formData.Value + ""; |
|
} |
|
parameter.Value = parameterValue; |
|
return parameterValue; |
|
} |
|
|
|
private static Dictionary<string, object> GetFormDatas(HttpContext context) |
|
{ |
|
|
|
Dictionary<string, object> formDatas = new Dictionary<string, object>(); |
|
if (context.Request.Body != null) |
|
{ |
|
AddFormData(context, formDatas); |
|
AddRawParameters(context, formDatas); |
|
} |
|
return formDatas ?? new Dictionary<string, object>(); |
|
} |
|
|
|
private static void AddFormData(HttpContext context, Dictionary<string, object> formDatas) |
|
{ |
|
if (IsFormData(context)) |
|
{ |
|
var formParams = context.Request.Form; |
|
|
|
foreach (var key in formParams.Keys) |
|
{ |
|
formDatas[key] = formParams[key]; |
|
} |
|
} |
|
} |
|
|
|
private static StreamReader AddRawParameters(HttpContext context, Dictionary<string, object> formDatas) |
|
{ |
|
using StreamReader reader = new System.IO.StreamReader(context.Request.Body); |
|
var body = reader.ReadToEndAsync().Result; |
|
|
|
if (!string.IsNullOrEmpty(body)) |
|
{ |
|
|
|
var bodyParams = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>>(body) ?? new Dictionary<string, object>(); |
|
|
|
var items = formDatas.Union(bodyParams).ToDictionary(pair => pair.Key, pair => pair.Value); |
|
foreach (var item in items) |
|
{ |
|
formDatas.Add(item.Key,item.Value); |
|
} |
|
} |
|
|
|
return reader; |
|
} |
|
|
|
private static bool IsFormData(HttpContext context) |
|
{ |
|
var contentTypes = new List<string>() |
|
{ |
|
"multipart/form-data", |
|
"application/x-www-form-urlencoded" |
|
}; |
|
return context.Request.ContentType != null && contentTypes.Any(context.Request.ContentType.Contains); |
|
} |
|
} |
|
}
|
|
|