base-domain
Version:
simple module to help build Domain-Driven Design
343 lines (232 loc) • 7.47 kB
text/coffeescript
Base = require './base'
###*
Base factory class of DDD pattern.
create instance of model
the parent "Base" class just simply gives a method.
BaseFactory
Base
base-domain
###
class BaseFactory extends Base
###*
model name to handle
modelName
String
###
: null
###*
name of dict model to create dict of
dictModelName
String
###
: null
###*
get anonymous factory class
getAnonymousClass
{String} modelName
{Function}
###
: (modelName) ->
class AnonymousFactory extends BaseFactory
: modelName
: true
return AnonymousFactory
###*
constructor
###
constructor: ->
###*
get model class this factory handles
getModelClass
{Function}
###
: undefined
getModelClass: ->
?= .getModel(.modelName)
###*
create empty model instance
createEmptyModel
{BaseModel}
###
createEmptyModel: ->
createEmpty: ->
###*
create instance of model class by plain object
for each prop, values are set by Model#set(prop, value)
createFromObject
{Object} obj
{BaseModel} baseModel fallback properties
{BaseModel} model
###
createFromObject: (obj) ->
ModelClass =
return obj if obj instanceof ModelClass
obj = obj
if not obj? or typeof obj isnt 'object'
return null
model = new ModelClass()
for own prop, value of obj
model, prop, value
propInfo = ModelClass.getPropInfo()
for prop of propInfo.dic
continue if model[prop]?
model, prop, propInfo
return model
###*
set value to model in creation
setValueToModel
###
setValueToModel: (model, prop, value) ->
typeInfo = model.getTypeInfo(prop)
switch typeInfo?.name
when 'MODEL_LIST'
when 'MODEL'
when 'MODEL_DICT'
else # set normal props
model.setNonEntityProp(prop, value)
###*
set empty values to model in creation
setEmptyValueToModel
###
setEmptyValueToModel: (model, prop, propInfo) ->
typeInfo = propInfo.getTypeInfo(prop)
switch typeInfo.name
when 'MODEL'
if propInfo.isEntityProp(prop)
# trying to get entity by id
else
when 'MODEL_LIST'
when 'MODEL_DICT'
else
model[prop] = undefined
###*
creates list and set it to the model
setSubModelListToModel
###
setSubModelListToModel: (model, prop, value) ->
typeInfo = model.getTypeInfo(prop)
subModelName = typeInfo.model
subModelFactory = .createFactory(subModelName, on)
listModelName = typeInfo.listName
list = subModelFactory.createList(listModelName, value)
model.setNonEntityProp prop, list
return
###*
set submodel to the prop
setSubModelToModel
###
setSubModelToModel: (model, prop, value) ->
subModelName = model.getTypeInfo(prop).model
useAnonymousFactory = on # if no factory is declared, altered one is used
subModelFactory = .createFactory(subModelName, useAnonymousFactory)
SubModel = subModelFactory.getModelClass()
if value not instanceof SubModel
value = subModelFactory.createFromObject(value)
if SubModel.isEntity
model.setEntityProp(prop, value)
else
model.setNonEntityProp(prop, value)
return
###*
set submodel dict to the prop
setSubModelToModel
###
setSubModelDictToModel: (model, prop, value) ->
typeInfo = model.getTypeInfo(prop)
subModelName = typeInfo.model
subModelFactory = .createFactory(subModelName, on)
dictModelName = typeInfo.dictName
dict = subModelFactory.createDict(dictModelName, value)
model.setNonEntityProp prop, dict
return
###*
fetch submodel(s) by id
available only when repository of submodel implements 'getByIdSync'
(MasterRepository implements one)
fetchEntityProp
###
fetchEntityProp: (model, prop, typeInfo) ->
idPropName = typeInfo.idPropName
try
Repository = .getRepository typeInfo.model
return if not Repository.storeMasterTable
repository = new Repository()
return if not repository.getByIdSync
catch e
return
id = model[idPropName]
subModel = repository.getByIdSync(id)
model.setEntityProp(prop, subModel) if subModel
###*
create empty non-entity model and set to the prop
createEmptyNonEntityProp
###
createEmptyNonEntityProp: (model, prop, typeInfo) ->
factory = .createFactory typeInfo.model, true
submodel = factory.createEmpty()
model.setNonEntityProp(prop, submodel)
###*
modify plain object before
beforeCreateFromObject
{Object} obj
{Object} obj
###
beforeCreateFromObject: (obj) ->
return obj
###*
modify model after createFromObject(obj), createEmptyModel()
afterCreateModel
{BaseModel} model
{BaseModel} model
###
afterCreateModel: (model) ->
return model
###*
create model list
createList
{String} listModelName model name of list
{any} obj
{BaseList} list
###
createList: (listModelName, obj) ->
ListFactory = .constructor.ListFactory
listFactory = ListFactory.create(listModelName, @)
return listFactory.createFromObject obj
###*
create model dict
createDict
{String} dictModelName model name of dict
{any} obj
{BaseDict} dict
###
createDict: (dictModelName, obj) ->
DictFactory = .constructor.DictFactory
dictFactory = DictFactory.create(dictModelName, @)
return dictFactory.createFromObject obj
module.exports = BaseFactory