@adonisjs/lucid
Version:
- [x] Paginate method - [x] forPage method - [ ] chunk ( removed ) - [ ] pluckAll ( removed ) - [x] withPrefix - [x] transactions - [x] global transactions
117 lines (105 loc) • 2.78 kB
JavaScript
/*
* 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 CE = require('../../Exceptions')
/**
* This class parses the relationship string to an
* object.
*
* @class RelationParser
* @static
*/
class RelationParser {
/**
* Parses an object of relationship strings into
* a new object
*
* @method parseRelations
*
* @param {Object} relations
*
* @return {Object}
*/
parseRelations (relations) {
return _.transform(relations, (result, callback, relation) => {
const parsedRelation = this.parseRelation(relation, callback)
const existingRelation = result[parsedRelation.name]
/**
* Update existing relation properties when it already
* exists.
*/
if (existingRelation) {
existingRelation.callback = parsedRelation.callback
_.each(parsedRelation.nested, (v, k) => (existingRelation.nested[k] = v))
return result
}
/**
* Otherwise add new key/value pair to result
*/
result[parsedRelation.name] = parsedRelation
return result
}, {})
}
/**
* Parse a single relationship string
*
* @method parseRelation
*
* @param {String} relation
* @param {Function} callback
*
* @return {Object}
*/
parseRelation (relation, callback = null) {
let [name, nested] = relation.split(/\.(.+)/)
/**
* Setup nested relation when it exists
*/
nested = nested ? { [nested]: callback } : null
const map = { nested, name }
/**
* The callback belongs to parent relation only
* when nested relation does not exists.
*/
map.callback = !nested ? callback : null
return map
}
/**
* Validates the model instance to make sure the relationship
* exists.
*
* @method validateRelationExistence
*
* @param {Object} modelInstance
* @param {String} relation
*
* @return {void}
*/
validateRelationExistence (modelInstance, relation) {
if (typeof (modelInstance[relation]) !== 'function') {
throw CE.RuntimeException.undefinedRelation(relation, modelInstance.constructor.name)
}
}
/**
* Returns the relationship instance by calling the relationship
* method on the model instance.
*
* @method getRelatedInstance
*
* @param {Object} modelInstance
* @param {String} relation
*
* @return {void}
*/
getRelatedInstance (modelInstance, relation) {
return modelInstance[relation]()
}
}
module.exports = new RelationParser()