flexiblepersistence
Version:
A CQRS and Event Sourcing platform
187 lines • 7.14 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Handler = void 0;
/* eslint-disable @typescript-eslint/no-explicit-any */
// file deepcode ignore no-any: any needed
const write_1 = require("../write/write");
const read_1 = require("./../read/read");
const event_1 = require("../event/event");
const operation_1 = require("../event/operation");
const mongoose_1 = require("mongoose");
class Handler {
constructor(event, read, options) {
this.options = options;
if (read) {
this.read = new read_1.Read(read);
}
if (event) {
this.write = new write_1.Write(event, this.read, this.options);
}
if (!this.read && !this.write) {
throw new Error('Handler must have a ReadDB or a WriteDB.');
}
}
getWrite() {
return this.write;
}
async doRead(input) {
if (!this.read && !this.write) {
throw new Error('Handler must have a ReadDB.');
}
return this.read
? this.read.getReadDB().read(input)
: this.write?.read(input);
}
addIds(objects) {
if (Array.isArray(objects)) {
for (const object of objects) {
this.addId(object);
}
}
this.addId(objects);
}
addId(object) {
if (object !== null &&
typeof object === 'object' &&
!Array.isArray(object)) {
if (object.id === undefined &&
object._id === undefined &&
!JSON.parse(process.env.DISABLE_AUTO_ID || 'false'))
object.id = new mongoose_1.mongo.ObjectId();
for (const key in object) {
if (Object.prototype.hasOwnProperty.call(object, key) &&
key !== 'id' &&
key !== '_id') {
const element = object[key];
this.addIds(element);
}
}
}
}
restoreEvent(event) {
if (!(event instanceof event_1.Event))
event = new event_1.Event(event);
if (!event['id'] && !JSON.parse(process.env.DISABLE_AUTO_ID || 'false'))
event.setId(new mongoose_1.mongo.ObjectId());
const operation = event['operation'];
if (operation === operation_1.Operation.create)
this.addIds(event);
return event;
}
addEvent(event) {
event = this.restoreEvent(event);
if (!this.write) {
if (this.read)
return this.read.newEvent(event);
throw new Error('Handler must have a WriteDB or ReadDB.');
}
return this.write.addEvent(event);
}
readArray(scheme, selectedItem) {
return this.doRead({ scheme, selectedItem, single: false });
}
readItem(scheme, selectedItem) {
return this.doRead({ scheme, selectedItem, single: true });
}
readItemById(scheme, id) {
return this.doRead({ scheme, id });
}
getRead() {
return this.read;
}
async backup(database, scheme = 'events', pageSize = 50) {
try {
if (database) {
const newDatabase = ('bak(' +
new Date().toISOString() +
'):' +
database.getPersistenceInfo().database)
.replaceAll(':', '_')
.replaceAll('.', '_');
const newUri = database.getPersistenceInfo()?.uri?.replace(database.getPersistenceInfo().database, newDatabase);
const backupInfo = {
...database.getPersistenceInfo(),
database: newDatabase,
uri: newUri,
};
const backupClass = database.constructor;
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
const backup = new backupClass(backupInfo);
const eventOptions = {
pageSize: pageSize,
page: 0,
};
let total = pageSize;
while (total > 0 &&
(eventOptions.pages === undefined ||
(eventOptions.pages !== undefined &&
eventOptions.page !== undefined &&
eventOptions.page < eventOptions.pages))) {
const read = await database.read({ scheme: scheme, eventOptions });
total = read.receivedItem.length;
await backup.create({
single: false,
item: read.receivedItem,
scheme: scheme,
});
if (eventOptions.page !== undefined)
eventOptions.page++;
}
return true;
}
return false;
}
catch (error) {
return false;
}
}
migrate() {
return new Promise(async (resolve, reject) => {
const ignoreError = JSON.parse(process.env.MIGRATION_IGNORE_ERROR || 'false') || false;
const disableBackup = JSON.parse(process.env.MIGRATION_DISABLE_BACKUP || 'false') || false;
const pageSize = JSON.parse(process.env.MIGRATION_PAGE_SIZE || '50') || 50;
try {
if (!this.read || !this.write) {
throw new Error('Handler must have a ReadDB or a WriteDB.');
}
else {
if (!disableBackup) {
console.log('Starting Backup');
const backupResult = await this.backup(this?.getWrite()?.getPersistence(), 'events', pageSize);
if (!backupResult)
throw new Error('BACKUP ERROR.');
console.log('Backup Complete');
}
const events = (await this.getWrite()?.read({
scheme: 'events',
single: false,
}));
await this.getRead()?.clear();
await this.getWrite()?.clear();
const rEvents = [];
if (events.receivedItem)
for (const event of events.receivedItem) {
try {
rEvents.push(await this.addEvent(event));
}
catch (error) {
console.error(error);
if (!ignoreError)
reject(error);
}
}
}
}
catch (error) {
console.error(error);
if (!ignoreError)
reject(error);
}
console.log('DONE MIGRATION');
resolve(true);
});
}
}
exports.Handler = Handler;
//# sourceMappingURL=handler.js.map