not-node 5.1.41 → 5.1.42
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/package.json +2 -1
- package/src/core/index.js +3 -3
- package/src/init/index.js +1 -0
- package/src/init/{app.js → lib/app.js} +12 -14
- package/src/init/{bodyparser.js → lib/bodyparser.js} +0 -0
- package/src/init/{compression.js → lib/compression.js} +0 -0
- package/src/init/{core.js → lib/core.js} +1 -1
- package/src/init/{cors.js → lib/cors.js} +4 -5
- package/src/init/{db → lib/db}/index.js +3 -2
- package/src/init/{db → lib/db}/ioredis.js +4 -5
- package/src/init/{db → lib/db}/mongoose.js +5 -6
- package/src/init/{db → lib/db}/redis.js +4 -5
- package/src/init/{env.js → lib/env.js} +4 -5
- package/src/init/{express.js → lib/express.js} +2 -3
- package/src/init/{fileupload.js → lib/fileupload.js} +0 -0
- package/src/init/{http.js → lib/http.js} +4 -5
- package/src/init/{informer.js → lib/informer.js} +1 -1
- package/src/init/{methodoverride.js → lib/methodoverride.js} +0 -0
- package/src/init/{middleware.js → lib/middleware.js} +4 -5
- package/src/init/{modules.js → lib/modules.js} +0 -0
- package/src/init/{monitoring.js → lib/monitoring.js} +1 -1
- package/src/init/{rateLimiter.js → lib/rateLimiter.js} +2 -3
- package/src/init/lib/redlock.js +44 -0
- package/src/init/{routes.js → lib/routes.js} +1 -1
- package/src/init/{security.js → lib/security.js} +1 -1
- package/src/init/{sessions → lib/sessions}/index.js +2 -2
- package/src/init/{sessions → lib/sessions}/mongoose.js +4 -5
- package/src/init/{sessions → lib/sessions}/redis.js +4 -5
- package/src/init/{static.js → lib/static.js} +3 -5
- package/src/init/{template.js → lib/template.js} +4 -5
- package/src/init/sequence.standart.js +23 -20
- package/src/model/default.js +1 -1
- package/src/model/exceptions.js +3 -3
- package/src/model/routine.js +109 -55
- package/src/model/versioning.js +35 -33
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "not-node",
|
|
3
|
-
"version": "5.1.
|
|
3
|
+
"version": "5.1.42",
|
|
4
4
|
"description": "node complimentary part for client side notFramework.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -64,6 +64,7 @@
|
|
|
64
64
|
"not-validation": "^0.0.8",
|
|
65
65
|
"rate-limiter-flexible": "^2.3.7",
|
|
66
66
|
"redis": "^4.1.1",
|
|
67
|
+
"redlock": "^5.0.0-beta.2",
|
|
67
68
|
"rfdc": "^1.3.0",
|
|
68
69
|
"rmdir": "^1.2.0",
|
|
69
70
|
"serve-static": "*",
|
package/src/core/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
const {generatePaths} = require(
|
|
1
|
+
const { generatePaths } = require("../common");
|
|
2
2
|
|
|
3
3
|
module.exports = {
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
name: "not-node",
|
|
5
|
+
paths: generatePaths(["fields", "locales"], __dirname),
|
|
6
6
|
};
|
package/src/init/index.js
CHANGED
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
const notAppConstructor = require("
|
|
1
|
+
const notAppConstructor = require("../../app.js");
|
|
2
2
|
const ENV = process.env.NODE_ENV || "development";
|
|
3
3
|
const path = require("path");
|
|
4
4
|
const logger = require("not-log");
|
|
5
|
-
const log = logger(module, "not-node//init");
|
|
5
|
+
const log = logger(module, "not-node//init//app");
|
|
6
6
|
const { notErrorReporter } = require("not-error");
|
|
7
7
|
|
|
8
|
-
const emit = require("./additional").run;
|
|
9
|
-
|
|
10
8
|
module.exports = class InitApp {
|
|
11
9
|
static AppConstructor = notAppConstructor;
|
|
12
10
|
static ReporterConstructor = notErrorReporter;
|
|
13
11
|
|
|
14
|
-
static async createApp({ config, options, master }) {
|
|
12
|
+
static async createApp({ config, options, master, emit }) {
|
|
15
13
|
await emit("app.create.pre", { config, options, master });
|
|
16
14
|
master.setApp(
|
|
17
15
|
new InitApp.AppConstructor({ mongoose: master.getMongoose() })
|
|
@@ -19,7 +17,7 @@ module.exports = class InitApp {
|
|
|
19
17
|
await emit("app.create.post", { config, options, master });
|
|
20
18
|
}
|
|
21
19
|
|
|
22
|
-
static async setAppEnvs({ config, options, master }) {
|
|
20
|
+
static async setAppEnvs({ config, options, master, emit }) {
|
|
23
21
|
await emit("app.setEnv.pre", { config, options, master });
|
|
24
22
|
master.setEnv("hostname", config.get("hostname"));
|
|
25
23
|
master.setEnv("server", `https://` + config.get("host"));
|
|
@@ -35,13 +33,13 @@ module.exports = class InitApp {
|
|
|
35
33
|
await emit("app.setEnv.post", { config, options, master });
|
|
36
34
|
}
|
|
37
35
|
|
|
38
|
-
static async initCore({ config, options, master }) {
|
|
36
|
+
static async initCore({ config, options, master, emit }) {
|
|
39
37
|
await emit("app.initCore.pre", { config, options, master });
|
|
40
38
|
master.getApp().importModuleFrom(path.join(__dirname, "../core"));
|
|
41
39
|
await emit("app.initCore.post", { config, options, master });
|
|
42
40
|
}
|
|
43
41
|
|
|
44
|
-
static async importModules({ config, options, master }) {
|
|
42
|
+
static async importModules({ config, options, master, emit }) {
|
|
45
43
|
await emit("app.importModules.pre", { config, options, master });
|
|
46
44
|
master.getApp().importModulesFrom(config.get("modulesPath"));
|
|
47
45
|
if (Array.isArray(config.get("importModulesFromNPM"))) {
|
|
@@ -70,15 +68,15 @@ module.exports = class InitApp {
|
|
|
70
68
|
}
|
|
71
69
|
}
|
|
72
70
|
|
|
73
|
-
async run({ config, options, master }) {
|
|
71
|
+
async run({ config, options, master, emit }) {
|
|
74
72
|
try {
|
|
75
73
|
log.info("Init not-app...");
|
|
76
74
|
await emit("app.pre", { config, options, master });
|
|
77
|
-
await InitApp.createApp({ config, options, master });
|
|
78
|
-
await InitApp.setAppEnvs({ config, options, master });
|
|
79
|
-
await InitApp.initCore({ config, options, master });
|
|
80
|
-
await InitApp.importModules({ config, options, master });
|
|
81
|
-
await InitApp.createReporter({ config, options, master });
|
|
75
|
+
await InitApp.createApp({ config, options, master, emit });
|
|
76
|
+
await InitApp.setAppEnvs({ config, options, master, emit });
|
|
77
|
+
await InitApp.initCore({ config, options, master, emit });
|
|
78
|
+
await InitApp.importModules({ config, options, master, emit });
|
|
79
|
+
await InitApp.createReporter({ config, options, master, emit });
|
|
82
80
|
await emit("app.post", { config, options, master });
|
|
83
81
|
} catch (e) {
|
|
84
82
|
master.throwError(e.message, 1);
|
|
File without changes
|
|
File without changes
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
const log = require("not-log")(module, "not-node//init");
|
|
2
|
-
const ADDS = require("./additional");
|
|
1
|
+
const log = require("not-log")(module, "not-node//init//cors");
|
|
3
2
|
|
|
4
3
|
module.exports = class InitCORS {
|
|
5
4
|
static getOriginFilter(whitelist) {
|
|
@@ -8,8 +7,8 @@ module.exports = class InitCORS {
|
|
|
8
7
|
};
|
|
9
8
|
}
|
|
10
9
|
|
|
11
|
-
async run({ config, options, master }) {
|
|
12
|
-
await
|
|
10
|
+
async run({ config, options, master, emit }) {
|
|
11
|
+
await emit("cors.pre", { config, options, master });
|
|
13
12
|
const cors = require("cors");
|
|
14
13
|
log.info("Setting up CORS rules...");
|
|
15
14
|
const whitelist = config.get("cors");
|
|
@@ -20,6 +19,6 @@ module.exports = class InitCORS {
|
|
|
20
19
|
};
|
|
21
20
|
log.info("CORS options", corsOptions);
|
|
22
21
|
master.getServer().use(cors(corsOptions));
|
|
23
|
-
await
|
|
22
|
+
await emit("cors.post", { config, options, master });
|
|
24
23
|
}
|
|
25
24
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const path = require("path");
|
|
2
|
-
const { objHas } = require("
|
|
2
|
+
const { objHas } = require("../../../common");
|
|
3
3
|
|
|
4
4
|
module.exports = class InitDB {
|
|
5
5
|
static default = path.resolve(__dirname, "./mongoose.js");
|
|
@@ -32,7 +32,7 @@ module.exports = class InitDB {
|
|
|
32
32
|
* require('not-node').getEnv('mongoose')
|
|
33
33
|
* require('not-node').getEnv('redis')
|
|
34
34
|
**/
|
|
35
|
-
async run({ master, config, options }) {
|
|
35
|
+
async run({ master, config, options, emit }) {
|
|
36
36
|
const conf = config.get("db");
|
|
37
37
|
for (let driver in conf) {
|
|
38
38
|
const Constructor = InitDB.getConstructor(driver);
|
|
@@ -42,6 +42,7 @@ module.exports = class InitDB {
|
|
|
42
42
|
options,
|
|
43
43
|
conf: conf[driver],
|
|
44
44
|
alias: driver,
|
|
45
|
+
emit,
|
|
45
46
|
});
|
|
46
47
|
}
|
|
47
48
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
const log = require("not-log")(module, "not-node//init");
|
|
2
|
-
const ADDS = require("../additional");
|
|
1
|
+
const log = require("not-log")(module, "not-node//init//db//ioredis");
|
|
3
2
|
|
|
4
3
|
module.exports = class InitDBRedisIO {
|
|
5
4
|
static async initRedis({ conf, master, alias }) {
|
|
@@ -11,8 +10,8 @@ module.exports = class InitDBRedisIO {
|
|
|
11
10
|
log.log("redis client");
|
|
12
11
|
}
|
|
13
12
|
|
|
14
|
-
async run({ config, options, master, conf, alias }) {
|
|
15
|
-
await
|
|
13
|
+
async run({ config, options, master, conf, alias, emit }) {
|
|
14
|
+
await emit(`db.${alias}.pre`, {
|
|
16
15
|
config,
|
|
17
16
|
options,
|
|
18
17
|
master,
|
|
@@ -20,7 +19,7 @@ module.exports = class InitDBRedisIO {
|
|
|
20
19
|
alias,
|
|
21
20
|
});
|
|
22
21
|
await InitDBRedisIO.initRedis({ conf, master, alias });
|
|
23
|
-
await
|
|
22
|
+
await emit(`db.${alias}.post`, {
|
|
24
23
|
config,
|
|
25
24
|
options,
|
|
26
25
|
master,
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
const log = require("not-log")(module, "not-node//init");
|
|
2
|
-
const ADDS = require("../additional");
|
|
1
|
+
const log = require("not-log")(module, "not-node//init//db//mongoose");
|
|
3
2
|
|
|
4
3
|
module.exports = class InitDBMongoose {
|
|
5
4
|
static fixMongooseOptions(opts) {
|
|
@@ -10,7 +9,7 @@ module.exports = class InitDBMongoose {
|
|
|
10
9
|
}
|
|
11
10
|
|
|
12
11
|
static async initMongoose({ conf, master, alias }) {
|
|
13
|
-
const Increment = require("
|
|
12
|
+
const Increment = require("../../../model/increment.js");
|
|
14
13
|
log.info("Setting up mongoose connection...");
|
|
15
14
|
const mongoose = require("mongoose");
|
|
16
15
|
mongoose.Promise = global.Promise;
|
|
@@ -26,9 +25,9 @@ module.exports = class InitDBMongoose {
|
|
|
26
25
|
master.setEnv(`db.${alias}`, mongoose);
|
|
27
26
|
}
|
|
28
27
|
|
|
29
|
-
async run({ config, options, master, conf, alias }) {
|
|
28
|
+
async run({ config, options, master, conf, alias, emit }) {
|
|
30
29
|
log.info(`db.${alias}.pre`);
|
|
31
|
-
await
|
|
30
|
+
await emit(`db.${alias}.pre`, {
|
|
32
31
|
config,
|
|
33
32
|
options,
|
|
34
33
|
master,
|
|
@@ -36,7 +35,7 @@ module.exports = class InitDBMongoose {
|
|
|
36
35
|
alias,
|
|
37
36
|
});
|
|
38
37
|
await InitDBMongoose.initMongoose({ conf, master, alias });
|
|
39
|
-
await
|
|
38
|
+
await emit(`db.${alias}.post`, {
|
|
40
39
|
config,
|
|
41
40
|
options,
|
|
42
41
|
master,
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
const { notError } = require("not-error");
|
|
2
|
-
const log = require("not-log")(module, "not-node//init");
|
|
3
|
-
const ADDS = require("../additional");
|
|
2
|
+
const log = require("not-log")(module, "not-node//init//db//redis");
|
|
4
3
|
|
|
5
4
|
module.exports = class InitDBRedis {
|
|
6
5
|
static async initRedis({ conf, master, alias }) {
|
|
@@ -11,8 +10,8 @@ module.exports = class InitDBRedis {
|
|
|
11
10
|
master.setEnv(`db.${alias}`, redisClient);
|
|
12
11
|
}
|
|
13
12
|
|
|
14
|
-
async run({ config, options, master, conf, alias }) {
|
|
15
|
-
await
|
|
13
|
+
async run({ config, options, master, conf, alias, emit }) {
|
|
14
|
+
await emit(`db.${alias}.pre`, {
|
|
16
15
|
config,
|
|
17
16
|
options,
|
|
18
17
|
master,
|
|
@@ -20,7 +19,7 @@ module.exports = class InitDBRedis {
|
|
|
20
19
|
alias,
|
|
21
20
|
});
|
|
22
21
|
await InitDBRedis.initRedis({ conf, master, alias });
|
|
23
|
-
await
|
|
22
|
+
await emit(`db.${alias}.post`, {
|
|
24
23
|
config,
|
|
25
24
|
options,
|
|
26
25
|
master,
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
const log = require("not-log")(module, "not-node//init");
|
|
2
|
-
const ADDS = require("./additional");
|
|
1
|
+
const log = require("not-log")(module, "not-node//init//env");
|
|
3
2
|
|
|
4
3
|
module.exports = class InitENV {
|
|
5
4
|
static getProxyPort(config) {
|
|
@@ -21,9 +20,9 @@ module.exports = class InitENV {
|
|
|
21
20
|
return name;
|
|
22
21
|
}
|
|
23
22
|
|
|
24
|
-
async run({ config, options, master }) {
|
|
23
|
+
async run({ config, options, master, emit }) {
|
|
25
24
|
log.info("Setting up server environment variables...");
|
|
26
|
-
await
|
|
25
|
+
await emit("env.pre", { config, options, master });
|
|
27
26
|
config.set(
|
|
28
27
|
"staticPath",
|
|
29
28
|
master.getAbsolutePath(config.get("path:static") || "static")
|
|
@@ -45,6 +44,6 @@ module.exports = class InitENV {
|
|
|
45
44
|
log.log("wsPath", master.getAbsolutePath(config.get("path:ws")));
|
|
46
45
|
config.set("wsPath", master.getAbsolutePath(config.get("path:ws")));
|
|
47
46
|
}
|
|
48
|
-
await
|
|
47
|
+
await emit("env.post", { config, options, master });
|
|
49
48
|
}
|
|
50
49
|
};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
const
|
|
2
|
-
const Log = require("not-log")(module, "not-node//init");
|
|
1
|
+
const Log = require("not-log")(module, "not-node//init//express");
|
|
3
2
|
|
|
4
3
|
module.exports = class InitExpress {
|
|
5
4
|
static requestLogging({ /*config, options, */ master }) {
|
|
@@ -9,7 +8,7 @@ module.exports = class InitExpress {
|
|
|
9
8
|
});
|
|
10
9
|
}
|
|
11
10
|
|
|
12
|
-
async run({ options, config, master }) {
|
|
11
|
+
async run({ options, config, master, emit }) {
|
|
13
12
|
Log.info("Init express app...");
|
|
14
13
|
await emit("express.pre", { options, config, master });
|
|
15
14
|
//express
|
|
File without changes
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
const log = require("not-log")(module, "not-node//init");
|
|
1
|
+
const log = require("not-log")(module, "not-node//init//http");
|
|
2
2
|
const fs = require("fs");
|
|
3
|
-
const ADDS = require("./additional");
|
|
4
3
|
|
|
5
4
|
module.exports = class InitHTTP {
|
|
6
5
|
listenPromise({ config, master }) {
|
|
@@ -61,13 +60,13 @@ module.exports = class InitHTTP {
|
|
|
61
60
|
return config.get("ssl:enabled") === true;
|
|
62
61
|
}
|
|
63
62
|
|
|
64
|
-
async run({ options, config, master }) {
|
|
65
|
-
await
|
|
63
|
+
async run({ options, config, master, emit }) {
|
|
64
|
+
await emit("http.pre", { options, config, master });
|
|
66
65
|
if (InitHTTP.isSecure({ config })) {
|
|
67
66
|
await this.runHTTPS({ options, config, master });
|
|
68
67
|
} else {
|
|
69
68
|
await this.runHTTP({ options, config, master });
|
|
70
69
|
}
|
|
71
|
-
await
|
|
70
|
+
await emit("http.post", { options, config, master });
|
|
72
71
|
}
|
|
73
72
|
};
|
|
File without changes
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
const log = require("not-log")(module, "not-node//init");
|
|
2
|
-
const ADDS = require("./additional");
|
|
1
|
+
const log = require("not-log")(module, "not-node//init//middleware");
|
|
3
2
|
|
|
4
3
|
module.exports = class InitMiddleware {
|
|
5
|
-
async run({ config, options, master }) {
|
|
4
|
+
async run({ config, options, master, emit }) {
|
|
6
5
|
log.info("Setting up middlewares...");
|
|
7
|
-
await
|
|
6
|
+
await emit("middleware.pre", { config, options, master });
|
|
8
7
|
const input = config.get("middleware");
|
|
9
8
|
if (input) {
|
|
10
9
|
for (let ware in input) {
|
|
@@ -22,6 +21,6 @@ module.exports = class InitMiddleware {
|
|
|
22
21
|
}
|
|
23
22
|
}
|
|
24
23
|
}
|
|
25
|
-
await
|
|
24
|
+
await emit("middleware.post", { config, options, master });
|
|
26
25
|
}
|
|
27
26
|
};
|
|
File without changes
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
const emit = require("./additional").run;
|
|
2
1
|
const log = require("not-log")(module, "RateLimiter");
|
|
3
|
-
const { partCopyObj } = require("
|
|
2
|
+
const { partCopyObj } = require("../../common");
|
|
4
3
|
|
|
5
4
|
const DEFAULT_OPTIONS = {
|
|
6
5
|
keyPrefix: "rateLimiterMiddleware",
|
|
@@ -23,7 +22,7 @@ module.exports = class InitRateLimiter {
|
|
|
23
22
|
};
|
|
24
23
|
}
|
|
25
24
|
|
|
26
|
-
async run({ config, master }) {
|
|
25
|
+
async run({ config, master, emit }) {
|
|
27
26
|
await emit("rateLimiter.pre", { config, master });
|
|
28
27
|
const rateLimiter = InitRateLimiter.createRateLimiter({
|
|
29
28
|
config,
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const log = require("not-log")(module, "not-node//init//redlock");
|
|
2
|
+
const { default: Redlock, ResourceLockedError } = require("redlock");
|
|
3
|
+
const { notError } = require("not-error");
|
|
4
|
+
|
|
5
|
+
const DEFAULT_CONFIG = {
|
|
6
|
+
driftFactor: 0.01, // multiplied by lock ttl to determine drift time
|
|
7
|
+
retryCount: 10,
|
|
8
|
+
retryDelay: 200, // time in ms
|
|
9
|
+
retryJitter: 200, // time in ms
|
|
10
|
+
automaticExtensionThreshold: 500, // time in ms
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
module.exports = class InitDBRedlock {
|
|
14
|
+
static async initLocker({ master, alias, redisClientAlias, config }) {
|
|
15
|
+
log.info("Setting up ioredis locker...");
|
|
16
|
+
const redisClient = master.getEnv(`db.${redisClientAlias}`);
|
|
17
|
+
const redlockConfig = config.get(`db.${alias}`);
|
|
18
|
+
const redlock = new Redlock(
|
|
19
|
+
[redisClient],
|
|
20
|
+
redlockConfig || DEFAULT_CONFIG
|
|
21
|
+
);
|
|
22
|
+
redlock.on("error", (error) => {
|
|
23
|
+
// Ignore cases where a resource is explicitly marked as locked on a client.
|
|
24
|
+
if (error instanceof ResourceLockedError) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
// Log all other errors.
|
|
28
|
+
log.error(error);
|
|
29
|
+
master.getApp().report(new notError("Redlock failed", {}, error));
|
|
30
|
+
});
|
|
31
|
+
master.setEnv(`db.${alias}`, redlock);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async run({ master, config, emit, options }) {
|
|
35
|
+
await emit("redlock.pre", { config, options, master });
|
|
36
|
+
await InitDBRedlock.initLocker({
|
|
37
|
+
config,
|
|
38
|
+
master,
|
|
39
|
+
alias: "redlock",
|
|
40
|
+
redisClientAlias: "ioredis",
|
|
41
|
+
});
|
|
42
|
+
await emit("redlock.post", { config, options, master });
|
|
43
|
+
}
|
|
44
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
const serveStatic = require("serve-static");
|
|
4
|
-
const log = require("not-log")(module, "not-node//init");
|
|
4
|
+
const log = require("not-log")(module, "not-node//init//routes");
|
|
5
5
|
const { notError, notValidationError, notRequestError } = require("not-error");
|
|
6
6
|
|
|
7
7
|
module.exports = class InitRoutes {
|
|
@@ -16,9 +16,9 @@ module.exports = class InitSessions {
|
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
async run({ master, config, options }) {
|
|
19
|
+
async run({ master, config, options, emit }) {
|
|
20
20
|
const conf = config.get("session");
|
|
21
21
|
const Constructor = InitSessions.getConstructor(conf);
|
|
22
|
-
await new Constructor().run({ master, config, options, conf });
|
|
22
|
+
await new Constructor().run({ master, config, options, conf, emit });
|
|
23
23
|
}
|
|
24
24
|
};
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
const { notError } = require("not-error");
|
|
2
|
-
const log = require("not-log")(module, "not-node//init");
|
|
3
|
-
const ADDS = require("../additional");
|
|
2
|
+
const log = require("not-log")(module, "not-node//init//sessions//mongoose");
|
|
4
3
|
|
|
5
4
|
module.exports = class InitSessionsMongo {
|
|
6
5
|
static createStore({ config, master, expressSession }) {
|
|
@@ -29,10 +28,10 @@ module.exports = class InitSessionsMongo {
|
|
|
29
28
|
return store;
|
|
30
29
|
}
|
|
31
30
|
|
|
32
|
-
async run({ config, options, master }) {
|
|
31
|
+
async run({ config, options, master, emit }) {
|
|
33
32
|
const expressSession = require("express-session");
|
|
34
33
|
log.info("Setting up user sessions handler(mongoose)...");
|
|
35
|
-
await
|
|
34
|
+
await emit("sessions.pre", { config, options, master });
|
|
36
35
|
master.getServer().use(
|
|
37
36
|
expressSession({
|
|
38
37
|
secret: config.get("session:secret"),
|
|
@@ -47,6 +46,6 @@ module.exports = class InitSessionsMongo {
|
|
|
47
46
|
}),
|
|
48
47
|
})
|
|
49
48
|
);
|
|
50
|
-
await
|
|
49
|
+
await emit("sessions.post", { config, options, master });
|
|
51
50
|
}
|
|
52
51
|
};
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
const log = require("not-log")(module, "not-node//init");
|
|
2
|
-
const ADDS = require("../additional");
|
|
1
|
+
const log = require("not-log")(module, "not-node//init//sessions//ioredis");
|
|
3
2
|
|
|
4
3
|
const DEFAULT_CLIENT = "ioredis";
|
|
5
4
|
|
|
6
5
|
module.exports = class InitSessionsRedis {
|
|
7
|
-
async run({ config, options, master }) {
|
|
6
|
+
async run({ config, options, master, emit }) {
|
|
8
7
|
log.info("Setting up user sessions handler(redis)...");
|
|
9
|
-
await
|
|
8
|
+
await emit("sessions.pre", { config, options, master });
|
|
10
9
|
const expressSession = require("express-session");
|
|
11
10
|
const storeClient = config.get("session.client", DEFAULT_CLIENT);
|
|
12
11
|
const redisClient = master.getEnv(`db.${storeClient}`);
|
|
@@ -26,6 +25,6 @@ module.exports = class InitSessionsRedis {
|
|
|
26
25
|
}),
|
|
27
26
|
})
|
|
28
27
|
);
|
|
29
|
-
await
|
|
28
|
+
await emit("sessions.post", { config, options, master });
|
|
30
29
|
}
|
|
31
30
|
};
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
const path = require("path");
|
|
2
2
|
|
|
3
|
-
const ADDS = require("./additional");
|
|
4
|
-
|
|
5
3
|
const DEFAULT_ROLES = ["root", "admin", "client", "user", "guest"];
|
|
6
4
|
|
|
7
5
|
module.exports = class InitStatic {
|
|
@@ -40,8 +38,8 @@ module.exports = class InitStatic {
|
|
|
40
38
|
};
|
|
41
39
|
}
|
|
42
40
|
|
|
43
|
-
async run({ config, options, master }) {
|
|
44
|
-
await
|
|
41
|
+
async run({ config, options, master, emit }) {
|
|
42
|
+
await emit("static.pre", { config, options, master });
|
|
45
43
|
master.getServer().use(
|
|
46
44
|
"/front/(:role).js",
|
|
47
45
|
InitStatic.createStaticFrontServer("js", {
|
|
@@ -58,6 +56,6 @@ module.exports = class InitStatic {
|
|
|
58
56
|
master,
|
|
59
57
|
})
|
|
60
58
|
);
|
|
61
|
-
await
|
|
59
|
+
await emit("static.post", { config, options, master });
|
|
62
60
|
}
|
|
63
61
|
};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
const log = require("not-log")(module, "not-node//init");
|
|
2
|
-
const ADDS = require("./additional");
|
|
1
|
+
const log = require("not-log")(module, "not-node//init//template");
|
|
3
2
|
|
|
4
3
|
const DEFAULT = {
|
|
5
4
|
views: "views",
|
|
@@ -12,12 +11,12 @@ module.exports = class InitTemplate {
|
|
|
12
11
|
return val || DEFAULT;
|
|
13
12
|
}
|
|
14
13
|
|
|
15
|
-
async run({ config, options, master }) {
|
|
14
|
+
async run({ config, options, master, emit }) {
|
|
16
15
|
const input = InitTemplate.loadConfig({ config });
|
|
17
16
|
log.info("Setting up template (" + input.engine + ") engine...");
|
|
18
|
-
await
|
|
17
|
+
await emit("template.pre", { config, options, master, input });
|
|
19
18
|
master.getServer().set("views", master.getAbsolutePath(input.views));
|
|
20
19
|
master.getServer().set("view engine", input.engine);
|
|
21
|
-
await
|
|
20
|
+
await emit("template.post", { config, options, master });
|
|
22
21
|
}
|
|
23
22
|
};
|
|
@@ -1,24 +1,25 @@
|
|
|
1
|
-
const initEnv = require("./env");
|
|
2
|
-
const initDB = require("./db");
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const
|
|
1
|
+
const initEnv = require("./lib/env");
|
|
2
|
+
const initDB = require("./lib/db");
|
|
3
|
+
const InitDBRedlock = require("./lib/redlock");
|
|
4
|
+
const initExpress = require("./lib/express");
|
|
5
|
+
const initCompression = require("./lib/compression");
|
|
6
|
+
const initSecurity = require("./lib/security");
|
|
7
|
+
const initBodyparser = require("./lib/bodyparser");
|
|
8
|
+
const initMethodOverride = require("./lib/methodoverride");
|
|
9
|
+
const initFileupload = require("./lib/fileupload");
|
|
10
|
+
const initNotApp = require("./lib/app");
|
|
11
|
+
const initSessions = require("./lib/sessions");
|
|
12
|
+
const initTemplate = require("./lib/template");
|
|
13
|
+
const initCORS = require("./lib/cors");
|
|
13
14
|
//const initCore = require('./core');
|
|
14
|
-
const initMiddleware = require("./middleware");
|
|
15
|
-
const initStatic = require("./static");
|
|
16
|
-
const initRoutes = require("./routes");
|
|
17
|
-
const initRateLimiter = require("./rateLimiter");
|
|
18
|
-
const initModules = require("./modules");
|
|
19
|
-
const initInformer = require("./informer");
|
|
20
|
-
const initHTTP = require("./http");
|
|
21
|
-
const initMonitoring = require("./monitoring");
|
|
15
|
+
const initMiddleware = require("./lib/middleware");
|
|
16
|
+
const initStatic = require("./lib/static");
|
|
17
|
+
const initRoutes = require("./lib/routes");
|
|
18
|
+
const initRateLimiter = require("./lib/rateLimiter");
|
|
19
|
+
const initModules = require("./lib/modules");
|
|
20
|
+
const initInformer = require("./lib/informer");
|
|
21
|
+
const initHTTP = require("./lib/http");
|
|
22
|
+
const initMonitoring = require("./lib/monitoring");
|
|
22
23
|
|
|
23
24
|
module.exports = [
|
|
24
25
|
//creating set of variables derived from basic ones,
|
|
@@ -26,6 +27,8 @@ module.exports = [
|
|
|
26
27
|
initEnv,
|
|
27
28
|
//DB access drivers
|
|
28
29
|
initDB,
|
|
30
|
+
//locking mech based upon ioredis
|
|
31
|
+
InitDBRedlock,
|
|
29
32
|
//http(s) server
|
|
30
33
|
initExpress,
|
|
31
34
|
initRateLimiter,
|
package/src/model/default.js
CHANGED
|
@@ -386,7 +386,7 @@ function close() {
|
|
|
386
386
|
}
|
|
387
387
|
|
|
388
388
|
function saveNewVersion() {
|
|
389
|
-
return routine.update(this, { _id: this._id }, this.toObject());
|
|
389
|
+
return routine.update(this.constructor, { _id: this._id }, this.toObject());
|
|
390
390
|
}
|
|
391
391
|
|
|
392
392
|
module.exports.thisMethods = {
|
package/src/model/exceptions.js
CHANGED
|
@@ -7,13 +7,13 @@ class VersioningExceptionSameOldData extends notError {
|
|
|
7
7
|
}
|
|
8
8
|
module.exports.VersioningExceptionSameOldData = VersioningExceptionSameOldData;
|
|
9
9
|
|
|
10
|
-
class
|
|
10
|
+
class VersioningExceptionNoPpreviousVersions extends notError {
|
|
11
11
|
constructor() {
|
|
12
12
|
super("not-node:versioning_error_no_previous_versions");
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
|
-
module.exports.
|
|
16
|
-
|
|
15
|
+
module.exports.VersioningExceptionNoPpreviousVersions =
|
|
16
|
+
VersioningExceptionNoPpreviousVersions;
|
|
17
17
|
|
|
18
18
|
class IncrementExceptionIDGeneratorRebaseFailed extends notError {
|
|
19
19
|
constructor() {
|
package/src/model/routine.js
CHANGED
|
@@ -2,99 +2,153 @@
|
|
|
2
2
|
|
|
3
3
|
const incrementNext = require("./increment");
|
|
4
4
|
const { DBExceptionUpdateOneWasNotSuccessful } = require("../exceptions/db");
|
|
5
|
+
|
|
5
6
|
//const { updateResponseSuccess } = require("./utils");
|
|
6
7
|
class ModelRoutine {
|
|
7
|
-
static incremental(
|
|
8
|
-
return
|
|
8
|
+
static incremental(ModelConstructor) {
|
|
9
|
+
return ModelConstructor.schema.statics.__incField;
|
|
9
10
|
}
|
|
10
11
|
|
|
11
|
-
static versioning(
|
|
12
|
-
return
|
|
12
|
+
static versioning(ModelConstructor) {
|
|
13
|
+
return ModelConstructor.schema.statics.__versioning;
|
|
13
14
|
}
|
|
14
15
|
|
|
15
|
-
static addWithoutVersion(
|
|
16
|
-
return new
|
|
16
|
+
static addWithoutVersion(ModelConstructor, data) {
|
|
17
|
+
return new ModelConstructor(data).save();
|
|
17
18
|
}
|
|
18
19
|
|
|
19
|
-
static async addWithVersion(
|
|
20
|
+
static async addWithVersion(ModelConstructor, data) {
|
|
20
21
|
data.__latest = true;
|
|
21
|
-
const item = await new
|
|
22
|
-
return await
|
|
22
|
+
const item = await new ModelConstructor(data).save();
|
|
23
|
+
return await ModelConstructor.saveVersion(item._id);
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
static async add(
|
|
26
|
-
if (ModelRoutine.incremental(
|
|
26
|
+
static async add(ModelConstructor, data) {
|
|
27
|
+
if (ModelRoutine.incremental(ModelConstructor)) {
|
|
27
28
|
const modelID = await incrementNext.next(
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
ModelConstructor.__incModel,
|
|
30
|
+
ModelConstructor.__incFilter,
|
|
30
31
|
data
|
|
31
32
|
);
|
|
32
|
-
data[
|
|
33
|
-
if (ModelRoutine.versioning(
|
|
34
|
-
return await ModelRoutine.addWithVersion(
|
|
33
|
+
data[ModelConstructor.__incField] = modelID;
|
|
34
|
+
if (ModelRoutine.versioning(ModelConstructor)) {
|
|
35
|
+
return await ModelRoutine.addWithVersion(
|
|
36
|
+
ModelConstructor,
|
|
37
|
+
data
|
|
38
|
+
);
|
|
35
39
|
} else {
|
|
36
|
-
return await ModelRoutine.addWithoutVersion(
|
|
40
|
+
return await ModelRoutine.addWithoutVersion(
|
|
41
|
+
ModelConstructor,
|
|
42
|
+
data
|
|
43
|
+
);
|
|
37
44
|
}
|
|
38
45
|
} else {
|
|
39
|
-
if (ModelRoutine.versioning(
|
|
40
|
-
return await ModelRoutine.addWithVersion(
|
|
46
|
+
if (ModelRoutine.versioning(ModelConstructor)) {
|
|
47
|
+
return await ModelRoutine.addWithVersion(
|
|
48
|
+
ModelConstructor,
|
|
49
|
+
data
|
|
50
|
+
);
|
|
41
51
|
} else {
|
|
42
|
-
return await ModelRoutine.addWithoutVersion(
|
|
52
|
+
return await ModelRoutine.addWithoutVersion(
|
|
53
|
+
ModelConstructor,
|
|
54
|
+
data
|
|
55
|
+
);
|
|
43
56
|
}
|
|
44
57
|
}
|
|
45
58
|
}
|
|
46
59
|
|
|
47
|
-
static async update(
|
|
48
|
-
if ("_id" in data) delete data._id;
|
|
49
|
-
if (ModelRoutine.versioning(
|
|
50
|
-
return ModelRoutine.updateWithVersion(
|
|
60
|
+
static async update(ModelConstructor, filter, data) {
|
|
61
|
+
if (data && "_id" in data) delete data._id;
|
|
62
|
+
if (ModelRoutine.versioning(ModelConstructor)) {
|
|
63
|
+
return ModelRoutine.updateWithVersion(
|
|
64
|
+
ModelConstructor,
|
|
65
|
+
filter,
|
|
66
|
+
data
|
|
67
|
+
);
|
|
51
68
|
} else {
|
|
52
|
-
return ModelRoutine.updateWithoutVersion(
|
|
69
|
+
return ModelRoutine.updateWithoutVersion(
|
|
70
|
+
ModelConstructor,
|
|
71
|
+
filter,
|
|
72
|
+
data
|
|
73
|
+
);
|
|
53
74
|
}
|
|
54
75
|
}
|
|
55
76
|
|
|
56
|
-
static updateWithoutVersion(
|
|
57
|
-
return
|
|
58
|
-
|
|
77
|
+
static updateWithoutVersion(ModelConstructor, filter, data) {
|
|
78
|
+
return ModelConstructor.findOneAndUpdate(
|
|
79
|
+
filter,
|
|
80
|
+
{ $set: data },
|
|
81
|
+
{
|
|
59
82
|
returnOriginal: false,
|
|
60
|
-
returnDocument: "
|
|
83
|
+
returnDocument: "after",
|
|
61
84
|
new: true,
|
|
62
|
-
}
|
|
63
|
-
|
|
85
|
+
}
|
|
86
|
+
)
|
|
87
|
+
.exec()
|
|
88
|
+
.then((result) => {
|
|
89
|
+
if (result) {
|
|
90
|
+
return result;
|
|
91
|
+
} else {
|
|
92
|
+
throw new Error("updateWithoutVersion FAILED");
|
|
93
|
+
}
|
|
94
|
+
});
|
|
64
95
|
}
|
|
65
96
|
|
|
66
|
-
static async updateWithVersion(
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
.
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
97
|
+
static async updateWithVersion(ModelConstructor, filter, data) {
|
|
98
|
+
let result;
|
|
99
|
+
const session = await ModelConstructor.startSession();
|
|
100
|
+
await session.withTransaction(async () => {
|
|
101
|
+
filter.__latest = true;
|
|
102
|
+
filter.__closed = false;
|
|
103
|
+
if (ModelConstructor.findOneAndUpdate) {
|
|
104
|
+
const updateResult = await ModelConstructor.findOneAndUpdate(
|
|
105
|
+
filter,
|
|
106
|
+
{ $set: data },
|
|
107
|
+
{
|
|
108
|
+
returnOriginal: false,
|
|
109
|
+
returnDocument: "after",
|
|
110
|
+
new: true,
|
|
111
|
+
}
|
|
112
|
+
);
|
|
113
|
+
if (updateResult) {
|
|
114
|
+
result = await ModelConstructor.saveVersion(
|
|
115
|
+
ModelConstructor,
|
|
116
|
+
updateResult._id
|
|
117
|
+
);
|
|
118
|
+
} else {
|
|
119
|
+
throw new DBExceptionUpdateOneWasNotSuccessful();
|
|
120
|
+
}
|
|
121
|
+
} else {
|
|
122
|
+
throw new DBExceptionUpdateOneWasNotSuccessful();
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
session.endSession();
|
|
126
|
+
return result;
|
|
81
127
|
}
|
|
82
128
|
|
|
83
|
-
static async updateMany(
|
|
129
|
+
static async updateMany(ModelConstructor, filter, data) {
|
|
84
130
|
if ("_id" in data) delete data._id;
|
|
85
|
-
if (ModelRoutine.versioning(
|
|
86
|
-
return ModelRoutine.updateManyWithVersion(
|
|
131
|
+
if (ModelRoutine.versioning(ModelConstructor)) {
|
|
132
|
+
return ModelRoutine.updateManyWithVersion(
|
|
133
|
+
ModelConstructor,
|
|
134
|
+
filter,
|
|
135
|
+
data
|
|
136
|
+
);
|
|
87
137
|
} else {
|
|
88
|
-
return ModelRoutine.updateManyWithoutVersion(
|
|
138
|
+
return ModelRoutine.updateManyWithoutVersion(
|
|
139
|
+
ModelConstructor,
|
|
140
|
+
filter,
|
|
141
|
+
data
|
|
142
|
+
);
|
|
89
143
|
}
|
|
90
144
|
}
|
|
91
145
|
|
|
92
|
-
static updateManyWithoutVersion(
|
|
93
|
-
return
|
|
146
|
+
static updateManyWithoutVersion(ModelConstructor, filter, data) {
|
|
147
|
+
return ModelConstructor.updateMany(filter, data);
|
|
94
148
|
}
|
|
95
149
|
|
|
96
|
-
static async updateManyWithVersion(
|
|
97
|
-
const list = await
|
|
150
|
+
static async updateManyWithVersion(ModelConstructor, filter, data) {
|
|
151
|
+
const list = await ModelConstructor.find({
|
|
98
152
|
__closed: false,
|
|
99
153
|
__latest: true,
|
|
100
154
|
...filter,
|
|
@@ -102,7 +156,7 @@ class ModelRoutine {
|
|
|
102
156
|
return await Promise.allSettled(
|
|
103
157
|
list.map((item) => {
|
|
104
158
|
return ModelRoutine.updateWithVersion(
|
|
105
|
-
|
|
159
|
+
ModelConstructor,
|
|
106
160
|
{ _id: item._id },
|
|
107
161
|
data
|
|
108
162
|
);
|
package/src/model/versioning.js
CHANGED
|
@@ -11,8 +11,12 @@ const TECH_FIELDS = [
|
|
|
11
11
|
"__closed",
|
|
12
12
|
];
|
|
13
13
|
|
|
14
|
+
function toObject(obj) {
|
|
15
|
+
return obj.toObject ? obj.toObject() : obj;
|
|
16
|
+
}
|
|
17
|
+
|
|
14
18
|
const {
|
|
15
|
-
|
|
19
|
+
VersioningExceptioNoPpreviousVersions,
|
|
16
20
|
VersioningExceptionSameOldData,
|
|
17
21
|
} = require("./exceptions.js");
|
|
18
22
|
|
|
@@ -36,7 +40,7 @@ class ModelVersioning {
|
|
|
36
40
|
doc.__versions = [];
|
|
37
41
|
}
|
|
38
42
|
doc.__versions.unshift(version._id); //первая в массиве последняя [3,2,1,0]
|
|
39
|
-
|
|
43
|
+
doc.markModified("__versions");
|
|
40
44
|
}
|
|
41
45
|
|
|
42
46
|
static stripTechData(a) {
|
|
@@ -47,7 +51,7 @@ class ModelVersioning {
|
|
|
47
51
|
}
|
|
48
52
|
|
|
49
53
|
static jsonCopy(a) {
|
|
50
|
-
return JSON.parse(JSON.stringify(a));
|
|
54
|
+
return JSON.parse(JSON.stringify(toObject(a)));
|
|
51
55
|
}
|
|
52
56
|
|
|
53
57
|
static isThisDocsDifferent(a, b) {
|
|
@@ -61,20 +65,20 @@ class ModelVersioning {
|
|
|
61
65
|
|
|
62
66
|
/**
|
|
63
67
|
* Compares latest version in __versions list in data with data
|
|
64
|
-
* @param {MongooseModel}
|
|
68
|
+
* @param {MongooseModel} ModelConstructor model of data
|
|
65
69
|
* @param {Object} data data to save
|
|
66
70
|
* @return {boolean} if data differs from latest version
|
|
67
71
|
*/
|
|
68
|
-
static async isNew(
|
|
72
|
+
static async isNew(ModelConstructor, data) {
|
|
69
73
|
let latestId = ModelVersioning.getLatestVersionId(data);
|
|
70
|
-
let previous = await
|
|
74
|
+
let previous = await ModelConstructor.findOne({ _id: latestId });
|
|
71
75
|
if (typeof previous !== "undefined" && previous !== null) {
|
|
72
76
|
return ModelVersioning.isThisDocsDifferent(
|
|
73
77
|
data,
|
|
74
|
-
|
|
78
|
+
toObject(previous)
|
|
75
79
|
);
|
|
76
80
|
} else {
|
|
77
|
-
throw new
|
|
81
|
+
throw new VersioningExceptioNoPpreviousVersions();
|
|
78
82
|
}
|
|
79
83
|
}
|
|
80
84
|
|
|
@@ -82,28 +86,26 @@ class ModelVersioning {
|
|
|
82
86
|
* Saves current version to versions archive, updates current version versioning tags
|
|
83
87
|
* @param {ObjectId} id current version _id (just saved version)
|
|
84
88
|
* @param {Object} data data to save
|
|
85
|
-
* @param {MongooseModel}
|
|
89
|
+
* @param {MongooseModel} ModelConstructor model to use
|
|
86
90
|
* @return {Promise<MongooseDocument>} current version with updated versioning tags
|
|
87
91
|
*/
|
|
88
|
-
static async saveVersion(id, data,
|
|
92
|
+
static async saveVersion(id, data, ModelConstructor) {
|
|
89
93
|
let preservedVersionNumber = ModelVersioning.extractVersionNumber(data),
|
|
90
94
|
preservedVersionsList = [...data.__versions]; //making copy
|
|
91
|
-
let different = await ModelVersioning.isNew(
|
|
95
|
+
let different = await ModelVersioning.isNew(ModelConstructor, data);
|
|
92
96
|
if (different) {
|
|
93
97
|
//it's not latest version, it's archived copy
|
|
94
98
|
delete data.__latest;
|
|
95
99
|
//saves to archive with preserved data
|
|
96
|
-
let versionDoc = new
|
|
100
|
+
let versionDoc = new ModelConstructor(data);
|
|
97
101
|
versionDoc.__version = preservedVersionNumber;
|
|
98
102
|
versionDoc.__versions = preservedVersionsList;
|
|
99
103
|
await versionDoc.save();
|
|
100
104
|
//updating history
|
|
101
|
-
let originalDoc = await
|
|
105
|
+
let originalDoc = await ModelConstructor.findOne({ _id: id });
|
|
102
106
|
originalDoc.__version = preservedVersionNumber + 1;
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
versionDoc
|
|
106
|
-
);
|
|
107
|
+
ModelVersioning.addVersionToHistory(originalDoc, versionDoc);
|
|
108
|
+
return await originalDoc.save();
|
|
107
109
|
}
|
|
108
110
|
throw new VersioningExceptionSameOldData();
|
|
109
111
|
}
|
|
@@ -112,24 +114,24 @@ class ModelVersioning {
|
|
|
112
114
|
* Saves first version. Run AFTER doing .save() on document.
|
|
113
115
|
* @param {ObjectId} id current version _id (just saved version)
|
|
114
116
|
* @param {Object} data data to save
|
|
115
|
-
* @param {MongooseModel}
|
|
117
|
+
* @param {MongooseModel} ModelConstructor model to use
|
|
116
118
|
* @return {Promise<MongooseDocument>} current version with updated versions tags
|
|
117
119
|
*/
|
|
118
|
-
static async saveFirstVersion(id, data,
|
|
120
|
+
static async saveFirstVersion(id, data, ModelConstructor) {
|
|
119
121
|
//it's not latest version, it's archived copy
|
|
120
122
|
delete data.__latest;
|
|
121
123
|
//saves to archive
|
|
122
|
-
let versionDoc = new
|
|
124
|
+
let versionDoc = new ModelConstructor(data);
|
|
123
125
|
await versionDoc.save();
|
|
124
126
|
//retrieving original
|
|
125
|
-
|
|
127
|
+
|
|
128
|
+
//const findById = getFunc(thisModel,'findById');
|
|
129
|
+
let originalDoc = await ModelConstructor.findOne({ _id: id });
|
|
126
130
|
//first version
|
|
127
131
|
originalDoc.__version = 1;
|
|
128
132
|
//adding to history
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
versionDoc
|
|
132
|
-
);
|
|
133
|
+
ModelVersioning.addVersionToHistory(originalDoc, versionDoc);
|
|
134
|
+
return await originalDoc.save();
|
|
133
135
|
}
|
|
134
136
|
|
|
135
137
|
/**
|
|
@@ -139,14 +141,14 @@ class ModelVersioning {
|
|
|
139
141
|
* @param {MongooseModel} doc document to save
|
|
140
142
|
* @return {Promise<MongooseDocument>} current version with updated versions tags
|
|
141
143
|
*/
|
|
142
|
-
static saveDiff(doc) {
|
|
143
|
-
let data =
|
|
144
|
+
static saveDiff(ModelConstructor, doc) {
|
|
145
|
+
let data = toObject(doc),
|
|
144
146
|
id = data._id;
|
|
145
147
|
delete data._id;
|
|
146
148
|
if (ModelVersioning.versionsHistoryExists(data)) {
|
|
147
|
-
return ModelVersioning.saveVersion(id, data,
|
|
149
|
+
return ModelVersioning.saveVersion(id, data, ModelConstructor);
|
|
148
150
|
} else {
|
|
149
|
-
return ModelVersioning.saveFirstVersion(id, data,
|
|
151
|
+
return ModelVersioning.saveFirstVersion(id, data, ModelConstructor);
|
|
150
152
|
}
|
|
151
153
|
}
|
|
152
154
|
|
|
@@ -157,10 +159,10 @@ class ModelVersioning {
|
|
|
157
159
|
* add _id of copy to list of document.__versions
|
|
158
160
|
* and increment __version number
|
|
159
161
|
**/
|
|
160
|
-
static version(id) {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
162
|
+
static async version(id) {
|
|
163
|
+
const ModelConstructor = this;
|
|
164
|
+
const original = await ModelConstructor.findOne({ _id: id });
|
|
165
|
+
return await ModelVersioning.saveDiff(ModelConstructor, original);
|
|
164
166
|
}
|
|
165
167
|
}
|
|
166
168
|
|