eventric
Version:
behavior-first application development
43 lines (29 loc) • 1.38 kB
text/coffeescript
# TODO: Simple approach for global projections without changing the Projection service. Refactor when adding EventStore
class GlobalContext
constructor: ->
@name = 'Global'
findDomainEventsByName: (findArguments...) ->
findDomainEventsByName = @_getAllContexts().map (context) ->
context.findDomainEventsByName findArguments...
Promise.all findDomainEventsByName
.then (domainEventsByContext) =>
domainEvents = @_combineDomainEventsByContext domainEventsByContext
@_sortDomainEventsByTimestamp domainEvents
return domainEvents
subscribeToDomainEvent: (eventName, domainEventHandler) ->
subscribeToDomainEvents = @_getAllContexts().map (context) ->
context.subscribeToDomainEvent eventName, domainEventHandler
Promise.all subscribeToDomainEvents
_getAllContexts: ->
eventric = require '../eventric'
contextNames = eventric.getRegisteredContextNames()
contextNames.map (contextName) =>
eventric.remote contextName
_combineDomainEventsByContext: (domainEventsByContext) ->
domainEventsByContext.reduce (allDomainEvents, contextDomainEvents) ->
allDomainEvents.concat contextDomainEvents
, []
_sortDomainEventsByTimestamp: (domainEvents) ->
domainEvents.sort (firstEvent, secondEvent) ->
firstEvent.timestamp - secondEvent.timestamp
module.exports = GlobalContext