@castore/event-storage-adapter-redux
Version:
DRY Castore EventStorageAdapter implementation using a Redux store
81 lines (70 loc) • 2.96 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getCastoreReducers = void 0;
var _toolkit = require("@reduxjs/toolkit");
var _getEventStoreSliceName = require("./utils/getEventStoreSliceName");
var getCastoreReducers = function getCastoreReducers(_ref) {
var _ref$prefix = _ref.prefix,
prefix = _ref$prefix === void 0 ? _getEventStoreSliceName.DEFAULT_PREFIX : _ref$prefix,
eventStores = _ref.eventStores;
var castoreReducers = {};
eventStores.forEach(function (eventStore) {
var eventStoreId = eventStore.eventStoreId;
var eventStoreSliceName = (0, _getEventStoreSliceName.getEventStoreSliceName)({
prefix: prefix,
eventStoreId: eventStoreId
});
var _createSlice = (0, _toolkit.createSlice)({
name: eventStoreSliceName,
initialState: {
eventsByAggregateId: {},
aggregateIds: []
},
reducers: {
eventPushed: function eventPushed(state, action) {
var event = action.payload;
var aggregateId = event.aggregateId,
timestamp = event.timestamp;
var aggregateEvents = state.eventsByAggregateId[aggregateId];
if (aggregateEvents === undefined) {
state.eventsByAggregateId[aggregateId] = [event];
state.aggregateIds.push({
aggregateId: aggregateId,
initialEventTimestamp: timestamp
});
} else {
aggregateEvents.push(event);
}
},
eventReverted: function eventReverted(state, action) {
var event = action.payload;
var aggregateId = event.aggregateId,
version = event.version;
var aggregateEvents = state.eventsByAggregateId[aggregateId];
var revertedEvent = aggregateEvents === null || aggregateEvents === void 0 ? void 0 : aggregateEvents.pop(); // Check that version is indeed last pushed event
// Check that version is indeed last pushed event
if ((revertedEvent === null || revertedEvent === void 0 ? void 0 : revertedEvent.version) !== version) {
if (revertedEvent !== undefined) {
aggregateEvents === null || aggregateEvents === void 0 ? void 0 : aggregateEvents.push(revertedEvent);
}
throw new Error('Unable to revert partially pushed event group.');
}
if (revertedEvent.version === 1) {
delete state.eventsByAggregateId[aggregateId];
state.aggregateIds = state.aggregateIds.filter(function (_ref2) {
var storedAggregateId = _ref2.aggregateId;
return storedAggregateId !== aggregateId;
});
}
}
}
}),
reducer = _createSlice.reducer;
castoreReducers[eventStoreSliceName] = reducer;
});
return castoreReducers;
};
exports.getCastoreReducers = getCastoreReducers;
//# sourceMappingURL=getCastoreReducers.js.map