https://github.com/bakerface/dynamodb-event-store
An event store implementation on top of Amazon DynamoDB
https://github.com/bakerface/dynamodb-event-store
Last synced: 2 months ago
JSON representation
An event store implementation on top of Amazon DynamoDB
- Host: GitHub
- URL: https://github.com/bakerface/dynamodb-event-store
- Owner: bakerface
- Created: 2017-02-04T18:01:59.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2017-04-26T14:03:09.000Z (about 9 years ago)
- Last Synced: 2025-11-02T17:16:48.442Z (6 months ago)
- Language: JavaScript
- Size: 10.7 KB
- Stars: 16
- Watchers: 1
- Forks: 2
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
- awesome-cqrs-event-sourcing - DynamoDB EventStore - An event store implementation on top of Amazon DynamoDB (JavaScript). (Event Stores)
README
# dynamodb-event-store
[](https://travis-ci.org/bakerface/dynamodb-event-store)
[](https://npmjs.com/package/dynamodb-event-store)
[](https://npmjs.com/package/dynamodb-event-store)
[](https://codeclimate.com/github/bakerface/dynamodb-event-store)
[](https://codeclimate.com/github/bakerface/dynamodb-event-store)
This package provides a simple event store implementation on top of Amazon
DynamoDB. This is meant to be a general purpose package, and makes no
assumptions about the structure or type of your events. Events are serialized to
JSON when stored, and deserialized automatically when querying. Events that
happen at the same time are grouped into a commit, providing an atomic append
operation. This guarantees that either all events are made durable, or none of
them are. For a few examples, view the samples below:
``` javascript
var EventStore = require('dynamodb-event-store');
var eventStore = new EventStore({
region: 'us-east-1',
accessKeyId: 'access-key-id',
secretAccessKey: 'secret-access-key',
tableName: 'commitsByAggregateIdAndVersion',
indexName: 'commitsByCommitId'
});
```
### eventStore.append(commit)
An atomic append of events to the event store.
``` javascript
var commit = {
aggregateId: '00000000-0000-0000-0000-000000000000',
version: 0,
events: [
{
type: 'accountCreated',
username: 'john',
email: 'john@doe.com'
},
{
type: 'profileEdited',
name: 'John Doe',
company: 'Doe, Inc.'
}
]
};
eventStore.append(commit)
.then(function () {
// the events were committed to the event store
})
.catch(function (err) {
// something went wrong
if (err instanceof EventStore.VersionConflictError) {
// a commit with that version and aggregateId already exists
// most likely a concurrency issue
}
});
});
```
### eventStore.query(options)
Fetches commits for a single aggregate starting at the specified version.
``` javascript
var options = {
aggregateId: '00000000-0000-0000-0000-000000000000',
version: 0
};
eventStore.query(options)
.then(function (commits) {
// =>
[
{
commitId: '20000101000000000:00000000-0000-0000-0000-000000000000',
committedAt: 946684800000,
aggregateId: '00000000-0000-0000-0000-000000000000',
version: 0,
events: [
{
type: 'accountCreated',
username: 'john',
email: 'john@doe.com'
},
{
type: 'profileEdited',
name: 'John Doe',
company: 'Doe, Inc.'
}
]
},
{
commitId: '20000101000000001:00000000-0000-0000-0000-000000000000',
committedAt: 946684800001,
aggregateId: '00000000-0000-0000-0000-000000000000',
version: 1,
events: [
{
type: 'accountDeleted'
}
]
}
]
})
.catch(function (err) {
// something went wrong
});
```
### eventStore.scan([options])
Fetches commits for all aggregates starting at the specified commit id. If no
options are defined then start scanning from the beginning.
``` javascript
var options = {
commitId: '20000101000000000:00000000-0000-0000-0000-000000000000'
};
eventStore.scan(options)
.then(function (commits) {
// =>
[
{
commitId: '20000101000000000:00000000-0000-0000-0000-000000000000',
committedAt: 946684800000,
aggregateId: '00000000-0000-0000-0000-000000000000',
version: 0,
events: [
{
type: 'accountCreated',
username: 'john',
email: 'john@doe.com'
},
{
type: 'profileEdited',
name: 'John Doe',
company: 'Doe, Inc.'
}
]
},
{
commitId: '20000101000000001:11111111-1111-1111-1111-111111111111',
committedAt: 946684800001,
aggregateId: '11111111-1111-1111-1111-111111111111',
version: 0,
events: [
{
type: 'accountCreated',
username: 'jane',
email: 'jane@doe.com'
},
{
type: 'profileEdited',
name: 'Jane Doe',
company: 'Doe, Inc.'
}
]
},
{
commitId: '20000101000000002:00000000-0000-0000-0000-000000000000',
committedAt: 946684800002,
aggregateId: '00000000-0000-0000-0000-000000000000',
version: 1,
events: [
{
type: 'accountDeleted'
}
]
},
{
commitId: '20000101000000003:11111111-1111-1111-1111-111111111111',
committedAt: 946684800003,
aggregateId: '11111111-1111-1111-1111-111111111111',
version: 1,
events: [
{
type: 'accountDeleted'
}
]
}
]
})
.catch(function (err) {
// something went wrong
});
```