API Docs for:
Show:

File: src/lib/includer.coffee


###*
include submodels

@class Includer
@module base-domain
###
class Includer

    ###*
    @constructor
    ###
    constructor: (@model, @modelPool = {}) ->

        @ModelClass = @model.constructor

        @cache(@ModelClass.getName(), @model) if @ModelClass.isEntity


    ###*
    include sub entities

    @method include
    @public
    @param {Object} options
    @param {Boolean} [recursive=false] recursively include or not
    @return {Promise}
    ###
    include: (options = {}) ->

        entityProps = @ModelClass.getEntityProps() 

        promises = []

        for entityProp in entityProps when not @model[entityProp]?

            subModelPromise = @setSubEntity(entityProp)

            promises.push subModelPromise if subModelPromise

        Promise.all(promises).then =>

            if options.recursive
                return @doRecursively()

            return @model


    ###*
    run include for each submodel

    @method doRecursively
    @private
    @return {Promise}
    ###
    doRecursively: ->

        promises = []
        subModelProps = @ModelClass.getModelProps(includeList: true)
        BaseModel = @model.getFacade().constructor.BaseModel

        for modelProp in subModelProps

            subModel = @model[modelProp]

            continue if subModel not instanceof BaseModel

            includer = new Includer(subModel, @modelPool)
            promises.push includer.include(recursive: true)

        return Promise.all(promises).then => @model


    ###*
    load entity by entityProp and set it to @model

    @method setSubEntity
    @private
    @param {String} entityProp
    @return {Promise}
    ###
    setSubEntity: (entityProp) ->

        propInfo = @model.getTypeInfo entityProp

        subId = @model[propInfo.idPropName]

        return if not subId?

        if sub = @cached(propInfo.model, subId)
            @model.set(entityProp, sub)
            return

        repo = @model.getFacade().createRepository(propInfo.model)

        return repo.get(subId).then (subModel) =>
            @model.set entityProp, subModel 
        .catch (e) ->


    ###*
    cache model

    @method cache
    @private
    @param {String} modelName
    @param {Entity} model
    ###
    cache: (modelName, model) ->
        @modelPool[modelName] ?= {}
        @modelPool[modelName][model.id] = model
        return


    ###*
    get cached model

    @method cached
    @private
    @param {String} modelName
    @param {String|Number} id
    @return {Entity} model
    ###
    cached: (modelName, id) ->
        @modelPool[modelName]?[id]



module.exports = Includer