@adonisjs/lucid
Version:
- [x] Paginate method - [x] forPage method - [ ] chunk ( removed ) - [ ] pluckAll ( removed ) - [x] withPrefix - [x] transactions - [x] global transactions
178 lines (162 loc) • 3.32 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')
/**
* The vanilla serailizer is the bare bones serializer
* shipped with Lucid and is set as the default
* serializer.
*
* @class VanillaSerializer
* @constructor
*/
class VanillaSerializer {
constructor (rows, pages = null, isOne = false) {
/**
* The serializer rows. All rows should be instance
* of Lucid model
*
* @attribute rows
*
* @type {Array}
*/
this.rows = rows
/**
* The pagination meta data
*
* @attribute pages
*
* @type {Object}
*/
this.pages = pages
/**
* A boolean indicating whether return output of
* toJSON should be an array of an object.
*
* @attribute isOne
*
* @type {Boolean}
*/
this.isOne = isOne
}
/**
* Attaches the eagerloaded relationship to the return
* payload.
*
* @method _attachRelations
*
* @param {Model} modelInstance
* @param {Object} output
*
* @return {void}
*
* @private
*/
_attachRelations (modelInstance, output) {
_.each(modelInstance.$relations, (values, relation) => {
output[relation] = values && typeof (values.toJSON) === 'function' ? values.toJSON() : values
})
}
/**
* Attaches sideloaded data to the `__meta__` key on the
* output object
*
* @method _attachMeta
*
* @param {Model} modelInstance
* @param {Object} output
*
* @return {void}
*
* @private
*/
_attachMeta (modelInstance, output) {
if (_.size(modelInstance.$sideLoaded)) {
output.__meta__ = _.clone(modelInstance.$sideLoaded)
}
}
/**
* Returns the json object for a given model instance
*
* @method _getRowJSON
*
* @param {Model} modelInstance
*
* @return {Object}
*
* @private
*/
_getRowJSON (modelInstance) {
const json = modelInstance.toObject()
this._attachRelations(modelInstance, json)
this._attachMeta(modelInstance, json)
return json
}
/**
* Add row to the list of rows. Make sure the row
* is an instance of the same model as the other
* model instances.
*
* @method addRow
*
* @param {Model} row
*/
addRow (row) {
this.rows.push(row)
}
/**
* Get first model instance
*
* @method first
*
* @return {Model}
*/
first () {
return _.first(this.rows)
}
/**
* Get last model instance
*
* @method last
*
* @return {Model}
*/
last () {
return _.last(this.rows)
}
/**
* Returns the size of rows
*
* @method size
*
* @return {Number}
*/
size () {
return this.isOne ? 1 : this.rows.length
}
/**
* Convert all rows/model instances to their JSON
* representation
*
* @method toJSON
*
* @return {Array|Object}
*/
toJSON () {
if (this.isOne) {
return this._getRowJSON(this.rows)
}
const data = this.rows.map(this._getRowJSON.bind(this))
if (this.pages) {
return _.merge({}, this.pages, { data })
}
return data
}
}
module.exports = VanillaSerializer