Skip to content
The main package for serverless-cqrs
Branch: master
Clone or download
Yonah Forst
Yonah Forst v0.1.2
Latest commit 62a4c7c May 12, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
examples Update README.md May 7, 2019
packages v0.1.2 May 12, 2019
.gitignore update gitignore May 7, 2019
LICENSE Create LICENSE May 7, 2019
README.md Update README.md Feb 16, 2019
lerna.json v0.1.2 May 12, 2019
package-lock.json
package.json move main repo into it's own package May 7, 2019

README.md

About

serverless-cqrs is collection tools to help you get started with building a fully functioning backend based on the principles of CQRS, Event Sourcing, Domain Driven Design, and Onion Architecture.

The goal is twofold:

  • Write as little boilerplate code as possible.
  • Clean service boundaries so that parts can be easily tested and swapped out.

Readme

https://serverless-cqrs.gitbook.io/serverless-cqrs
https://medium.com/@yonah.forst/introducing-serverless-cqrs-24471045c08d
https://medium.com/@yonah.forst/getting-started-with-serverless-cqrs-part-2-2ea4ac114439

Quickstart

Install

npm i --save serverless-cqrs
npm i --save serverless-cqrs.memory-adapter

Usage

To start, you need Actions and a Reducer. So let's write simple ones:

// actions.js
const actions = {
  addTodo: (state, payload) => {
    if (!payload.title) throw new Error('titleMissing')
    
    return [{
      type: 'TodoAdded',
      title: payload.title,
      at: Date.now(),
    }]
  }
}

module.exports = actions
// reducer.js
const initialState = {
  todos: []
}

const reducer = (state, event) => {
  switch (event.type) {
    case 'TodoAdded':
      return {
        todos: [
          ...state.todos,
          { title: event.title },
        ]
      }
      
    default:
      return state
  }
}

module.exports = (events, state=initialState) => events.reduce(reducer, state)

Above we have a basic action and reducer.

The action, addTodo, does some basic validation to check the presence of a title and if it succeeds, returns a new event with the type TodoAdded. When that event is run through the reducer, a new todo is appended to the list.

Next, we build an adapter to help us persist the events.

// adapter.js
const memoryAdapterBuilder = require('serverless-cqrs.memory-adapter')
module.exports = memoryAdapterBuilder.build({ 
  entityName: 'todo'
})

This adapter will let us persist events and read-model projections in memory.
Finally, we use these to build our read and write model.

// index.js
const {
  writeModelBuilder,
  readModelBuilder,
} = require('serverless-cqrs')

const actions = require('./actions')
const reducer = require('./reducer')
const adapter = require('./adapter')

module.exports.writeModel = writeModelBuilder.build({
  actions,
  reducer,
  adapter,
})

module.exports.readModel = readModelBuilder.build({
  reducer,
  adapter,
  eventAdapter: adapter,
})

That's it!

Try it live

https://repl.it/@yonahforst/serverless-cqrs-quickstart

You can’t perform that action at this time.