Improve validate config flow

This commit is contained in:
Nicolas Meienberger 2022-05-23 20:53:26 +00:00
parent e30a5a4c28
commit 3a3028067a

View file

@ -1,64 +1,69 @@
import validator from 'validator'; import validator from 'validator';
import { AppConfig, FieldTypes } from '../../core/types'; import { AppConfig, FieldTypes } from '../../core/types';
export const validateAppConfig = (values: Record<string, string>, fields: (AppConfig['form_fields'][0] & { id: string })[]) => { const validateField = (field: AppConfig['form_fields'][0], value: string): string | undefined => {
const errors: any = {}; if (field.required && !value) {
return `${field.label} is required`;
fields.forEach((field) => { }
if (field.required && !values[field.id]) {
errors[field.id] = `${field.label} is required`; if (!value) {
return;
} }
if (values[field.id]) {
switch (field.type) { switch (field.type) {
case FieldTypes.text: case FieldTypes.text:
if (field.max && values[field.id].length > field.max) { if (field.max && value.length > field.max) {
errors[field.id] = `${field.label} must be less than ${field.max} characters`; return `${field.label} must be less than ${field.max} characters`;
} }
if (field.min && value.length < field.min) {
if (field.min && values[field.id].length < field.min) { return `${field.label} must be at least ${field.min} characters`;
errors[field.id] = `${field.label} must be at least ${field.min} characters`;
} }
break; break;
case FieldTypes.password: case FieldTypes.password:
if (!validator.isLength(values[field.id], { min: field.min, max: field.max })) { if (!validator.isLength(value, { min: field.min, max: field.max })) {
errors[field.id] = `${field.label} must be between ${field.min} and ${field.max} characters`; return `${field.label} must be between ${field.min} and ${field.max} characters`;
} }
break; break;
case FieldTypes.email: case FieldTypes.email:
if (!validator.isEmail(values[field.id])) { if (!validator.isEmail(value)) {
errors[field.id] = `${field.label} must be a valid email address`; return `${field.label} must be a valid email address`;
} }
break; break;
case FieldTypes.number: case FieldTypes.number:
if (!validator.isNumeric(values[field.id])) { if (!validator.isNumeric(value)) {
errors[field.id] = `${field.label} must be a number`; return `${field.label} must be a number`;
} }
break; break;
case FieldTypes.fqdn: case FieldTypes.fqdn:
if (!validator.isFQDN(values[field.id])) { if (!validator.isFQDN(value)) {
errors[field.id] = `${field.label} must be a valid domain`; return `${field.label} must be a valid domain`;
} }
break; break;
case FieldTypes.ip: case FieldTypes.ip:
if (!validator.isIP(values[field.id])) { if (!validator.isIP(value)) {
errors[field.id] = `${field.label} must be a valid IP address`; return `${field.label} must be a valid IP address`;
} }
break; break;
case FieldTypes.fqdnip: case FieldTypes.fqdnip:
if (!validator.isFQDN(values[field.id] || '') && !validator.isIP(values[field.id])) { if (!validator.isFQDN(value || '') && !validator.isIP(value)) {
errors[field.id] = `${field.label} must be a valid domain or IP address`; return `${field.label} must be a valid domain or IP address`;
} }
break; break;
case FieldTypes.url: case FieldTypes.url:
if (!validator.isURL(values[field.id])) { if (!validator.isURL(value)) {
errors[field.id] = `${field.label} must be a valid URL`; return `${field.label} must be a valid URL`;
} }
break; break;
default: default:
break; break;
} }
} };
export const validateAppConfig = (values: Record<string, string>, fields: (AppConfig['form_fields'][0] & { id: string })[]) => {
const errors: any = {};
fields.forEach((field) => {
errors[field.id] = validateField(field, values[field.id]);
}); });
return errors; return errors;