@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.
Files changed (69) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +226 -0
  3. package/dist/src/config/configs.d.ts +16 -0
  4. package/dist/src/config/configs.js +26 -0
  5. package/dist/src/config/configs.js.map +1 -0
  6. package/dist/src/config/constants.d.ts +85 -0
  7. package/dist/src/config/constants.js +104 -0
  8. package/dist/src/config/constants.js.map +1 -0
  9. package/dist/src/config/init.d.ts +9 -0
  10. package/dist/src/config/init.js +24 -0
  11. package/dist/src/config/init.js.map +1 -0
  12. package/dist/src/config/mongooseConfigs.d.ts +73 -0
  13. package/dist/src/config/mongooseConfigs.js +107 -0
  14. package/dist/src/config/mongooseConfigs.js.map +1 -0
  15. package/dist/src/index.d.ts +6 -0
  16. package/dist/src/index.js +24 -0
  17. package/dist/src/index.js.map +1 -0
  18. package/dist/src/mongoClient.d.ts +19 -0
  19. package/dist/src/mongoClient.js +111 -0
  20. package/dist/src/mongoClient.js.map +1 -0
  21. package/dist/src/mongoUpdater.d.ts +103 -0
  22. package/dist/src/mongoUpdater.js +297 -0
  23. package/dist/src/mongoUpdater.js.map +1 -0
  24. package/dist/src/mongoUpdater.test.d.ts +1 -0
  25. package/dist/src/mongoUpdater.test.js +232 -0
  26. package/dist/src/mongoUpdater.test.js.map +1 -0
  27. package/dist/src/mongoUtils.d.ts +68 -0
  28. package/dist/src/mongoUtils.js +280 -0
  29. package/dist/src/mongoUtils.js.map +1 -0
  30. package/dist/src/mongoUtils.test.d.ts +1 -0
  31. package/dist/src/mongoUtils.test.js +24 -0
  32. package/dist/src/mongoUtils.test.js.map +1 -0
  33. package/dist/src/plugins/pagination/index.d.ts +11 -0
  34. package/dist/src/plugins/pagination/index.js +79 -0
  35. package/dist/src/plugins/pagination/index.js.map +1 -0
  36. package/dist/src/plugins/pagination/index.test.d.ts +1 -0
  37. package/dist/src/plugins/pagination/index.test.js +129 -0
  38. package/dist/src/plugins/pagination/index.test.js.map +1 -0
  39. package/dist/src/plugins/pagination/specs/IPaginateOptions.d.ts +51 -0
  40. package/dist/src/plugins/pagination/specs/IPaginateOptions.js +3 -0
  41. package/dist/src/plugins/pagination/specs/IPaginateOptions.js.map +1 -0
  42. package/dist/src/utils/logger.d.ts +11 -0
  43. package/dist/src/utils/logger.js +54 -0
  44. package/dist/src/utils/logger.js.map +1 -0
  45. package/dist/src/utils/testingConfigurations.d.ts +8 -0
  46. package/dist/src/utils/testingConfigurations.js +17 -0
  47. package/dist/src/utils/testingConfigurations.js.map +1 -0
  48. package/dist/tests/testingMongoUpdates/1.0.0.d.ts +5 -0
  49. package/dist/tests/testingMongoUpdates/1.0.0.js +27 -0
  50. package/dist/tests/testingMongoUpdates/1.0.0.js.map +1 -0
  51. package/dist/tests/testingMongoUpdates/1.0.1.d.ts +5 -0
  52. package/dist/tests/testingMongoUpdates/1.0.1.js +22 -0
  53. package/dist/tests/testingMongoUpdates/1.0.1.js.map +1 -0
  54. package/package.json +63 -0
  55. package/src/config/configs.ts +27 -0
  56. package/src/config/constants.ts +122 -0
  57. package/src/config/init.ts +23 -0
  58. package/src/config/mongooseConfigs.ts +178 -0
  59. package/src/index.ts +13 -0
  60. package/src/mongoClient.ts +122 -0
  61. package/src/mongoUpdater.test.ts +286 -0
  62. package/src/mongoUpdater.ts +423 -0
  63. package/src/mongoUtils.test.ts +23 -0
  64. package/src/mongoUtils.ts +322 -0
  65. package/src/plugins/pagination/index.test.ts +140 -0
  66. package/src/plugins/pagination/index.ts +96 -0
  67. package/src/plugins/pagination/specs/IPaginateOptions.ts +51 -0
  68. package/src/utils/logger.ts +53 -0
  69. 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,6 @@
