base-domain
Version:
simple module to help build Domain-Driven Design
156 lines (101 loc) • 3.73 kB
text/coffeescript
'use strict'
BaseModel = require './base-model'
EntityPool = require '../entity-pool'
###*
include submodels
Includer
base-domain
###
class Includer
###*
{Object} options
{Boolean} [options.async=true] get async values
{Boolean} [options.recursive=false] recursively include or not
{Boolean} [options.entityPool] entityPool, to detect circular references
{Array(String)} [options.noParentRepos] array of modelNames which needs "noParent" option when calling root.createPreferredRepository()
{Array(String)} [options.props] include only given props
###
constructor: (, = {}) ->
if not .entityPool?
= true
.entityPool = new EntityPool
{ } =
.async ?= true
= .getFacade()
= .constructor
= .getModelProps(.getName())
{ } =
.set() if .isEntity
###*
include sub entities
include
{Promise}
###
include: ->
entityProps = .getEntityProps()
if .props
entityProps = (p for p in entityProps when p in .props)
promises = []
for entityProp in entityProps when not [entityProp]?
subModelPromise =
promises.push subModelPromise if subModelPromise
Promise.all(promises).then =>
if .recursive
return
if
.clear()
return
###*
run include for each submodel
doRecursively
{Promise}
###
doRecursively: ->
promises = []
for modelProp in .getSubModelProps()
subModel = [modelProp]
continue if subModel not instanceof BaseModel
continue if subModel.included()
promises.push subModel.include()
return Promise.all(promises).then =>
if
.clear()
return
###*
load entity by entityProp and set it to
setSubEntity
{String} entityProp
{Promise}
###
setSubEntity: (entityProp) ->
subIdProp = .getIdPropByEntityProp(entityProp)
subId = [subIdProp]
return if not subId?
subModelName = .getSubModelName(entityProp)
if subModel = .get(subModelName, subId)
.set(entityProp, subModel)
return
repo =
return if not repo?
if repo.constructor.isSync
subModel = repo.get(subId, include: )
.set(entityProp, subModel) if subModel?
return Promise.resolve subModel
else
return unless .async
return repo.get(subId, include: ).then (subModel) =>
.set(entityProp, subModel)
.catch (e) ->
createPreferredRepository: (modelName) ->
options = {}
if Array.isArray(.noParentRepos) and modelName in .noParentRepos
options.noParent ?= true
try
return .createPreferredRepository(modelName, options)
catch e
return null
module.exports = Includer