protected virtual Task ValidateOptionsAsync <TFieldType>(FormValidationContext context)
            where TFieldType : class, IHasOptions, new()
        {
            var fields = context.FormDefinition.Fields.Where(_ => _ is TFieldType)
                         ?.Select(_ => _ as TFieldType);

            if (fields.IsNullOrEmpty())
            {
                return(Task.CompletedTask);
            }

            foreach (var field in fields)
            {
                if (field.Options.IsNullOrEmpty())
                {
                    if (field.OptionsFunc == null)
                    {
                        context.SetError("field options func is required if options is numm or empty.");
                        return(Task.CompletedTask);
                    }
                }
            }

            return(Task.CompletedTask);
        }
        private static bool DefaultFieldIsValid(FormValidationContext validationContext, out ValidationResult result)
        {
            if (validationContext.Rule.Type == FormFieldType.Array && validationContext.Rule.DefaultField != null)
            {
                Array values = validationContext.Value as Array;

                var context = new FormValidationContext()
                {
                    ValidateMessages = validationContext.ValidateMessages,
                    Rule             = validationContext.Rule.DefaultField,
                    FieldName        = validationContext.FieldName,
                };

                int index = 0;
                foreach (var value in values)
                {
                    context.Value       = value;
                    context.DisplayName = $"{validationContext.DisplayName}[{index}]";

                    result = GetValidationResult(context);
                    if (result != null)
                    {
                        return(false);
                    }

                    index++;
                }
            }

            result = null;

            return(true);
        }
        protected virtual Task ValidateUploadAsync(FormValidationContext context)
        {
            var uploads = context.FormDefinition.Fields.Where(_ => _ is UploaderField)?.Select(_ => _ as UploaderField);

            if (uploads.IsNullOrEmpty())
            {
                return(Task.CompletedTask);
            }

            foreach (var upload in uploads)
            {
                if (upload.AllowFileTypes.IsNullOrEmpty())
                {
                    context.SetError("allow file types is empty");
                    return(Task.CompletedTask);
                }

                if (upload.IsMultiple && upload.CountLimit <= 0)
                {
                    context.SetError("is multiple set true, but count limit is 0 or negative");
                    return(Task.CompletedTask);
                }
            }

            return(Task.CompletedTask);
        }
Пример #4
0
        public async Task Fields_has_no_element_should_be_invalid()
        {
            var form = new Form
            {
                Key    = "test",
                Fields = new List <Field>()
            };
            var context = new FormValidationContext(form);
            await validator.ValidateAsync(context);

            context.IsValid.Should().BeFalse();
        }
Пример #5
0
        public async Task Fields_is_null_should_be_invalid()
        {
            var form = new Form
            {
                Key    = "test",
                Fields = null
            };
            var context = new FormValidationContext(form);
            await validator.ValidateAsync(context);

            context.IsValid.Should().BeFalse();
        }
Пример #6
0
        public async Task Valid_should_success()
        {
            var forms = TestData.FormDefinitions;

            foreach (var form in forms)
            {
                var context = new FormValidationContext(form);
                await validator.ValidateAsync(context);

                context.IsValid.Should().BeTrue();
            }
        }
Пример #7
0
        public async Task <Form> GetByKeyAsync(string formId)
        {
            var form    = forms.SingleOrDefault(_ => _.Key == formId);
            var context = new FormValidationContext(form);
            await formValidator.ValidateAsync(context);

            if (!context.IsValid)
            {
                throw new ArgumentException(context.ErrorMessage);
            }

            return(form);
        }
        public static ValidationResult GetValidationResult(FormValidationContext validationContext)
        {
            validationContext.Value = validationContext.Rule.Transform(validationContext.Value);

            ValidationResult result;

            if (!RequiredIsValid(validationContext, out result))
            {
                return(result);
            }
            if (!TypeIsValid(validationContext, out result))
            {
                return(result);
            }
            if (!LenIsValid(validationContext, out result))
            {
                return(result);
            }
            if (!MinIsValid(validationContext, out result))
            {
                return(result);
            }
            if (!MaxIsValid(validationContext, out result))
            {
                return(result);
            }
            if (!PatternIsValid(validationContext, out result))
            {
                return(result);
            }
            if (!ValidatorIsValid(validationContext, out result))
            {
                return(result);
            }
            if (!DefaultFieldIsValid(validationContext, out result))
            {
                return(result);
            }
            if (!FieldsIsValid(validationContext, out result))
            {
                return(result);
            }
            if (!OneOfIsValid(validationContext, out result))
            {
                return(result);
            }

            return(null);
        }
