base-domain
Version:
simple module to help build Domain-Driven Design
255 lines (182 loc) • 4.78 kB
text/coffeescript
BaseModel = require './base-model'
###*
list class of DDD pattern.
BaseList
BaseModel
base-domain
###
class BaseList extends BaseModel
###*
model name of the item
itemModelName
String
###
: ''
###*
creates child class of BaseList
getAnonymousClass
{String} itemModelName
{Function} child class of BaseList
###
: (itemModelName) ->
class AnonymousList extends BaseList
: itemModelName
: true
return AnonymousList
###*
ids: get ids of items
ids
Array
###
Object.defineProperty @::, 'ids',
get: ->
return null if not .containsEntity()
return (item.id for item in )
###*
items: array of models
items
Array
###
###*
loaded: is data loaded or not
loaded
Boolean
###
###*
itemFactory: instance of factory which creates item models
itemFactory
BaseFactory
###
###*
###
constructor: (props = {}) ->
# loaded and listeners are hidden properties
_itemFactory = null
Object.defineProperties @,
items : value: [], enumerable: true
loaded : value: false, writable: true
listeners : value: []
itemFactory : get: ->
_itemFactory ?= .createFactory(.itemModelName, true)
if props.items
props.items
if props.ids
props.ids
super(props)
###*
set ids.
setIds
{Array(String|Number)} ids
###
setIds: (ids = []) ->
return if not .containsEntity()
= false
ItemRepository = .getRepository(.itemModelName)
repo = new ItemRepository()
if ItemRepository.storeMasterTable and ItemRepository.loaded()
subModels = (repo.getByIdSync(id) for id in ids)
else
repo.query(where: id: inq: ids).then (subModels) =>
return @
###*
set items
setItems
{Array} models
###
setItems: (models = []) ->
ItemClass = .getModel .itemModelName
.push item for item in models when item instanceof ItemClass
.sort()
= true
return @
###*
returns item is Entity
containsEntity
{Boolean}
###
: ->
return .getModel().isEntity
###*
sort items in constructor
sort
###
sort: (modelA, modelB) ->
if modelA.id > modelB.id then 1 else -1
###*
first item
first
###
first: ->
if .length is 0
return null
return [0]
###*
last item
last
###
last: ->
if .length is 0
return null
return [.length - 1]
###*
export models to Array
toArray
###
toArray: ->
.slice()
###*
create plain list.
if this list contains entities, returns their ids
if this list contains non-entity models, returns their plain objects
toPlainObject
{Object} plainObject
###
toPlainObject: ->
plain = super()
if .containsEntity()
plain.ids =
delete plain.items
else
plainItems = []
for item in
if typeof item.toPlainObject is 'function'
plainItems.push item.toPlainObject()
else
plainItems.push item
plain.items = plainItems
return plain
###*
on addEventListeners for 'loaded'
on
###
on: (evtname, fn) ->
return if evtname isnt 'loaded'
if
process.nextTick fn
else if typeof fn is 'function'
.push fn
return
###*
tell listeners emit loaded
emitLoaded
###
emitLoaded: ->
while fn = .shift()
process.nextTick fn
return
module.exports = BaseList