Files
raven/server/AyaNova/biz/CustomFieldsValidator.cs
2019-01-16 19:52:57 +00:00

88 lines
3.9 KiB
C#

using AyaNova.Models;
using System.Linq;
using Newtonsoft.Json.Linq;
namespace AyaNova.Biz
{
internal static class CustomFieldsValidator
{
internal static void Validate(BizObject biz, FormCustom formCustom, string customFields)
{
bool hasCustomData = !string.IsNullOrWhiteSpace(customFields);
//No form custom = no template to check against so nothing to do
if (formCustom == null)
return;
var FormTemplate = JArray.Parse(formCustom.Template);
var ThisFormCustomFieldsList = FormAvailableFields.FormFields(formCustom.FormKey).Where(x => x.Custom == true).Select(x => x.Key).ToList();
//If the customFields string is empty then only validation is if any of the fields are required to be filled in
if (!hasCustomData)
{
//iterate the template
for (int i = 0; i < FormTemplate.Count; i++)
{
//get the field customization
var fldKey = FormTemplate[i]["fld"].Value<string>();
var fldRequired = FormTemplate[i]["required"].Value<bool>();
//Check if this is an expected custom field and that it was set to required
if (ThisFormCustomFieldsList.Contains(fldKey) && fldRequired == true)
{
//Ok, this field is required but custom fields are all empty so add this error
biz.AddError(ValidationErrorType.CustomRequiredPropertyEmpty, fldKey);
}
}
return;
}
//here we have both a bunch of custom fields presumeably and a form customization so let's get cracking...
//parse the custom fields, it should contain an object with 16 keys
//NOTE: to save bandwidth the actual custom fields look like this:
// - {c1:"blah",c2:"blah",c3:"blah".....c16:"blah"}
//However the LT field names might be WidgetCustom1 or UserCustom16 so we need to translate by EndsWith
var CustomFieldData = JObject.Parse(customFields);
//make sure all the keys are present
foreach (string iFldKey in ThisFormCustomFieldsList)
{
//Now translate the LT field key to the actual customFieldData field key
var InternalCustomFieldName=FormAvailableFields.TranslateLTCustomFieldToInternalCustomFieldName(iFldKey);
if (CustomFieldData.ContainsKey(InternalCustomFieldName))
{
//validate for now that the custom fields set as required have data in them. Note that we are not validating the sanity of the values, only that they exist
//trying to build in slack for when users inevitably change the TYPE of the custom field
//Maybe in future this will be handled more thoroughly here but for now just make sure it's been filled in
//validate it
string CurrentValue = CustomFieldData[InternalCustomFieldName].Value<string>();
foreach (JObject jo in FormTemplate)
{
if (jo["fld"].Value<string>() == iFldKey)
{
var fldRequired = jo["required"].Value<bool>();
if (fldRequired && string.IsNullOrWhiteSpace(CurrentValue))
{
biz.AddError(ValidationErrorType.CustomRequiredPropertyEmpty, iFldKey);
}
break;
}
}
}
else
{
//This is a serious issue and invalidates all
biz.AddError(ValidationErrorType.RequiredPropertyMissing, iFldKey);
}
}
}
}//eoc
}//ens