0.26.5 • Published 3 years ago

resolve-command v0.26.5

Weekly downloads
62
License
MIT
Repository
github
Last release
3 years ago

resolve-command

npm version

Provides a function to handle a command and send the generated event to an event store based on definitions of aggregates and their commands.

Usage

When initializing a command, pass the following arguments:

After the command is initialized, you get a function that is used to send an event to the event store. It receives two arguments:

  • command An object with the following fields: aggregateId - a unique aggregate id. aggregateName - the name of aggregate that has to handle the command. * type - the command type.

    	A command may also have some additional payload.
  • jwtToken
    Non-verified actual JWT token provided from client.

Example

Define a news handling aggregate (see the news-aggregate.js file), use the resolve-command library to execute the createNews command and send the corresponding event to the specified event store. To see a read model handling events which this aggregate produces, refer to the resolve-query package documentation.

import commandHandler from 'resolve-command'
import createEsStorage from 'resolve-storage-lite'
import createBusAdapter from 'resolve-bus-memory'
import createEventStore from 'resolve-es'

// the news-aggregate.js file is placed below
import newsAggregate from './news-aggregate'

const aggregates = [newsAggregate]

const eventStore = createEventStore({ storage: createEsStorage(), bus: createBusAdapter() })

eventStore.onEvent(['NewsCreated'], event =>
  console.log('Event emitted', event)
)

const execute = commandHandler({
  eventStore,
  aggregates
})

const command = {
  aggregateId: '1',
  aggregateName: 'news',
  type: 'createNews',
  payload: {
    title: 'News',
    userId: 'user-id',
    text: 'News content'
  }
}

execute(command).then(event => {
  console.log('Event saved', event);
})
news-aggregate.js
import Immutable from 'seamless-immutable'

export default {
  name: 'news',
  initialState: Immutable({}),
  projection: {
    NEWS_CREATED: (state, { payload: { userId } }) =>
      state.merge({
        createdAt: Date.now(),
        createdBy: userId,
        voted: [],
        comments: {}
      }),

    NEWS_UPVOTED: (state, { payload: { userId } }) =>
      state.update('voted', voted => voted.concat(userId)),

    NEWS_UNVOTED: (state, { payload: { userId } }) =>
      state.update('voted', voted =>
        voted.filter(curUserId => curUserId !== userId)
      ),
    COMMENT_CREATED: (state, { payload: { commentId, userId } }) =>
      state.setIn(['comments', commentId], {
        createdAt: Date.now(),
        createdBy: userId
      }),

    COMMENT_REMOVED: (state, { payload: { commentId } }) =>
      state.setIn(['comments', commentId, 'removedAt'], Date.now())
  },
  commands: {
    createNews: (state, { payload: { title, link, userId, text } }) => {
      if (state.createdAt) {
        throw new Error('Aggregate already exists')
      }

      if (!title) {
        throw new Error('Title is required')
      }

      if (!userId) {
        throw new Error('UserId is required')
      }

      return new Event('NEWS_CREATED', {
        title,
        text,
        link,
        userId
      })
    },

    upvoteNews: (state, { payload: { userId } }) => {
      if (!state.createdAt || state.removedAt) {
        throw new Error('Aggregate is not exist')
      }

      if (state.voted.includes(userId)) {
        throw new Error('User already voted')
      }

      if (!userId) {
        throw new Error('UserId is required')
      }

      return new Event('NEWS_UPVOTED', {
        userId
      })
    },

    unvoteNews: (state, { payload: { userId } }) => {
      if (!state.createdAt || state.removedAt) {
        throw new Error('Aggregate is not exist')
      }

      if (!state.voted.includes(userId)) {
        throw new Error('User has not voted')
      }

      if (!userId) {
        throw new Error('UserId is required')
      }

      return new Event('NEWS_UNVOTED'  , {
        userId
      })
    },

    deleteNews: (state) => {
        if (!state.createdAt || state.removedAt) {
          throw new Error('Aggregate is not exist')
        }

      return new Event('NEWS_DELETED')
    },

    createComment: (state, { payload: { text, parentId, userId, commentId } }) => {
      if (!state.createdAt || state.removedAt) {
        throw new Error('Aggregate is not exist')
      }

      if (!text) {
        throw new Error('Text is required')
      }

      if (!parentId) {
        throw new Error('ParentId is required')
      }

      if (!userId) {
        throw new Error('UserId is required')
      }

      return new Event('COMMENT_CREATED', {
        text,
        parentId,
        userId,
        commentId
      })
    },

    updateComment: (state, { payload : { text, commentId, userId } }) => {
      if (!state.createdAt || state.removedAt) {
        throw new Error('Aggregate is not exist')
      }

      if (state.createdBy !== userId) {
        throw new Error('Permission denied')
      }

      if (!text) {
        throw new Error('Text is required')
      }

      return new Event('COMMENT_UPDATED', {
        text,
        commentId
      })
    },

    removeComment: (state, { payload: { commentId, userId } }) => {
      if (!state.createdAt || state.removedAt) {
        throw new Error('Aggregate is not exist')
      }

      if (state.createdBy !== userId) {
        throw new Error('Permission denied')
      }

      return new Event('COMMENT_REMOVED', { commentId })
    }
  }
}
0.27.8-alpha

