openhim-core
Version:
The OpenHIM core application that provides logging and routing of http requests
283 lines (227 loc) • 8.16 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.upgradeDb = upgradeDb;
var _winston = _interopRequireDefault(require("winston"));
var _pem = _interopRequireDefault(require("pem"));
var _dbVersion = require("./model/dbVersion");
var _keystore = require("./model/keystore");
var _clients = require("./model/clients");
var _users = require("./model/users");
var _visualizer = require("./model/visualizer");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function dedupName(name, names, num) {
let newName;
if (num) {
newName = `${name} ${num}`;
} else {
newName = name;
}
if (Array.from(names).includes(newName)) {
if (!num) {
num = 1;
}
return dedupName(name, names, ++num);
} else {
return newName;
}
} // push new upgrade functions to this array, function must return a promise
// Warning: only add new function below existing functions, order matters!
const upgradeFuncs = [];
upgradeFuncs.push({
description: 'Ensure that all certs have a fingerprint property',
func() {
return new Promise((resolve, reject) => {
_keystore.KeystoreModel.findOne((err, keystore) => {
if (err) {
return reject(err);
}
if (!keystore) {
return resolve();
} // convert server cert
_pem.default.getFingerprint(keystore.cert.data, (err, obj) => {
if (err) {
return reject(err);
}
keystore.cert.fingerprint = obj.fingerprint;
const promises = keystore.ca.map(cert => {
return new Promise((resolve, reject) => {
_pem.default.getFingerprint(cert.data, (err, obj) => {
if (err) {
return reject(err);
}
cert.fingerprint = obj.fingerprint;
return resolve();
});
});
});
Promise.all(promises).then(() => keystore.save(err => {
if (err != null) {
_winston.default.error(`Failed to save keystore: ${err}`);
}
return resolve();
})).catch(reject);
});
});
});
}
});
upgradeFuncs.push({
description: 'Convert clients link to certs via their domain to use the cert fingerprint instead',
func() {
return new Promise((resolve, reject) => {
_clients.ClientModel.find((err, clients) => {
if (err != null) {
_winston.default.error(`Couldn't fetch all clients to upgrade db: ${err}`);
return reject(err);
}
_keystore.KeystoreModel.findOne((err, keystore) => {
if (err != null) {
_winston.default.error(`Couldn't fetch keystore to upgrade db: ${err}`);
return reject(err);
}
const promises = [];
Array.from(clients).forEach(client => {
if (keystore != null && keystore.ca != null) {
for (const cert of Array.from(keystore.ca)) {
if (client.clientDomain === cert.commonName && client.certFingerprint == null) {
client.certFingerprint = cert.fingerprint;
break;
}
}
promises.push(client.save());
}
});
Promise.all(promises).then(resolve).catch(reject);
});
});
});
}
}); // Adapt visualizer from an old version (core 2.0.0, console 1.6.0 and earlier)
//
// We follow the same migration strategy as console:
// https://github.com/jembi/openhim-console/blob/1047b49db2050bafa6b4797e3788fa716d1760b3/app/scripts/controllers/profile.js#L83-L109
function adaptOldVisualizerStructure(visualizer) {
visualizer.channels = [];
visualizer.mediators = [];
visualizer.time.minDisplayPeriod = 100;
if (visualizer.endpoints) {
for (const endpoint of Array.from(visualizer.endpoints)) {
visualizer.channels.push({
eventType: 'channel',
eventName: endpoint.event.replace('channel-', ''),
display: endpoint.desc
});
}
delete visualizer.endpoints;
}
if (visualizer.components) {
return (() => {
const result = [];
for (const component of Array.from(visualizer.components)) {
const split = component.event.split('-');
if (split.length > 1) {
component.eventType = split[0];
component.eventName = split[1];
} else {
component.eventType = 'channel';
component.eventName = component.event;
}
component.display = component.desc;
delete component.event;
result.push(delete component.desc);
}
return result;
})();
}
}
upgradeFuncs.push({
description: 'Migrate visualizer setting from a user\'s profile to a shared collection',
func() {
return new Promise((resolve, reject) => {
_users.UserModel.find((err, users) => {
if (err) {
return reject(err);
}
const visNames = [];
const promises = [];
users.forEach(user => {
if ((user.settings != null ? user.settings.visualizer : undefined) != null) {
let vis = user.settings.visualizer;
if ((vis.components != null ? vis.components.length : undefined) > 0 || (vis.mediators != null ? vis.mediators.length : undefined) > 0 || (vis.channels != null ? vis.channels.length : undefined) > 0 || (vis.endpoints != null ? vis.endpoints.length : undefined) > 0) {
const promise = new Promise((resolve, reject) => {
if (vis.endpoints) {
// old version
adaptOldVisualizerStructure(vis);
}
let name = `${user.firstname} ${user.surname}'s visualizer`;
name = dedupName(name, visNames);
vis.name = name;
visNames.push(name);
vis = new _visualizer.VisualizerModel(vis);
_winston.default.debug(`Migrating visualizer from user profile ${user.email}, using visualizer name '${name}'`);
vis.save((err, vis) => {
if (err) {
_winston.default.error(`Error migrating visualizer from user profile ${user.email}: ${err.stack}`);
return reject(err);
} // delete the visualizer settings from this user profile
user.set('settings.visualizer', null);
user.save((err, user) => {
if (err) {
return reject(err);
}
return resolve();
});
});
});
promises.push(promise);
}
}
});
Promise.all(promises).then(() => resolve()).catch(err => reject(err));
});
});
}
});
if (process.env.NODE_ENV === 'test') {
exports.upgradeFuncs = upgradeFuncs;
exports.dedupName = dedupName;
}
async function upgradeDbInternal() {
try {
const dbVer = (await _dbVersion.DbVersionModel.findOne()) || new _dbVersion.DbVersionModel({
version: 0,
lastUpdated: new Date()
});
const upgradeFuncsToRun = upgradeFuncs.slice(dbVer.version);
for (const upgradeFunc of upgradeFuncsToRun) {
await upgradeFunc.func();
dbVer.version++;
dbVer.lastUpdated = new Date();
await dbVer.save();
}
if (upgradeFuncsToRun.length === 0) {
_winston.default.info('No database upgrades needed');
} else {
_winston.default.info('Completed database upgrade');
}
} catch (err) {
_winston.default.error(`There was an error upgrading your database, you will need to fix this manually to continue. ${err.stack}`);
}
}
function upgradeDb(callback) {
return upgradeDbInternal().then((...values) => {
if (callback) {
callback(null, ...(values || []));
}
}).catch(err => {
if (callback) {
callback(err);
}
});
}
if (!module.parent) {
exports.upgradeDb(() => process.exit());
}
//# sourceMappingURL=upgradeDB.js.map