base-domain
Version:
simple module to help build Domain-Driven Design
130 lines (86 loc) • 2.63 kB
text/coffeescript
###*
include submodels
Includer
base-domain
###
class Includer
###*
###
constructor: (, = {}) ->
= .constructor
if .isEntity
###*
include sub entities
include
{Object} options
{Boolean} [recursive=false] recursively include or not
{Promise}
###
include: (options = {}) ->
entityProps = .getEntityProps()
promises = []
for entityProp in entityProps when not [entityProp]?
subModelPromise =
promises.push subModelPromise if subModelPromise
Promise.all(promises).then =>
if options.recursive
return
return
###*
run include for each submodel
doRecursively
{Promise}
###
doRecursively: ->
promises = []
subModelProps = .getModelProps(includeList: true)
BaseModel = .getFacade().constructor.BaseModel
for modelProp in subModelProps
subModel = [modelProp]
continue if subModel not instanceof BaseModel
includer = new Includer(subModel, )
promises.push includer.include(recursive: true)
return Promise.all(promises).then =>
###*
load entity by entityProp and set it to
setSubEntity
{String} entityProp
{Promise}
###
setSubEntity: (entityProp) ->
propInfo = .getTypeInfo entityProp
subId = [propInfo.idPropName]
return if not subId?
if sub =
.set(entityProp, sub)
return
repo = .getFacade().createRepository(propInfo.model)
return repo.get(subId).then (subModel) =>
.set entityProp, subModel
.catch (e) ->
###*
cache model
cache
{String} modelName
{Entity} model
###
cache: (modelName, model) ->
[modelName] ?= {}
[modelName][model.id] = model
return
###*
get cached model
cached
{String} modelName
{String|Number} id
{Entity} model
###
cached: (modelName, id) ->
[modelName]?[id]
module.exports = Includer