introduces Row, modifies buildSchema to support fields that need to modify top-level schemas
This commit is contained in:
@@ -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;
|
||||
Reference in New Issue
Block a user