Пример #9
0
        public async Task Field_name_is_missing_should_be_invalid()
        {
            var form = new Form
            {
                Key    = "test",
                Fields = new List <Field>
                {
                    new TextboxField {
                        FieldName = ""
                    }
                }
            };
            var context = new FormValidationContext(form);
            await validator.ValidateAsync(context);

            context.IsValid.Should().BeFalse();
        }
Пример #10
0
        public async Task Checkbox_options_is_null_and_options_store_provided_should_be_valid()
        {
            var form = new Form
            {
                Key    = "test",
                Fields = new List <Field>
                {
                    new CheckboxField {
                        FieldName = "test", Options = new List <Option>(), OptionsFunc = str => new List <Option>()
                    }
                }
            };
            var context = new FormValidationContext(form);
            await validator.ValidateAsync(context);

            context.IsValid.Should().BeTrue();
        }
Пример #11
0
        public async Task Uploader_allow_file_types_is_empty_should_be_invalid()
        {
            var form = new Form
            {
                Key    = "test",
                Fields = new List <Field>
                {
                    new UploaderField {
                        FieldName = "test", AllowFileTypes = new List <string>()
                    }
                }
            };
            var context = new FormValidationContext(form);
            await validator.ValidateAsync(context);

            context.IsValid.Should().BeFalse();
        }
Пример #12
0
        public async Task Select_option_is_empty_should_be_invalid()
        {
            var form = new Form
            {
                Key    = "test",
                Fields = new List <Field>
                {
                    new SelectField {
                        FieldName = "test", Options = new List <Option>()
                    }
                }
            };
            var context = new FormValidationContext(form);
            await validator.ValidateAsync(context);

            context.IsValid.Should().BeFalse();
        }
Пример #13
0
        public async Task Radio_option_is_null_should_be_invalid()
        {
            var form = new Form
            {
                Key    = "test",
                Fields = new List <Field>
                {
                    new RadioField {
                        FieldName = "test", Options = null
                    }
                }
            };
            var context = new FormValidationContext(form);
            await validator.ValidateAsync(context);

            context.IsValid.Should().BeFalse();
        }
        private static bool ValidatorIsValid(FormValidationContext validationContext, out ValidationResult result)
        {
            var rule = validationContext.Rule;

            if (rule.Validator != null)
            {
                result = rule.Validator(validationContext);

                if (result != null)
                {
                    return(false);
                }
            }

            result = null;

            return(true);
        }
        private static bool TypeIsValid(FormValidationContext validationContext, out ValidationResult result)
        {
            var rule = validationContext.Rule;

            var attribute = new TypeAttribute(rule.Type);

            attribute.ErrorMessage = validationContext.ValidateMessages.GetTypeMessage(rule.Type);

            if (!IsValid(attribute, validationContext, out ValidationResult validationResult))
            {
                result = validationResult;

                return(false);
            }

            result = null;

            return(true);
        }
        private static bool RequiredIsValid(FormValidationContext validationContext, out ValidationResult result)
        {
            if (validationContext.Rule.Required == true)
            {
                var attribute = new RequiredAttribute();
                attribute.ErrorMessage = validationContext.ValidateMessages.Required;

                if (!IsValid(attribute, validationContext, out ValidationResult validationResult))
                {
                    result = validationResult;

                    return(false);
                }
            }

            result = null;

            return(true);
        }
        private static bool IsValid(ValidationAttribute validationAttribute, FormValidationContext validationContext, out ValidationResult result)
        {
            if (validationAttribute.IsValid(validationContext.Value) == false)
            {
                if (validationContext.Rule.Message != null)
                {
                    validationAttribute.ErrorMessage = validationContext.Rule.Message;
                }

                string errorMessage = validationAttribute.FormatErrorMessage(validationContext.DisplayName);

                result = new ValidationResult(errorMessage, new string[] { validationContext.FieldName });

                return(false);
            }

            result = null;

            return(true);
        }
