introduces Row, modifies buildSchema to support fields that need to modify top-level schemas

This commit is contained in:
James
2020-06-02 13:57:55 -04:00
parent 15dd6e2887
commit f8369ffb10
26 changed files with 360 additions and 209 deletions

View File

@@ -1,118 +0,0 @@
const { Schema } = require('mongoose');
const formatBaseSchema = (field) => {
return {
hide: field.hidden === 'api' || field.hidden === true,
localized: field.localized || false,
unique: field.unique || false,
required: (field.required && !field.localized && !field.hidden && !field.condition) || false,
default: field.defaultValue || undefined,
};
};
const fieldToSchemaMap = {
number: (field) => {
return { ...formatBaseSchema(field), type: Number };
},
text: (field) => {
return { ...formatBaseSchema(field), type: String };
},
email: (field) => {
return { ...formatBaseSchema(field), type: String };
},
textarea: (field) => {
return { ...formatBaseSchema(field), type: String };
},
wysiwyg: (field) => {
return { ...formatBaseSchema(field), type: String };
},
code: (field) => {
return { ...formatBaseSchema(field), type: String };
},
checkbox: (field) => {
return { ...formatBaseSchema(field), type: Boolean };
},
date: (field) => {
return {
...formatBaseSchema(field),
type: Date,
};
},
upload: (field) => {
const schema = {
...formatBaseSchema(field),
type: Schema.Types.ObjectId,
autopopulate: true,
ref: field.type,
};
return schema;
},
relationship: (field) => {
let schema = {};
if (Array.isArray(field.relationTo)) {
schema.value = {
type: Schema.Types.ObjectId,
autopopulate: true,
refPath: `${field.name}${field.localized ? '.{{LOCALE}}' : ''}.relationTo`,
};
schema.relationTo = { type: String, enum: field.relationTo };
} else {
schema = {
...formatBaseSchema(field),
};
schema.type = Schema.Types.ObjectId;
schema.autopopulate = true;
schema.ref = field.relationTo;
}
if (field.hasMany) {
return {
type: [schema],
localized: field.localized,
};
}
return schema;
},
repeater: (field) => {
const schema = {};
field.fields.forEach((subField) => {
schema[subField.name] = fieldToSchemaMap[subField.type](subField);
});
return [schema];
},
group: (field) => {
// Localization for groups not supported
const schema = {};
field.fields.forEach((subField) => {
schema[subField.name] = fieldToSchemaMap[subField.type](subField);
});
return schema;
},
select: (field) => {
const schema = {
...formatBaseSchema(field),
type: String,
enum: field.options.map((option) => {
if (typeof option === 'object') return option.value;
return option;
}),
};
return field.hasMany ? [schema] : schema;
},
flexible: (field) => {
const flexibleSchema = new Schema({ blockName: String }, { discriminatorKey: 'blockType', _id: false });
return {
type: [flexibleSchema],
localized: field.localized || false,
};
},
};
module.exports = fieldToSchemaMap;