1
+ export * from './mongoUtils';
2
+ export * from './config/constants';
3
+ export { IMongooseConfigs } from './config/mongooseConfigs';
4
+ export * from './mongoClient';
5
+ export * from './config/init';
6
+ export * from './plugins/pagination';
@@ -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":";;;AAAA,mCAAsC;AACtC,qCAAqC;AACrC,kDAA+C;AAC/C,8DAA6E;AAC7E,iDAA6D;AAC7D,6CAA0C;AAC1C,2CAA8C;AAE9C,MAAM,MAAM,GAAG,qBAAY,CAAC,aAAa,CAAC,CAAC;AAE3C,IAAI,kBAAuC,CAAC;AAE5C;;;;;;;;GAQG;AACI,KAAK,UAAU,YAAY,CAAC,cAAgC;IACjE,6CAA6C;IAC7C,oDAAoD;IACpD,gCAAgC;IAChC,6CAA6C;IAC7C,MAAM,mBAAmB,GAAG,IAAI,iCAAe,CAAC,cAAc,CAAC,CAAC;IAEhE,OAAO,IAAI,OAAO,CAAsB,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;QAChE,IAAI,gBAAgB,GAAG,mBAAmB,CAAC,gBAAgB,CAAC;QAE5D,6CAA6C;QAC7C,uBAAuB;QACvB,6CAA6C;QAC7C,IAAI,gBAAgB,KAAK,qBAAS,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,EAAE;YACvE,6CAA6C;YAC7C,QAAQ;YACR,6CAA6C;YAC7C,MAAM,WAAW,GAAG,MAAM,uBAAU,CAAC,YAAY,CAAC,IAAI,EAAE,mBAAmB,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;YAEtG,gBAAgB,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;SACzC;QAED,IAAI;YACF,IAAI,kBAAkB,EAAE;gBACtB,MAAM,kBAAkB,CAAC,KAAK,EAAE,CAAC;gBACjC,kBAAkB,GAAG,SAAS,CAAC;aAChC;YAED,mEAAmE;YAClE,QAAgB,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YAC3C,MAAM,YAAY,GAA+B,qBAAY,CAAC,mBAAmB,CAAC,iBAAiB,EAAE;gBACnG,cAAc,EAAE,MAAM,CAAC,OAAO;aAC/B,CAAC,CAAC;YAEH,yBAAyB;YACzB,kBAAkB,GAAG,QAAQ,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;YAE/E,gCAAgC;YAChC,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAQ,EAAE,EAAE;gBAC1C,kBAAkB,GAAG,IAAI,CAAC;gBAC1B,MAAM,CAAC,6CAA6C,GAAG,GAAG,CAAC,CAAC;YAC9D,CAAC,CAAC,CAAC;YAEH,yCAAyC;YACzC,kBAAkB,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;gBAC5C,sDAAsD;gBACtD,IAAI,mBAAmB,CAAC,YAAY,EAAE;oBACpC,IAAI;wBACF,MAAM,eAAe,CAAC,mBAAmB,CAAC,CAAC;qBAC5C;oBAAC,OAAO,GAAG,EAAE;wBACZ,IAAI;4BACF,MAAM,kBAAkB,CAAC,KAAK,EAAE,CAAC;4BACjC,kBAAkB,GAAG,SAAS,CAAC;yBAChC;wBAAC,OAAO,GAAG,EAAE;4BACZ,MAAM,CAAC,OAAO,CAAC,uCAAuC,GAAG,EAAE,CAAC,CAAC;yBAC9D;wBAED,OAAO,MAAM,CAAC,wBAAwB,GAAG,GAAG,CAAC,CAAC;qBAC/C;iBACF;qBAAM;oBACL,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;iBACtC;gBAED,YAAY;gBACZ,OAAO,CAAC,kBAAkB,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;SACJ;QAAC,OAAO,GAAG,EAAE;YACZ,OAAO,MAAM,CAAC,4BAA4B,GAAG,GAAG,CAAC,CAAC;SACnD;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAtED,oCAsEC;AAED;;;GAGG;AACH,KAAK,UAAU,eAAe,CAAC,cAAgC;IAC7D,MAAM,UAAU,GAAG,MAAM,qBAAqB,EAAE,CAAC;IACjD,MAAM,OAAO,GAAkB,IAAI,2BAAY,CAC7C,UAAU,CAAC,EAAE,EACb,cAAc,CAAC,OAAO,CAAC,yBAAyB,EAChD,cAAc,CAAC,OAAO,CAAC,iBAAiB,EACxC,cAAc,CAAC,OAAO,CAAC,uBAAuB,CAC/C,CAAC;IACF,MAAM,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAClC,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;AAC/B,CAAC;AAED;;;;;GAKG;AACH,SAAgB,qBAAqB;IACnC,IAAI,CAAC,kBAAkB,EAAE;QACvB,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;KAC5F;IAED,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAND,sDAMC"}
@@ -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
+ }