3 years ago

0.27.7-alpha

3 years ago

0.27.6-alpha

3 years ago

0.27.4-alpha

3 years ago

0.27.5-alpha

3 years ago

0.27.3-alpha

3 years ago

0.26.5

3 years ago

0.27.2-alpha

3 years ago

0.27.0-alpha

3 years ago

0.26.4

3 years ago

0.26.3

3 years ago

0.26.2

3 years ago

0.26.1

3 years ago

0.26.0

3 years ago

0.25.18

4 years ago

0.25.17

4 years ago

0.25.16

4 years ago

0.25.15

4 years ago

0.25.14

4 years ago

0.25.13

4 years ago

0.25.12

4 years ago

0.25.11

4 years ago

0.25.10

4 years ago

0.25.9

4 years ago

0.25.8

4 years ago

0.25.7

4 years ago

0.25.6

4 years ago

0.25.5

4 years ago

0.25.4

4 years ago

0.25.3

4 years ago

0.25.2

4 years ago

0.25.1

4 years ago

0.25.0

4 years ago

0.24.23

4 years ago

0.24.22

4 years ago

0.24.21

4 years ago

0.24.20

4 years ago

0.24.19

4 years ago

0.24.18

4 years ago

0.24.17

4 years ago

0.24.16

4 years ago

0.24.15

4 years ago

0.24.14

4 years ago

0.24.13

4 years ago

0.24.12

4 years ago

0.24.11

4 years ago

0.24.10

4 years ago

0.24.9

4 years ago

0.24.8

4 years ago

0.24.7

4 years ago

0.24.6

4 years ago

0.24.5

4 years ago

0.24.4

4 years ago

0.24.3

4 years ago

0.24.3-alpha.0

4 years ago

0.24.2

4 years ago

0.24.0

4 years ago

0.23.2

4 years ago

0.23.1

4 years ago

0.23.0

4 years ago

0.22.15

4 years ago

0.22.14

4 years ago

0.22.12

4 years ago

0.22.13

4 years ago

0.22.11

4 years ago

0.22.10

4 years ago

0.22.9

4 years ago

0.22.7

4 years ago

0.22.8

4 years ago

0.22.6

4 years ago

0.22.5

4 years ago

0.22.4

4 years ago

0.22.3

4 years ago

0.22.2

4 years ago

0.22.1

4 years ago

0.22.0

4 years ago

0.21.15

4 years ago

0.21.14

4 years ago

0.21.13

4 years ago

0.21.12

4 years ago

0.21.11

4 years ago

0.21.10

4 years ago

0.21.9

4 years ago

0.21.8

4 years ago

0.21.7

4 years ago

0.21.6

4 years ago

0.21.5

4 years ago

0.21.4

4 years ago

0.21.3

4 years ago

0.21.2

4 years ago

0.21.0

4 years ago

0.21.0-alpha.15

4 years ago

0.21.0-alpha.9

4 years ago

0.21.0-alpha.11

4 years ago

0.21.0-alpha.7

4 years ago

0.21.0-alpha.6

4 years ago

0.21.0-alpha.5

4 years ago

0.21.0-alpha.3

4 years ago

0.21.0-alpha.2

4 years ago

0.21.0-alpha.1

4 years ago

0.21.0-alpha.0

4 years ago

0.20.29

5 years ago

0.20.28

5 years ago

0.20.27

5 years ago

0.20.26

5 years ago

0.20.25

5 years ago