Пример #18
0
        public async Task AddAsync(Form form)
        {
            if (form == null)
            {
                throw new ArgumentNullException(nameof(form));
            }

            if (forms.Any(_ => _.Key == form.Key))
            {
                throw new ArgumentException("form id already exist");
            }

            var context = new FormValidationContext(form);
            await formValidator.ValidateAsync(context);

            if (!context.IsValid)
            {
                throw new ArgumentException(context.ErrorMessage);
            }
            forms.Add(form);
        }
        private static bool PatternIsValid(FormValidationContext validationContext, out ValidationResult result)
        {
            var rule = validationContext.Rule;

            if (!string.IsNullOrEmpty(rule.Pattern))
            {
                var attribute = new RegularExpressionAttribute(rule.Pattern);
                attribute.ErrorMessage = validationContext.ValidateMessages.Pattern.Mismatch;

                if (!IsValid(attribute, validationContext, out ValidationResult validationResult))
                {
                    result = validationResult;

                    return(false);
                }
            }

            result = null;

            return(true);
        }
        public async Task ValidateAsync(FormValidationContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            await ValidateFormDefinitionAsync(context);

            if (!context.IsValid)
            {
                return;
            }

            await ValidateFieldsAsync(context);

            if (!context.IsValid)
            {
                return;
            }
        }
        private static bool OneOfIsValid(FormValidationContext validationContext, out ValidationResult result)
        {
            var rule = validationContext.Rule;

            if (rule.Type != FormFieldType.Array && rule.OneOf != null)
            {
                var attribute = new OneOfAttribute(rule.OneOf);
                attribute.ErrorMessage = validationContext.ValidateMessages.OneOf;

                if (!IsValid(attribute, validationContext, out ValidationResult validationResult))
                {
                    result = validationResult;

                    return(false);
                }
            }

            result = null;

            return(true);
        }
