@intuitionrobotics/thunderstorm
Version:
64 lines • 4.49 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.FirestoreBackupScheduler = exports.FirestoreBackupScheduler_Class = void 0;
const ts_common_1 = require("@intuitionrobotics/ts-common");
const firebase_function_1 = require("@intuitionrobotics/firebase/app-backend/functions/firebase-function");
const FirebaseModule_1 = require("@intuitionrobotics/firebase/app-backend/FirebaseModule");
const dispatch_onFirestoreBackupSchedulerAct = new ts_common_1.Dispatcher("__onFirestoreBackupSchedulerAct");
class FirestoreBackupScheduler_Class extends firebase_function_1.FirebaseScheduledFunction {
constructor() {
super("FirestoreBackupScheduler");
this.onScheduledEvent = () => __awaiter(this, void 0, void 0, function* () {
const backupStatusCollection = FirebaseModule_1.FirebaseModule.createAdminSession().getFirestore().getCollection('firestore-backup-status', ["moduleKey", "timestamp"]);
const backups = [];
(0, ts_common_1.filterInstances)(dispatch_onFirestoreBackupSchedulerAct.dispatchModule()).forEach(backupArray => {
backups.push(...backupArray);
});
const bucket = yield FirebaseModule_1.FirebaseModule.createAdminSession().getStorage().getOrCreateBucket();
yield Promise.all(backups.map((backupItem) => __awaiter(this, void 0, void 0, function* () {
const query = {
where: { moduleKey: backupItem.moduleKey },
orderBy: [{ key: "timestamp", order: "asc" }],
limit: 1
};
const docs = yield backupStatusCollection.query(query);
const latestDoc = docs[0];
if (latestDoc && latestDoc.timestamp + backupItem.interval > (0, ts_common_1.currentTimeMillies)())
return;
const backupPath = `backup/firestore/${backupItem.moduleKey}/${(0, ts_common_1.currentTimeMillies)()}.json`;
try {
const toBackupData = yield backupItem.collection.query(backupItem.backupQuery);
yield (yield bucket.getFile(backupPath)).write(toBackupData);
yield backupStatusCollection.upsert({ timestamp: (0, ts_common_1.currentTimeMillies)(), moduleKey: backupItem.moduleKey, backupPath });
const keepInterval = backupItem.keepInterval;
if (keepInterval) {
const queryOld = { where: { moduleKey: backupItem.moduleKey, timestamp: { $lt: (0, ts_common_1.currentTimeMillies)() - keepInterval } } };
const oldDocs = yield backupStatusCollection.query(queryOld);
yield Promise.all(oldDocs.map((oldDoc) => __awaiter(this, void 0, void 0, function* () {
yield (yield bucket.getFile(oldDoc.backupPath)).delete();
})));
yield backupStatusCollection.delete(queryOld);
}
}
catch (e) {
this.logWarning(`backup of ${backupItem.moduleKey} has failed with error`, e);
const errorMessage = `Error backing up firestore collection config:\n ${(0, ts_common_1.__stringify)(backupItem, true)}\nError: ${(0, ts_common_1._logger_logException)(e)}`;
yield ts_common_1.dispatch_onServerError.dispatchModuleAsync(ts_common_1.ServerErrorSeverity.Critical, errorMessage);
}
})));
});
this.setSchedule('every 24 hours');
}
}
exports.FirestoreBackupScheduler_Class = FirestoreBackupScheduler_Class;
exports.FirestoreBackupScheduler = new FirestoreBackupScheduler_Class();
//# sourceMappingURL=FirestoreBackupScheduler.js.map