UNPKG

flexiblepersistence

Version:
187 lines 7.14 kB
"use strict"; 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