Skip to content

Multi instance aggregate

Trym Skaar edited this page Feb 24, 2018 · 1 revision
import {Aggregate} from 'ddbes'

class User extends Aggregate {
  // default
  static keySchema = [{
    name: 'id',
    value: id => id || uuid()
  }]

    changeName(name) {
      return this.commit({type: 'UserNameChanged', name})
    },
  }

  static function reducer(state = {}, event, commit) {
    switch (event.type) {
      case 'Created': {
        const {id, name} = event
        return {
          ...state,
          id,
          name,
          createdAt: commit.committedAt
        }
      }

      case 'NameChanged': {
        const {name} = event
        return {
          ...state,
          name,
          updatedAt: commit.committedAt
        }
      }

      default: return state
    }
  }

  create({id, name}) {
    return this.commit({type: 'Created', id, name})
  }
}

async function testing() {
  const gudleik = await User.create({name: 'Gudleik'})
  await gudleik.changeName('Gudleika')

  const gudleika = await User.load(gudleik.id)
  await gudleika.changeName('Gudleik')

  gudleika = null

  await gudleik.hydrate()

  gudleik.state.name // Gudleik
}