UNPKG

base-domain

Version:

simple module to help build Domain-Driven Design

462 lines (340 loc) 13.1 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>src/lib/base-factory.coffee</title> <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css"> <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css"> <link rel="stylesheet" href="../assets/css/main.css" id="site_styles"> <link rel="icon" href="../assets/favicon.ico"> <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script> </head> <body class="yui3-skin-sam"> <div id="doc"> <div id="hd" class="yui3-g header"> <div class="yui3-u-3-4"> <h1><img src="../assets/css/logo.png" title="" width="117" height="52"></h1> </div> <div class="yui3-u-1-4 version"> <em>API Docs for: </em> </div> </div> <div id="bd" class="yui3-g"> <div class="yui3-u-1-4"> <div id="docs-sidebar" class="sidebar apidocs"> <div id="api-list"> <h2 class="off-left">APIs</h2> <div id="api-tabview" class="tabview"> <ul class="tabs"> <li><a href="#api-classes">Classes</a></li> <li><a href="#api-modules">Modules</a></li> </ul> <div id="api-tabview-filter"> <input type="search" id="api-filter" placeholder="Type to filter APIs"> </div> <div id="api-tabview-panel"> <ul id="api-classes" class="apis classes"> <li><a href="../classes/Base.html">Base</a></li> <li><a href="../classes/BaseDict.html">BaseDict</a></li> <li><a href="../classes/BaseFactory.html">BaseFactory</a></li> <li><a href="../classes/BaseList.html">BaseList</a></li> <li><a href="../classes/BaseModel.html">BaseModel</a></li> <li><a href="../classes/BaseRepository.html">BaseRepository</a></li> <li><a href="../classes/DictFactory.html">DictFactory</a></li> <li><a href="../classes/DomainError.html">DomainError</a></li> <li><a href="../classes/Entity.html">Entity</a></li> <li><a href="../classes/Facade.html">Facade</a></li> <li><a href="../classes/Fixture.html">Fixture</a></li> <li><a href="../classes/FixtureModel.html">FixtureModel</a></li> <li><a href="../classes/Includer.html">Includer</a></li> <li><a href="../classes/ListFactory.html">ListFactory</a></li> <li><a href="../classes/MasterRepository.html">MasterRepository</a></li> <li><a href="../classes/PropInfo.html">PropInfo</a></li> <li><a href="../classes/ResourceClientInterface.html">ResourceClientInterface</a></li> <li><a href="../classes/TypeInfo.html">TypeInfo</a></li> <li><a href="../classes/Util.html">Util</a></li> </ul> <ul id="api-modules" class="apis modules"> <li><a href="../modules/base-domain.html">base-domain</a></li> </ul> </div> </div> </div> </div> </div> <div class="yui3-u-3-4"> <div id="api-options"> Show: <label for="api-show-inherited"> <input type="checkbox" id="api-show-inherited" checked> Inherited </label> <label for="api-show-protected"> <input type="checkbox" id="api-show-protected"> Protected </label> <label for="api-show-private"> <input type="checkbox" id="api-show-private"> Private </label> <label for="api-show-deprecated"> <input type="checkbox" id="api-show-deprecated"> Deprecated </label> </div> <div class="apidocs"> <div id="docs-main"> <div class="content"> <h1 class="file-heading">File: src/lib/base-factory.coffee</h1> <div class="file"> <pre class="code prettyprint linenums"> Base = require &#x27;./base&#x27; ###* Base factory class of DDD pattern. create instance of model the parent &quot;Base&quot; class just simply gives a @getFacade() method. @class BaseFactory @extends Base @module base-domain ### class BaseFactory extends Base ###* model name to handle @property modelName @static @protected @type String ### @modelName: null ###* name of dict model to create dict of @modelName @property dictModelName @static @protected @type String ### @dictModelName: null ###* get anonymous factory class @method getAnonymousClass @param {String} modelName @return {Function} ### @getAnonymousClass: (modelName) -&gt; class AnonymousFactory extends BaseFactory @modelName : modelName @isAnonymous: true return AnonymousFactory ###* constructor @constructor ### constructor: -&gt; ###* get model class this factory handles @method getModelClass @return {Function} ### @_ModelClass: undefined getModelClass: -&gt; @_ModelClass ?= @getFacade().getModel(@constructor.modelName) ###* create empty model instance @method createEmptyModel @return {BaseModel} ### createEmptyModel: -&gt; @createFromObject({}) createEmpty: -&gt; @createFromObject({}) ###* create instance of model class by plain object for each prop, values are set by Model#set(prop, value) @method createFromObject @public @param {Object} obj @param {BaseModel} baseModel fallback properties @return {BaseModel} model ### createFromObject: (obj) -&gt; ModelClass = @getModelClass() return obj if obj instanceof ModelClass obj = @beforeCreateFromObject obj if not obj? or typeof obj isnt &#x27;object&#x27; return null model = new ModelClass() for own prop, value of obj @setValueToModel model, prop, value propInfo = ModelClass.getPropInfo() for prop of propInfo.dic continue if model[prop]? @setEmptyValueToModel model, prop, propInfo return @afterCreateModel model ###* set value to model in creation @method setValueToModel @private ### setValueToModel: (model, prop, value) -&gt; typeInfo = model.getTypeInfo(prop) switch typeInfo?.name when &#x27;MODEL_LIST&#x27; @setSubModelListToModel(model, prop, value) when &#x27;MODEL&#x27; @setSubModelToModel(model, prop, value) when &#x27;MODEL_DICT&#x27; @setSubModelDictToModel(model, prop, value) else # set normal props model.setNonEntityProp(prop, value) ###* set empty values to model in creation @method setEmptyValueToModel @private ### setEmptyValueToModel: (model, prop, propInfo) -&gt; typeInfo = propInfo.getTypeInfo(prop) switch typeInfo.name when &#x27;MODEL&#x27; if propInfo.isEntityProp(prop) @fetchEntityProp(model, prop, typeInfo) # trying to get entity by id else @createEmptyNonEntityProp(model, prop, typeInfo) when &#x27;MODEL_LIST&#x27; @setSubModelListToModel(model, prop, null) when &#x27;MODEL_DICT&#x27; @setSubModelDictToModel(model, prop, null) else model[prop] = undefined ###* creates list and set it to the model @method setSubModelListToModel @private ### setSubModelListToModel: (model, prop, value) -&gt; typeInfo = model.getTypeInfo(prop) subModelName = typeInfo.model subModelFactory = @getFacade().createFactory(subModelName, on) listModelName = typeInfo.listName list = subModelFactory.createList(listModelName, value) model.setNonEntityProp prop, list return ###* set submodel to the prop @method setSubModelToModel @private ### setSubModelToModel: (model, prop, value) -&gt; subModelName = model.getTypeInfo(prop).model useAnonymousFactory = on # if no factory is declared, altered one is used subModelFactory = @getFacade().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 @method setSubModelToModel @private ### setSubModelDictToModel: (model, prop, value) -&gt; typeInfo = model.getTypeInfo(prop) subModelName = typeInfo.model subModelFactory = @getFacade().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 &#x27;getByIdSync&#x27; (MasterRepository implements one) @method fetchEntityProp @private ### fetchEntityProp: (model, prop, typeInfo) -&gt; idPropName = typeInfo.idPropName try Repository = @getFacade().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 @method createEmptyNonEntityProp @private ### createEmptyNonEntityProp: (model, prop, typeInfo) -&gt; factory = @getFacade().createFactory typeInfo.model, true submodel = factory.createEmpty() model.setNonEntityProp(prop, submodel) ###* modify plain object before @createFromObject(obj) @method beforeCreateFromObject @protected @abstract @param {Object} obj @return {Object} obj ### beforeCreateFromObject: (obj) -&gt; return obj ###* modify model after createFromObject(obj), createEmptyModel() @method afterCreateModel @protected @abstract @param {BaseModel} model @return {BaseModel} model ### afterCreateModel: (model) -&gt; return model ###* create model list @method createList @public @param {String} listModelName model name of list @param {any} obj @return {BaseList} list ### createList: (listModelName, obj) -&gt; ListFactory = @getFacade().constructor.ListFactory listFactory = ListFactory.create(listModelName, @) return listFactory.createFromObject obj ###* create model dict @method createDict @public @param {String} dictModelName model name of dict @param {any} obj @return {BaseDict} dict ### createDict: (dictModelName, obj) -&gt; DictFactory = @getFacade().constructor.DictFactory dictFactory = DictFactory.create(dictModelName, @) return dictFactory.createFromObject obj module.exports = BaseFactory </pre> </div> </div> </div> </div> </div> </div> </div> <script src="../assets/vendor/prettify/prettify-min.js"></script> <script>prettyPrint();</script> <script src="../assets/js/yui-prettify.js"></script> <script src="../assets/../api.js"></script> <script src="../assets/js/api-filter.js"></script> <script src="../assets/js/api-list.js"></script> <script src="../assets/js/api-search.js"></script> <script src="../assets/js/apidocs.js"></script> </body> </html>