@villedemontreal/mongo 6.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +226 -0
- package/dist/src/config/configs.d.ts +16 -0
- package/dist/src/config/configs.js +26 -0
- package/dist/src/config/configs.js.map +1 -0
- package/dist/src/config/constants.d.ts +85 -0
- package/dist/src/config/constants.js +104 -0
- package/dist/src/config/constants.js.map +1 -0
- package/dist/src/config/init.d.ts +9 -0
- package/dist/src/config/init.js +24 -0
- package/dist/src/config/init.js.map +1 -0
- package/dist/src/config/mongooseConfigs.d.ts +73 -0
- package/dist/src/config/mongooseConfigs.js +107 -0
- package/dist/src/config/mongooseConfigs.js.map +1 -0
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.js +24 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/mongoClient.d.ts +19 -0
- package/dist/src/mongoClient.js +111 -0
- package/dist/src/mongoClient.js.map +1 -0
- package/dist/src/mongoUpdater.d.ts +103 -0
- package/dist/src/mongoUpdater.js +297 -0
- package/dist/src/mongoUpdater.js.map +1 -0
- package/dist/src/mongoUpdater.test.d.ts +1 -0
- package/dist/src/mongoUpdater.test.js +232 -0
- package/dist/src/mongoUpdater.test.js.map +1 -0
- package/dist/src/mongoUtils.d.ts +68 -0
- package/dist/src/mongoUtils.js +280 -0
- package/dist/src/mongoUtils.js.map +1 -0
- package/dist/src/mongoUtils.test.d.ts +1 -0
- package/dist/src/mongoUtils.test.js +24 -0
- package/dist/src/mongoUtils.test.js.map +1 -0
- package/dist/src/plugins/pagination/index.d.ts +11 -0
- package/dist/src/plugins/pagination/index.js +79 -0
- package/dist/src/plugins/pagination/index.js.map +1 -0
- package/dist/src/plugins/pagination/index.test.d.ts +1 -0
- package/dist/src/plugins/pagination/index.test.js +129 -0
- package/dist/src/plugins/pagination/index.test.js.map +1 -0
- package/dist/src/plugins/pagination/specs/IPaginateOptions.d.ts +51 -0
- package/dist/src/plugins/pagination/specs/IPaginateOptions.js +3 -0
- package/dist/src/plugins/pagination/specs/IPaginateOptions.js.map +1 -0
- package/dist/src/utils/logger.d.ts +11 -0
- package/dist/src/utils/logger.js +54 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/testingConfigurations.d.ts +8 -0
- package/dist/src/utils/testingConfigurations.js +17 -0
- package/dist/src/utils/testingConfigurations.js.map +1 -0
- package/dist/tests/testingMongoUpdates/1.0.0.d.ts +5 -0
- package/dist/tests/testingMongoUpdates/1.0.0.js +27 -0
- package/dist/tests/testingMongoUpdates/1.0.0.js.map +1 -0
- package/dist/tests/testingMongoUpdates/1.0.1.d.ts +5 -0
- package/dist/tests/testingMongoUpdates/1.0.1.js +22 -0
- package/dist/tests/testingMongoUpdates/1.0.1.js.map +1 -0
- package/package.json +63 -0
- package/src/config/configs.ts +27 -0
- package/src/config/constants.ts +122 -0
- package/src/config/init.ts +23 -0
- package/src/config/mongooseConfigs.ts +178 -0
- package/src/index.ts +13 -0
- package/src/mongoClient.ts +122 -0
- package/src/mongoUpdater.test.ts +286 -0
- package/src/mongoUpdater.ts +423 -0
- package/src/mongoUtils.test.ts +23 -0
- package/src/mongoUtils.ts +322 -0
- package/src/plugins/pagination/index.test.ts +140 -0
- package/src/plugins/pagination/index.ts +96 -0
- package/src/plugins/pagination/specs/IPaginateOptions.ts +51 -0
- package/src/utils/logger.ts +53 -0
- package/src/utils/testingConfigurations.ts +13 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MongooseConfigs = void 0;
|
|
4
|
+
const general_utils_1 = require("@villedemontreal/general-utils");
|
|
5
|
+
const _ = require("lodash");
|
|
6
|
+
const logger_1 = require("../utils/logger");
|
|
7
|
+
const constants_1 = require("./constants");
|
|
8
|
+
const logger = logger_1.createLogger('mongooseConfigs');
|
|
9
|
+
/**
|
|
10
|
+
* Mongoose configs with default values.
|
|
11
|
+
*/
|
|
12
|
+
class MongooseConfigs {
|
|
13
|
+
/**
|
|
14
|
+
* Overrides default configurations using the ones passed
|
|
15
|
+
* as parameters.
|
|
16
|
+
*/
|
|
17
|
+
// tslint:disable-next-line:cyclomatic-complexity
|
|
18
|
+
constructor(overridingConfigs) {
|
|
19
|
+
// ==========================================
|
|
20
|
+
// Required configs
|
|
21
|
+
// ==========================================
|
|
22
|
+
/**
|
|
23
|
+
* @param applyUpdates Should the database be checked for missing
|
|
24
|
+
* updates and have them applied if required?
|
|
25
|
+
*/
|
|
26
|
+
this.applyUpdates = true;
|
|
27
|
+
/**
|
|
28
|
+
* If no connectionString is provided, "mock" will be
|
|
29
|
+
* used by default and a temporary Mongo server will
|
|
30
|
+
* be used.
|
|
31
|
+
*/
|
|
32
|
+
this.connectionString = 'mock';
|
|
33
|
+
this.connectionOptions = {
|
|
34
|
+
w: 1,
|
|
35
|
+
wtimeout: 5000,
|
|
36
|
+
auto_reconnect: true,
|
|
37
|
+
reconnectTries: 604800,
|
|
38
|
+
reconnectInterval: 1000,
|
|
39
|
+
useNewUrlParser: true
|
|
40
|
+
};
|
|
41
|
+
this.updater = {
|
|
42
|
+
appSchemaCollectionName: constants_1.constants.mongo.collectionNames.APP_SCHEMA,
|
|
43
|
+
lockMaxAgeSeconds: 60,
|
|
44
|
+
/**
|
|
45
|
+
* The path *relative* to the app root, of the directory
|
|
46
|
+
* where the update files are.
|
|
47
|
+
* Required!
|
|
48
|
+
*/
|
|
49
|
+
mongoSchemaUpdatesDirPath: null
|
|
50
|
+
};
|
|
51
|
+
this.mockServer = {
|
|
52
|
+
serverVersion: '3.2.1'
|
|
53
|
+
};
|
|
54
|
+
if (_.isNil(overridingConfigs) ||
|
|
55
|
+
_.isNil(overridingConfigs.updater) ||
|
|
56
|
+
general_utils_1.utils.isBlank(overridingConfigs.updater.mongoSchemaUpdatesDirPath)) {
|
|
57
|
+
throw new Error(`The updater.mongoSchemaUpdatesDirPath config is required!`);
|
|
58
|
+
}
|
|
59
|
+
this.updater.mongoSchemaUpdatesDirPath = overridingConfigs.updater.mongoSchemaUpdatesDirPath;
|
|
60
|
+
// ==========================================
|
|
61
|
+
// Not required...
|
|
62
|
+
// ==========================================
|
|
63
|
+
if (!_.isNil(overridingConfigs.updater.lockMaxAgeSeconds)) {
|
|
64
|
+
if (!general_utils_1.utils.isIntegerValue(overridingConfigs.updater.lockMaxAgeSeconds, true, false)) {
|
|
65
|
+
throw new Error(`The updater.lockMaxAgeSeconds config is not valid : ${overridingConfigs.updater.lockMaxAgeSeconds}`);
|
|
66
|
+
}
|
|
67
|
+
this.updater.lockMaxAgeSeconds = Number(overridingConfigs.updater.lockMaxAgeSeconds);
|
|
68
|
+
}
|
|
69
|
+
if (!_.isNil(overridingConfigs.updater.appSchemaCollectionName)) {
|
|
70
|
+
if (!_.isString(overridingConfigs.updater.appSchemaCollectionName) ||
|
|
71
|
+
general_utils_1.utils.isBlank(overridingConfigs.updater.appSchemaCollectionName)) {
|
|
72
|
+
throw new Error(`The appSchemaCollectionName config is not valid : ${overridingConfigs.updater.appSchemaCollectionName}`);
|
|
73
|
+
}
|
|
74
|
+
this.updater.appSchemaCollectionName = overridingConfigs.updater.appSchemaCollectionName;
|
|
75
|
+
}
|
|
76
|
+
if (!_.isNil(overridingConfigs.applyUpdates)) {
|
|
77
|
+
if (!_.isBoolean(overridingConfigs.applyUpdates)) {
|
|
78
|
+
throw new Error(`The applyUpdates config must be a boolean: ${overridingConfigs.applyUpdates}`);
|
|
79
|
+
}
|
|
80
|
+
this.applyUpdates = overridingConfigs.applyUpdates;
|
|
81
|
+
}
|
|
82
|
+
if (!_.isNil(overridingConfigs.connectionString)) {
|
|
83
|
+
if (!_.isString(overridingConfigs.connectionString) || general_utils_1.utils.isBlank(overridingConfigs.connectionString)) {
|
|
84
|
+
throw new Error(`The connectionString config is not valid : ${overridingConfigs.connectionString}`);
|
|
85
|
+
}
|
|
86
|
+
this.connectionString = overridingConfigs.connectionString;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
logger.warning(`No "connectionString" config was provided: a *mocked* Mongo server will be used!`);
|
|
90
|
+
}
|
|
91
|
+
if (!_.isNil(overridingConfigs.connectionOptions)) {
|
|
92
|
+
if (!_.isObject(overridingConfigs.connectionOptions)) {
|
|
93
|
+
throw new Error(`The connectionOptions config is not valid : ${overridingConfigs.connectionString}`);
|
|
94
|
+
}
|
|
95
|
+
this.connectionOptions = overridingConfigs.connectionOptions;
|
|
96
|
+
}
|
|
97
|
+
if (!_.isNil(overridingConfigs.mockServer) && !_.isNil(overridingConfigs.mockServer.serverVersion)) {
|
|
98
|
+
if (!_.isString(overridingConfigs.mockServer.serverVersion) ||
|
|
99
|
+
general_utils_1.utils.isBlank(overridingConfigs.mockServer.serverVersion)) {
|
|
100
|
+
throw new Error(`The mockServer.serverVersion config is not valid : ${overridingConfigs.mockServer.serverVersion}`);
|
|
101
|
+
}
|
|
102
|
+
this.mockServer.serverVersion = overridingConfigs.mockServer.serverVersion;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
exports.MongooseConfigs = MongooseConfigs;
|
|
107
|
+
//# sourceMappingURL=mongooseConfigs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongooseConfigs.js","sourceRoot":"","sources":["../../../src/config/mongooseConfigs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
+
for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
__exportStar(require("./mongoUtils"), exports);
|
|
14
|
+
__exportStar(require("./config/constants"), exports);
|
|
15
|
+
__exportStar(require("./mongoClient"), exports);
|
|
16
|
+
// ==========================================
|
|
17
|
+
// We do not export the configs instance itself,
|
|
18
|
+
// only the "init()" method, so we can define
|
|
19
|
+
// which are the required parameters.
|
|
20
|
+
// ==========================================
|
|
21
|
+
__exportStar(require("./config/init"), exports);
|
|
22
|
+
__exportStar(require("./plugins/pagination"), exports);
|
|
23
|
+
// import { IPaginateOptions } from './plugins/pagination/specs/IPaginateOptions';
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,+CAA6B;AAC7B,qDAAmC;AAEnC,gDAA8B;AAE9B,6CAA6C;AAC7C,gDAAgD;AAChD,6CAA6C;AAC7C,qCAAqC;AACrC,6CAA6C;AAC7C,gDAA8B;AAC9B,uDAAqC;AACrC,kFAAkF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as mongoose from 'mongoose';
|
|
2
|
+
import { IMongooseConfigs } from './config/mongooseConfigs';
|
|
3
|
+
/**
|
|
4
|
+
* This is the entry point to use this library to manage your
|
|
5
|
+
* Mongoose connections.
|
|
6
|
+
*
|
|
7
|
+
* It *must* be called when the application starts, before any
|
|
8
|
+
* connection is made to Mongo.
|
|
9
|
+
*
|
|
10
|
+
* @returns the Mongoose connection to Mongo.
|
|
11
|
+
*/
|
|
12
|
+
export declare function initMongoose(mongooseConfig: IMongooseConfigs): Promise<mongoose.Connection>;
|
|
13
|
+
/**
|
|
14
|
+
* Returns the Mongoose connection.
|
|
15
|
+
*
|
|
16
|
+
* Will throw an error if Mongo haass not been initialized
|
|
17
|
+
* using the "initMongo()" function.
|
|
18
|
+
*/
|
|
19
|
+
export declare function getMongooseConnection(): mongoose.Connection;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMongooseConnection = exports.initMongoose = void 0;
|
|
4
|
+
const lodash_1 = require("lodash");
|
|
5
|
+
const mongoose = require("mongoose");
|
|
6
|
+
const constants_1 = require("./config/constants");
|
|
7
|
+
const mongooseConfigs_1 = require("./config/mongooseConfigs");
|
|
8
|
+
const mongoUpdater_1 = require("./mongoUpdater");
|
|
9
|
+
const mongoUtils_1 = require("./mongoUtils");
|
|
10
|
+
const logger_1 = require("./utils/logger");
|
|
11
|
+
const logger = logger_1.createLogger('mongoClient');
|
|
12
|
+
let mongooseConnection;
|
|
13
|
+
/**
|
|
14
|
+
* This is the entry point to use this library to manage your
|
|
15
|
+
* Mongoose connections.
|
|
16
|
+
*
|
|
17
|
+
* It *must* be called when the application starts, before any
|
|
18
|
+
* connection is made to Mongo.
|
|
19
|
+
*
|
|
20
|
+
* @returns the Mongoose connection to Mongo.
|
|
21
|
+
*/
|
|
22
|
+
async function initMongoose(mongooseConfig) {
|
|
23
|
+
// ==========================================
|
|
24
|
+
// Uses the MongooseConfigs to make sure unspecified
|
|
25
|
+
// configs have a default value.
|
|
26
|
+
// ==========================================
|
|
27
|
+
const mongooseConfigClean = new mongooseConfigs_1.MongooseConfigs(mongooseConfig);
|
|
28
|
+
return new Promise(async (resolve, reject) => {
|
|
29
|
+
let connectionString = mongooseConfigClean.connectionString;
|
|
30
|
+
// ==========================================
|
|
31
|
+
// Mocked Mongo server?
|
|
32
|
+
// ==========================================
|
|
33
|
+
if (connectionString === constants_1.constants.mongo.testing.MOCK_CONNECTION_STRING) {
|
|
34
|
+
// ==========================================
|
|
35
|
+
// Mock!
|
|
36
|
+
// ==========================================
|
|
37
|
+
const mongoServer = await mongoUtils_1.mongoUtils.mockMongoose(null, mongooseConfigClean.mockServer.serverVersion);
|
|
38
|
+
connectionString = mongoServer.getUri();
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
if (mongooseConnection) {
|
|
42
|
+
await mongooseConnection.close();
|
|
43
|
+
mongooseConnection = undefined;
|
|
44
|
+
}
|
|
45
|
+
// Updates Promise for mongoose, avoid warning log emit by mongoose
|
|
46
|
+
mongoose.Promise = global.Promise;
|
|
47
|
+
const mongoOptions = lodash_1.defaultsDeep(mongooseConfigClean.connectionOptions, {
|
|
48
|
+
promiseLibrary: global.Promise
|
|
49
|
+
});
|
|
50
|
+
// Creates the connection
|
|
51
|
+
mongooseConnection = mongoose.createConnection(connectionString, mongoOptions);
|
|
52
|
+
// Triggered if an error occured
|
|
53
|
+
mongooseConnection.on('error', (err) => {
|
|
54
|
+
mongooseConnection = null;
|
|
55
|
+
reject('Mongo Database: Error connecting to Mongo: ' + err);
|
|
56
|
+
});
|
|
57
|
+
// Triggered when the connection is made.
|
|
58
|
+
mongooseConnection.on('connected', async () => {
|
|
59
|
+
// Check for schema updates once the connexion is made
|
|
60
|
+
if (mongooseConfigClean.applyUpdates) {
|
|
61
|
+
try {
|
|
62
|
+
await checkForUpdates(mongooseConfigClean);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
try {
|
|
66
|
+
await mongooseConnection.close();
|
|
67
|
+
mongooseConnection = undefined;
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
logger.warning(`Error closing connection to Mongo : ${err}`);
|
|
71
|
+
}
|
|
72
|
+
return reject('Error updating Mongo: ' + err);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
logger.info(`Mongo updates skipped`);
|
|
77
|
+
}
|
|
78
|
+
// All good!
|
|
79
|
+
resolve(mongooseConnection);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
return reject('Error initializing Mongo: ' + err);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
exports.initMongoose = initMongoose;
|
|
88
|
+
/**
|
|
89
|
+
* Uses the MongoUpdater to validate if updates are required
|
|
90
|
+
* to run the application on the target Mongo database.
|
|
91
|
+
*/
|
|
92
|
+
async function checkForUpdates(mongooseConfig) {
|
|
93
|
+
const connection = await getMongooseConnection();
|
|
94
|
+
const updater = new mongoUpdater_1.MongoUpdater(connection.db, mongooseConfig.updater.mongoSchemaUpdatesDirPath, mongooseConfig.updater.lockMaxAgeSeconds, mongooseConfig.updater.appSchemaCollectionName);
|
|
95
|
+
await updater.checkInstallation();
|
|
96
|
+
await updater.checkUpdates();
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Returns the Mongoose connection.
|
|
100
|
+
*
|
|
101
|
+
* Will throw an error if Mongo haass not been initialized
|
|
102
|
+
* using the "initMongo()" function.
|
|
103
|
+
*/
|
|
104
|
+
function getMongooseConnection() {
|
|
105
|
+
if (!mongooseConnection) {
|
|
106
|
+
throw new Error("Mongo is not initialized! Please call the 'initMongo()' method first...");
|
|
107
|
+
}
|
|
108
|
+
return mongooseConnection;
|
|
109
|
+
}
|
|
110
|
+
exports.getMongooseConnection = getMongooseConnection;
|
|
111
|
+
//# sourceMappingURL=mongoClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongoClient.js","sourceRoot":"","sources":["../../src/mongoClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import * as MongoDb from 'mongodb';
|
|
2
|
+
/**
|
|
3
|
+
* Mongo updater
|
|
4
|
+
* Manages the updates of the mongo schemas
|
|
5
|
+
*/
|
|
6
|
+
export interface IMongoUpdater {
|
|
7
|
+
/**
|
|
8
|
+
* Validates that the application has been installed.
|
|
9
|
+
* This involves creating a special "appSchema" collection
|
|
10
|
+
* and document to track the application version and being able
|
|
11
|
+
* to update its schemas and documents...
|
|
12
|
+
*/
|
|
13
|
+
checkInstallation(): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Checks if the application needs update or not. Installs the updates
|
|
16
|
+
* if so.
|
|
17
|
+
*/
|
|
18
|
+
checkUpdates(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Locks the appSchema document.
|
|
21
|
+
*
|
|
22
|
+
* @returns true if the lock has been acquired succesfully
|
|
23
|
+
* or false if the document was already locked.
|
|
24
|
+
*/
|
|
25
|
+
lockAppSchemaDocument(): Promise<boolean>;
|
|
26
|
+
/**
|
|
27
|
+
* Unlocks the appSchema document.
|
|
28
|
+
*
|
|
29
|
+
* @returns true if the lock has been removed succesfully
|
|
30
|
+
* or false if the document was not locked.
|
|
31
|
+
*/
|
|
32
|
+
unlockAppSchemaDocument(): Promise<boolean>;
|
|
33
|
+
/**
|
|
34
|
+
* Updates the app schema version stored in mongo database
|
|
35
|
+
*/
|
|
36
|
+
updateAppSchemaVersion(currentVersion: string, newVersion: string): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Installs the appSchema collection.
|
|
39
|
+
*/
|
|
40
|
+
installAppSchemaCollection(): Promise<any>;
|
|
41
|
+
/**
|
|
42
|
+
* Gets a list of available app schema update files.
|
|
43
|
+
*/
|
|
44
|
+
getAppSchemaUpdateFiles(currentVersion: string, newVersion: string): Promise<string[]>;
|
|
45
|
+
/**
|
|
46
|
+
* Updates the app schema
|
|
47
|
+
*/
|
|
48
|
+
applyAppSchemaUpdates(currentVersion: string, newVersion: string): Promise<any>;
|
|
49
|
+
/**
|
|
50
|
+
* Gets the appSchema collection
|
|
51
|
+
*/
|
|
52
|
+
getAppSchemaCollection(): Promise<MongoDb.Collection>;
|
|
53
|
+
/**
|
|
54
|
+
* Gets the current version from the appSchema document.
|
|
55
|
+
*/
|
|
56
|
+
getAppSchemaVersion(): Promise<string>;
|
|
57
|
+
}
|
|
58
|
+
export interface ISchemeInfo {
|
|
59
|
+
version: string;
|
|
60
|
+
lock: boolean;
|
|
61
|
+
lockTimestamp: number;
|
|
62
|
+
}
|
|
63
|
+
export declare class MongoUpdater implements IMongoUpdater {
|
|
64
|
+
private mongoDb;
|
|
65
|
+
/**
|
|
66
|
+
* The *relative* path to the directory where the
|
|
67
|
+
* update files are.
|
|
68
|
+
*/
|
|
69
|
+
private mongoSchemaUpdatesDirPath;
|
|
70
|
+
private lockMaxAgeSeconds;
|
|
71
|
+
private appSchemaCollectionName;
|
|
72
|
+
constructor(mongoDb: MongoDb.Db,
|
|
73
|
+
/**
|
|
74
|
+
* The *relative* path to the directory where the
|
|
75
|
+
* update files are.
|
|
76
|
+
*/
|
|
77
|
+
mongoSchemaUpdatesDirPath: string, lockMaxAgeSeconds: number, appSchemaCollectionName: string);
|
|
78
|
+
installAppSchemaCollection(): Promise<any>;
|
|
79
|
+
updateAppSchemaVersion(currentVersion: string, newVersion: string): Promise<void>;
|
|
80
|
+
getAppSchemaUpdateFiles(currentAppSchemaVersion: string, targetAppSchemaVersion: string): Promise<string[]>;
|
|
81
|
+
applyAppSchemaUpdates(currentVersion: string, newVersion: string): Promise<void>;
|
|
82
|
+
getAppSchemaCollection(): Promise<MongoDb.Collection>;
|
|
83
|
+
getAppSchemaVersion(): Promise<string>;
|
|
84
|
+
/**
|
|
85
|
+
* Tries to get the lock to modify Mongo's schemas.
|
|
86
|
+
*
|
|
87
|
+
* If a lock already exists, checks if it is too old.
|
|
88
|
+
* If too old, will create a new one... This is to prevents
|
|
89
|
+
* situations where a lock would have been taken by an app
|
|
90
|
+
* but that app *crashed* while the lock was on. We don't want
|
|
91
|
+
* suck lock to be active forever...
|
|
92
|
+
*
|
|
93
|
+
*/
|
|
94
|
+
lockAppSchemaDocument(): Promise<boolean>;
|
|
95
|
+
unlockAppSchemaDocument(): Promise<boolean>;
|
|
96
|
+
checkInstallation(): Promise<void>;
|
|
97
|
+
checkUpdates: () => Promise<void>;
|
|
98
|
+
protected getAppSchemaFilesDirPath(): string;
|
|
99
|
+
/**
|
|
100
|
+
* Finds the latest Mongo update file version.
|
|
101
|
+
*/
|
|
102
|
+
protected findMongoAppSchemaTargetVersion(): string;
|
|
103
|
+
}
|