UNPKG

igo

Version:

Igo is a Node.js Web Framework based on Express

53 lines (42 loc) 1.42 kB
const _ = require('lodash'); const DataTypes = require('./DataTypes'); module.exports = class Schema { constructor(values) { _.assign(this, values); this.primary = values.primary || ['id']; this.subclass_column = values.subclass_column || 'type'; this.database = values.database || 'main'; // Map columns this.columns = _.map(values.columns, column => { if (typeof column === 'object') { column.attr = column.attr || column.name; return column; } return { name: column, attr: column, type: 'default' }; }); this.colsByName = _.keyBy(this.columns, 'name'); this.colsByAttr = _.keyBy(this.columns, 'attr'); // asynchronous loading of associations for circular dependencies process.nextTick(() => { if (_.isFunction(values.associations)) { this.associations = values.associations(); } if (_.isFunction(values.subclasses)) { this.subclasses = values.subclasses(); } }); } parseTypes(row, prefix='') { _.forOwn(row, (value, key) => { if (prefix && !key.startsWith(prefix)) { return; // skip if not prefixed } key = key.slice(prefix.length); const column = this.colsByName[key]; const type = column && DataTypes[column.type]; if (type) { row[prefix + column.attr] = type.get(value); } }); } };