apemandb
Version:
Database for apeman project.
58 lines (53 loc) • 1.64 kB
JavaScript
/**
* @function applySeed
* @param {object} model - A model instance
* @param {data} data - Data to insert
* @param {object} [options] - Optional settings.
* @param {boolean} [options.force] - Force to seed
* @returns {Promise}
*/
const co = require('co')
const colorprint = require('colorprint')
const integersString = require('../helpers/integers_string')
/** @lends applySeed */
function applySeed (model, data, options = {}) {
let _duplicate = (data) => co(function * () {
let { id } = data
if (typeof id === 'undefined') {
return yield model.find({ where: data })
}
return yield model.findById(id, {})
})
let { name: modelName } = model
let skipped = []
return Promise.all(
[].concat(data).map((data) => co(function * () {
for (let name of Object.keys(data)) {
data[ name ] = yield Promise.resolve(data[ name ])
}
let found = yield _duplicate(data)
if (found) {
if (options.force) {
yield found.destroy()
let created = yield model.create(data)
colorprint.debug(`[${modelName}] Data destroy and re-created: ${created.id}`)
return created
} else {
skipped.push(data.id)
return null
}
}
let created = yield model.create(data)
colorprint.debug(`[${modelName}] Data created: ${created.id || ''}`)
return created
}))
).then((result) => {
if (skipped.length > 0) {
colorprint.warn(`[${modelName}] Skip seed with existing ids: ${integersString(skipped)}`)
}
skipped = []
return result
})
}
module.exports = applySeed