47 lines
1.2 KiB
JavaScript
47 lines
1.2 KiB
JavaScript
/* eslint-disable no-await-in-loop */
|
|
/* eslint-disable no-restricted-syntax */
|
|
|
|
const { ValidationError } = require('../errors');
|
|
|
|
const iterateFields = async (fields, data, errors, path = '') => {
|
|
if (Array.isArray(data)) {
|
|
await Promise.all(data.map(async (row, i) => {
|
|
await iterateFields(fields, row, errors, `${path}.${i}.`);
|
|
}));
|
|
} else {
|
|
for (const field of fields) {
|
|
if (field.required) {
|
|
if (data && data[field.name]) {
|
|
const validationResult = await field.validate(data[field.name], field);
|
|
|
|
if (validationResult !== true) {
|
|
errors.push({
|
|
field: `${path}${field.name}`,
|
|
message: validationResult,
|
|
});
|
|
}
|
|
} else {
|
|
errors.push({
|
|
field: `${path}${field.name}`,
|
|
message: `${path}${field.name} is required.`,
|
|
});
|
|
}
|
|
}
|
|
|
|
if (field.fields) {
|
|
await iterateFields(field.fields, (data && data[field.name]), errors, `${path}${field.name}.`);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
const validate = async (fields, data) => {
|
|
const errors = [];
|
|
await iterateFields(fields, data, errors);
|
|
if (errors.length > 0) {
|
|
throw new ValidationError(errors);
|
|
}
|
|
};
|
|
|
|
module.exports = validate;
|