@adonisjs/lucid
Version:
- [x] Paginate method - [x] forPage method - [ ] chunk ( removed ) - [ ] pluckAll ( removed ) - [x] withPrefix - [x] transactions - [x] global transactions
211 lines (192 loc) • 4.17 kB
JavaScript
'use strict'
/*
* adonis-lucid
*
* (c) Harminder Virk <virk@adonisjs.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
const _ = require('lodash')
const chancejs = require('chance').Chance()
const { ioc } = require('../../lib/iocResolver')
/**
* Model factory to seed database using Lucid
* models
*
* @class DatabaseFactory
* @constructor
*/
class DatabaseFactory {
constructor (tableName, dataCallback) {
this.tableName = tableName
this.dataCallback = dataCallback
this._returningColumn = null
this._connection = null
}
/**
* Returns the query builder instance for
* a given connection
*
* @method _getQueryBuilder
*
* @return {Object}
*
* @private
*/
_getQueryBuilder () {
return (this._connection
? ioc.use('Adonis/Src/Database').connection(this._connection)
: ioc.use('Adonis/Src/Database')).table(this.tableName)
}
/**
* Make a single instance of blueprint for a given
* index. This method will evaluate the functions
* in the return payload from blueprint.
*
* @method _makeOne
* @async
*
* @param {Number} index
* @param {Object} data
*
* @return {Object}
*
* @private
*/
async _makeOne (index, data) {
const hash = this.dataCallback(chancejs, index, data)
const keys = _.keys(hash)
/**
* Evaluate all values
*/
const values = await Promise.all(_.map(_.values(hash), (val) => {
return typeof (val) === 'function' ? Promise.resolve(val()) : val
}))
/**
* Pair them back in same order
*/
return _.transform(keys, (result, key, index) => {
result[key] = values[index]
return result
}, {})
}
/**
* Set table to used for the database
* operations
*
* @method table
*
* @param {String} tableName
*
* @chainable
*/
table (tableName) {
this.tableName = tableName
return this
}
/**
* Specify the returning column from the insert
* query
*
* @method returning
*
* @param {String} column
*
* @chainable
*/
returning (column) {
this._returningColumn = column
return this
}
/**
* Specify the connection to be used on
* the query builder
*
* @method connection
*
* @param {String} connection
*
* @chainable
*/
connection (connection) {
this._connection = connection
return this
}
/**
* Make a single model instance with attributes
* from blueprint fake values
*
* @method make
* @async
*
* @param {Object} data
* @param {Number} [index = 0]
*
* @return {Object}
*/
async make (data = {}, index = 0) {
return this._makeOne(index, data)
}
/**
* Make x number of model instances with
* fake data
*
* @method makeMany
* @async
*
* @param {Number} instances
* @param {Object} [data = {}]
*
* @return {Array}
*/
async makeMany (instances, data = {}) {
return Promise.all(_.map(_.range(instances), (index) => this.make(data, index)))
}
/**
* Create model instance and persist to database
* and then return it back
*
* @method create
* @async
*
* @param {Object} data
*
* @return {Object}
*/
async create (data = {}) {
const attributes = await this.make(data)
const query = this._getQueryBuilder()
if (this._returningColumn) {
query.returning(this._returningColumn)
}
return query.insert(attributes)
}
/**
* Persist multiple model instances to database and get
* them back as an array
*
* @method createMany
* @async
*
* @param {Number} numberOfRows
* @param {Object} [data = {}]
*
* @return {Array}
*/
async createMany (numberOfRows, data = {}) {
return Promise.all(_.map(_.range(numberOfRows), (index) => this.create(data, index)))
}
/**
* Truncate the database table
*
* @method reset
* @async
*
* @return {Number}
*/
async reset () {
return this._getQueryBuilder().truncate()
}
}
module.exports = DatabaseFactory