0.20.24

5 years ago

0.20.23

5 years ago

0.20.22

5 years ago

0.20.21

5 years ago

0.20.20

5 years ago

0.20.19

5 years ago

0.20.18

5 years ago

0.20.17

5 years ago

0.20.16

5 years ago

0.20.15

5 years ago

0.20.14

5 years ago

0.20.13

5 years ago

0.20.12

5 years ago

0.20.11

5 years ago

0.20.10

5 years ago

0.20.9

5 years ago

0.20.8

5 years ago

0.20.7

5 years ago

0.20.6

5 years ago

0.20.5

5 years ago

0.20.4

5 years ago

0.20.3

5 years ago

0.20.2

5 years ago

0.20.1

5 years ago

0.20.0

5 years ago

0.19.8

5 years ago

0.19.7

5 years ago

0.19.6

5 years ago

0.19.5

5 years ago

0.19.4

5 years ago

0.19.3

5 years ago

0.19.2

5 years ago

0.19.1

5 years ago

0.19.0

5 years ago

0.18.17

5 years ago

0.18.16

5 years ago

0.18.15

5 years ago

0.18.14

5 years ago

0.18.13

5 years ago

0.18.12

5 years ago

0.18.11

5 years ago

0.18.10

5 years ago

0.18.9

5 years ago

0.18.8

5 years ago

0.18.7

5 years ago

0.18.6

5 years ago

0.18.5

5 years ago

0.18.4

5 years ago

0.18.3

5 years ago

0.18.2

5 years ago

0.18.1

5 years ago

0.18.0

5 years ago

0.17.4

6 years ago

0.17.3

6 years ago

0.17.2

6 years ago

0.17.1

6 years ago

0.17.0

6 years ago

0.16.1

6 years ago

0.16.0

6 years ago

0.15.2

6 years ago

0.15.1

6 years ago

0.15.0

6 years ago

0.14.4

6 years ago

0.14.3

6 years ago

0.14.2

6 years ago

0.14.1

6 years ago

0.14.0

6 years ago

0.13.2

6 years ago

0.13.1

6 years ago

0.13.0

6 years ago

0.12.3

6 years ago

0.12.1

6 years ago

0.11.0

6 years ago

0.10.2

6 years ago

0.10.1

6 years ago

0.10.0

6 years ago

0.9.1

6 years ago

0.9.0

6 years ago

0.8.1

6 years ago

0.8.0

6 years ago

0.7.4

6 years ago

0.7.2

6 years ago

0.7.1

6 years ago

0.7.0

6 years ago

0.6.1

6 years ago

0.6.0

6 years ago

0.5.4

6 years ago

0.5.3

6 years ago

0.5.2

6 years ago

0.5.1

6 years ago

0.5.0

6 years ago

0.5.0-beta.3

6 years ago

0.5.0-beta.2

6 years ago

0.5.0-beta.1

6 years ago

0.4.0

6 years ago

0.2.2

6 years ago

0.2.1

6 years ago

0.2.0

6 years ago

0.1.0

6 years ago

0.0.44

7 years ago

0.0.43

7 years ago

0.0.42

7 years ago

0.0.41

7 years ago

0.0.40

7 years ago

0.0.39

7 years ago

0.0.38

7 years ago

0.0.37

7 years ago

0.0.36

7 years ago

0.0.35

7 years ago

0.0.34

7 years ago

0.0.33

7 years ago

0.0.32

7 years ago

0.0.31

7 years ago

0.0.30

7 years ago

0.0.29

7 years ago

0.0.28

7 years ago

0.0.27

7 years ago

0.0.26

7 years ago

0.0.25

7 years ago

0.0.24

7 years ago

0.0.23

7 years ago

0.0.22

7 years ago

0.0.21

7 years ago

0.0.20

7 years ago

0.0.19

7 years ago

0.0.18

7 years ago

0.0.17

7 years ago

0.0.16

7 years ago

0.0.15

7 years ago

0.0.14

7 years ago

0.0.13

7 years ago

0.0.12

7 years ago

0.0.11

7 years ago

0.0.10

7 years ago

0.0.9

7 years ago

0.0.8

7 years ago

0.0.7

7 years ago

0.0.6

7 years ago

0.0.5

7 years ago

0.0.4

7 years ago

0.0.3

7 years ago

0.0.2

7 years ago

0.0.1

7 years ago