ensures nested field server validation works as intended

This commit is contained in:
James
2020-06-04 17:28:26 -04:00
parent 9930462639
commit 0393eb2570
5 changed files with 30 additions and 8 deletions

View File

@@ -1,11 +1,26 @@
const { ValidationError } = require('../errors');
const findRequiredSubfields = (fields) => {
if (fields) {
return fields.some((subField) => {
if (!subField.name && subField.fields) {
return findRequiredSubfields(subField.fields);
}
return subField.required && !subField.localized;
});
}
return false;
};
exports.iterateFields = async (data, fields, path = '') => {
const validationPromises = [];
const validatedFields = [];
fields.forEach((field) => {
const requiresAtLeastOneSubfield = field.fields && field.fields.some(subField => (subField.required && !subField.localized));
const requiresAtLeastOneSubfield = findRequiredSubfields(field.fields);
const dataToValidate = data || {};
if (field.required || requiresAtLeastOneSubfield) {
@@ -14,7 +29,10 @@ exports.iterateFields = async (data, fields, path = '') => {
// validated against directly
if (field.name === undefined && field.fields) {
field.fields.forEach((subField) => {
validationPromises.push(subField.validate(dataToValidate[subField.name], subField));
validationPromises.push(subField.validate(dataToValidate[subField.name], {
...subField,
path: `${path}${subField.name}`,
}));
validatedFields.push(subField);
});
} else {

View File

@@ -96,7 +96,9 @@ const optionsToValidatorMap = {
group: async (value, options) => {
return iterateFields(value, options.fields, `${options.name}.`);
},
repeater: async (value, options) => {
repeater: async (value, options = {}) => {
const path = options.path || options.name;
if (!value || value.length === 0) {
return 'This field requires at least one row.';
}
@@ -105,7 +107,7 @@ const optionsToValidatorMap = {
const rowPromises = [];
value.forEach((row, i) => {
rowPromises.push(iterateFields(row, options.fields, `${options.name}.${i}.`));
rowPromises.push(iterateFields(row, options.fields, `${path}.${i}.`));
});
const rowResults = await Promise.all(rowPromises);