eventric
Version:
Build JavaScript applications with Behaviour-driven Domain Design. Based on DDD, BDD, CQRS and EventSourcing.
62 lines (43 loc) • 2.51 kB
text/coffeescript
class ProcessManagerService
constructor: ->
@_processManagerInstances = {}
###*
*
* @description Process Manager
*
* @param {String} processManagerName Name of the ProcessManager
* @param {Object} processManagerObject Object containing `initializeWhen` and `class`
###
add: (processManagerName, processManagerObj, index) ->
for contextName, domainEventNames of processManagerObj.initializeWhen
for domainEventName in domainEventNames
index.subscribeToDomainEvent contextName, domainEventName, (domainEvent) =>
# TODO: make sure we dont spawn twice
@_spawnProcessManager processManagerName, processManagerObj.class, contextName, domainEvent, index
_spawnProcessManager: (processManagerName, ProcessManagerClass, contextName, domainEvent, index) ->
processManagerId = index.generateUid()
processManager = new ProcessManagerClass
processManager.$endProcess = =>
@_endProcessManager processManagerName, processManagerId
handleContextDomainEventNames = []
for key, value of processManager
if (key.indexOf 'from') is 0 and (typeof value is 'function')
handleContextDomainEventNames.push key
@_subscribeProcessManagerToDomainEvents processManager, handleContextDomainEventNames, index
processManager.initialize domainEvent
@_processManagerInstances[processManagerName] ?= {}
@_processManagerInstances[processManagerName][processManagerId] ?= {}
@_processManagerInstances[processManagerName][processManagerId] = processManager
_endProcessManager: (processManagerName, processManagerId) ->
delete @_processManagerInstances[processManagerName][processManagerId]
_subscribeProcessManagerToDomainEvents: (processManager, handleContextDomainEventNames, index) ->
index.subscribeToDomainEvent (domainEvent) =>
for handleContextDomainEventName in handleContextDomainEventNames
if "from#{domainEvent.context}_handle#{domainEvent.name}" == handleContextDomainEventName
@_applyDomainEventToProcessManager handleContextDomainEventName, domainEvent, processManager
_applyDomainEventToProcessManager: (handleContextDomainEventName, domainEvent, processManager) ->
if !processManager[handleContextDomainEventName]
err = new Error "Tried to apply DomainEvent '#{domainEventName}' to Projection without a matching handle method"
else
processManager[handleContextDomainEventName] domainEvent
module.exports = new ProcessManagerService