Пример #22
0
        public async Task Uploader_allow_multiple_and_limit_count_is_zero_or_negative_should_be_invalid()
        {
            var form = new Form
            {
                Key    = "test",
                Fields = new List <Field>
                {
                    new UploaderField
                    {
                        FieldName      = "test",
                        AllowFileTypes = new List <string> {
                            "jpg"
                        },
                        IsMultiple = true
                    }
                }
            };
            var context = new FormValidationContext(form);
            await validator.ValidateAsync(context);

            context.IsValid.Should().BeFalse();
        }
        private static bool MaxIsValid(FormValidationContext validationContext, out ValidationResult result)
        {
            var rule = validationContext.Rule;

            if (rule.Max != null)
            {
                ValidationAttribute attribute = null;

                if (rule.Type.IsIn(FormFieldType.String))
                {
                    attribute = new MaxLengthAttribute((int)rule.Max);
                    attribute.ErrorMessage = validationContext.ValidateMessages.String.Max;
                }

                if (rule.Type.IsIn(FormFieldType.Array))
                {
                    attribute = new MaxLengthAttribute((int)rule.Max);
                    attribute.ErrorMessage = validationContext.ValidateMessages.Array.Max;
                }

                if (rule.Type.IsIn(FormFieldType.Number, FormFieldType.Integer, FormFieldType.Float))
                {
                    attribute = new NumberMaxAttribute((decimal)rule.Max);
                    attribute.ErrorMessage = validationContext.ValidateMessages.Number.Max;
                }

                if (attribute != null && !IsValid(attribute, validationContext, out ValidationResult validationResult))
                {
                    result = validationResult;

                    return(false);
                }
            }

            result = null;

            return(true);
        }
        protected virtual Task ValidateFormDefinitionAsync(FormValidationContext context)
        {
            var form = context.FormDefinition;

            if (form == null)
            {
                context.SetError("form is null");
                return(Task.CompletedTask);
            }

            if (form.Key.IsMissing())
            {
                context.SetError("form id is missing");
                return(Task.CompletedTask);
            }

            if (form.Fields.IsNullOrEmpty())
            {
                context.SetError("fields is empty");
                return(Task.CompletedTask);
            }

            return(Task.CompletedTask);
        }
        private static bool LenIsValid(FormValidationContext validationContext, out ValidationResult result)
        {
            var rule = validationContext.Rule;

            if (rule.Len != null)
            {
                ValidationAttribute attribute = null;

                if (rule.Type == FormFieldType.String)
                {
                    attribute = new StringLengthAttribute((int)rule.Len);
                    attribute.ErrorMessage = validationContext.ValidateMessages.String.Len;
                }
                if (rule.Type == FormFieldType.Number)
                {
                    attribute = new NumberAttribute((decimal)rule.Len);
                    attribute.ErrorMessage = validationContext.ValidateMessages.Number.Len;
                }
                if (rule.Type == FormFieldType.Array)
                {
                    attribute = new ArrayLengthAttribute((int)rule.Len);
                    attribute.ErrorMessage = validationContext.ValidateMessages.Array.Len;
                }

                if (attribute != null && !IsValid(attribute, validationContext, out ValidationResult validationResult))
                {
                    result = validationResult;

                    return(false);
                }
            }

            result = null;

            return(true);
        }
 protected virtual Task ValidateColorPickerAsync(FormValidationContext context)
 {
     return(Task.CompletedTask);
 }
 protected async virtual Task ValidateCascaderAsync(FormValidationContext context)
 {
     await ValidateOptionsAsync <CascaderField>(context);
 }
 protected virtual Task ValidateSwitchAsync(FormValidationContext context)
 {
     return(Task.CompletedTask);
 }
        protected async virtual Task ValidateFieldsAsync(FormValidationContext context)
        {
            var fields = context.FormDefinition.Fields;

            if (fields.Any(_ => _.FieldName.IsMissing()))
            {
                context.SetError("field name is missing");
                return;
            }

            if (fields.HasDuplicates(_ => _.FieldName))
            {
                context.SetError("field name has duplicates");
            }

            await ValidateCheckBoxAsync(context);

            if (!context.IsValid)
            {
                return;
            }

            await ValidateDateBoxAsync(context);

            if (!context.IsValid)
            {
                return;
            }

            await ValidateDateTimeBoxAsync(context);

            if (!context.IsValid)
            {
                return;
            }

            await ValidateDecimalBoxAsync(context);

            if (!context.IsValid)
            {
                return;
            }

            await ValidateIntBoxAsync(context);

            if (!context.IsValid)
            {
                return;
            }

            await ValidateMultiSelectAsync(context);

            if (!context.IsValid)
            {
                return;
            }

            await ValidateRadioAsync(context);

            if (!context.IsValid)
            {
                return;
            }

            await ValidateRichTextAsync(context);

            if (!context.IsValid)
            {
                return;
            }

            await ValidateSelectAsync(context);

            if (!context.IsValid)
            {
                return;
            }

            await ValidateTextAreaAsync(context);

            if (!context.IsValid)
            {
                return;
            }

            await ValidateTextBoxAsync(context);

            if (!context.IsValid)
            {
                return;
            }

            await ValidateTimeAsync(context);

            if (!context.IsValid)
            {
                return;
            }

            await ValidateCascaderAsync(context);

            if (!context.IsValid)
            {
                return;
            }

            await ValidateColorPickerAsync(context);

            if (!context.IsValid)
            {
                return;
            }

            await ValidateSliderAsync(context);

            if (!context.IsValid)
            {
                return;
            }

            await ValidateSwitchAsync(context);

            if (!context.IsValid)
            {
                return;
            }

            await ValidateUploadAsync(context);

            if (!context.IsValid)
            {
                return;
            }
        }
        private static bool FieldsIsValid(FormValidationContext validationContext, out ValidationResult result)
        {
            var rule = validationContext.Rule;

            if (!rule.Type.IsIn(FormFieldType.Array, FormFieldType.Object) || rule.Fields == null)
            {
                result = null;

                return(true);
            }

            var context = new FormValidationContext()
            {
                ValidateMessages = validationContext.ValidateMessages,
                DisplayName      = validationContext.DisplayName,
                FieldName        = validationContext.FieldName,
            };

            Array arrValues  = validationContext.Value as Array;
            var   objectType = validationContext.Value.GetType();

            foreach (var key in rule.Fields.Keys)
            {
                if (rule.Type == FormFieldType.Array)
                {
                    int index = (int)key;

                    // out of range, ignore validation
                    if (index >= arrValues.Length)
                    {
                        continue;
                    }

                    context.Value       = arrValues.GetValue(index);
                    context.DisplayName = $"{validationContext.DisplayName}[{index}]";
                }
                else
                {
                    var propertyValue = objectType.GetProperty(key.ToString());
                    if (propertyValue != null)
                    {
                        context.Value = propertyValue.GetValue(validationContext.Value);
                    }
                    else
                    {
                        var fieldValue = objectType.GetField(key.ToString());

                        // field not exists, ignore validation
                        if (fieldValue == null)
                        {
                            continue;
                        }

                        context.Value = fieldValue.GetValue(validationContext.Value);
                    }

                    context.DisplayName = $"{validationContext.DisplayName}.{key}";
                }

                context.Rule = rule.Fields[key];

                result = GetValidationResult(context);
                if (result != null)
                {
                    return(false);
                }
            }

            result = null;

            return(true);
        }