@adaptivestone/framework 4.11.4 → 5.0.0-alpha.10
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/.eslintrc.cjs +41 -0
- package/CHANGELOG.md +52 -0
- package/Cli.js +5 -5
- package/cluster.js +5 -3
- package/commands/CreateUser.js +5 -3
- package/commands/Documentation.js +3 -3
- package/commands/DropIndex.js +2 -2
- package/commands/Generate.js +2 -2
- package/commands/GetOpenApiJson.js +3 -3
- package/commands/SyncIndexes.js +6 -4
- package/commands/migration/Create.js +4 -7
- package/commands/migration/Migrate.js +8 -4
- package/config/auth.js +3 -2
- package/config/http.js +1 -1
- package/config/i18n.js +1 -1
- package/config/ipDetector.js +14 -0
- package/config/log.js +1 -1
- package/config/mail.js +2 -2
- package/config/mongo.js +1 -1
- package/config/rateLimiter.js +1 -1
- package/config/redis.js +1 -1
- package/config/validate.js +1 -1
- package/controllers/Auth.js +5 -5
- package/controllers/Home.js +3 -3
- package/controllers/index.js +6 -4
- package/folderConfig.js +2 -3
- package/helpers/files.js +11 -7
- package/helpers/logger.js +2 -4
- package/helpers/redis/clearNamespace.js +1 -1
- package/helpers/yup.js +4 -5
- package/index.js +2 -2
- package/jsconfig.json +9 -0
- package/models/Migration.js +2 -2
- package/models/Sequence.js +2 -2
- package/models/User.js +5 -6
- package/modules/AbstractCommand.js +4 -3
- package/modules/AbstractConnector.js +2 -2
- package/modules/AbstractController.js +12 -7
- package/modules/AbstractModel.js +8 -5
- package/modules/Base.d.ts +4 -3
- package/modules/Base.js +2 -2
- package/modules/BaseCli.js +6 -4
- package/modules/Modules.test.js +2 -2
- package/package.json +16 -16
- package/server.d.ts +7 -5
- package/server.js +24 -17
- package/services/cache/Cache.d.ts +2 -2
- package/services/cache/Cache.js +6 -4
- package/services/documentation/DocumentationGenerator.js +3 -3
- package/services/http/HttpServer.js +16 -24
- package/services/http/middleware/AbstractMiddleware.js +3 -3
- package/services/http/middleware/Auth.js +2 -2
- package/services/http/middleware/Auth.test.js +1 -1
- package/services/http/middleware/Cors.js +2 -2
- package/services/http/middleware/Cors.test.js +1 -1
- package/services/http/middleware/GetUserByToken.js +3 -3
- package/services/http/middleware/GetUserByToken.test.js +1 -1
- package/services/http/middleware/I18n.js +5 -6
- package/services/http/middleware/I18n.test.js +1 -1
- package/services/http/middleware/IpDetector.js +59 -0
- package/services/http/middleware/IpDetector.test.js +143 -0
- package/services/http/middleware/Pagination.js +3 -3
- package/services/http/middleware/PrepareAppInfo.js +2 -2
- package/services/http/middleware/PrepareAppInfo.test.js +1 -1
- package/services/http/middleware/RateLimiter.js +14 -9
- package/services/http/middleware/RateLimiter.test.js +5 -3
- package/services/http/middleware/RequestLogger.js +2 -2
- package/services/http/middleware/RequestParser.js +7 -5
- package/services/http/middleware/RequestParser.test.js +17 -10
- package/services/http/middleware/Role.js +2 -2
- package/services/http/middleware/Role.test.js +1 -1
- package/services/messaging/email/index.js +28 -29
- package/services/messaging/index.js +2 -4
- package/services/validate/ValidateService.js +5 -5
- package/services/validate/ValidateService.test.js +4 -4
- package/services/validate/drivers/AbstractValidator.js +2 -2
- package/services/validate/drivers/CustomValidator.js +3 -4
- package/services/validate/drivers/YupValidator.js +3 -3
- package/tests/globalSetupVitest.js +1 -1
- package/tests/setup.js +10 -9
- package/tests/setupVitest.js +6 -7
- package/types/TFoldersConfig.d.ts +0 -2
- package/services/http/middleware/StaticFiles.js +0 -60
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import Base from './Base.js';
|
|
2
2
|
|
|
3
3
|
class AbstractConnector extends Base {
|
|
4
4
|
static get loggerGroup() {
|
|
@@ -6,4 +6,4 @@ class AbstractConnector extends Base {
|
|
|
6
6
|
}
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
export default AbstractConnector;
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/* eslint-disable no-restricted-syntax */
|
|
2
2
|
/* eslint-disable guard-for-in */
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
import express from 'express';
|
|
4
|
+
|
|
5
|
+
import Base from './Base.js';
|
|
6
|
+
import GetUserByToken from '../services/http/middleware/GetUserByToken.js';
|
|
7
|
+
import Auth from '../services/http/middleware/Auth.js';
|
|
8
|
+
import ValidateService from '../services/validate/ValidateService.js';
|
|
9
|
+
import DocumentationGenerator from '../services/documentation/DocumentationGenerator.js';
|
|
9
10
|
/**
|
|
10
11
|
* Abstract controller. You should extend any controller from them.
|
|
11
12
|
* Place you cintroller into controller folder and it be inited in auto way.
|
|
@@ -24,10 +25,12 @@ class AbstractController extends Base {
|
|
|
24
25
|
const { routes } = this;
|
|
25
26
|
let httpPath = this.getHttpPath();
|
|
26
27
|
|
|
28
|
+
// @ts-ignore
|
|
27
29
|
if (this.getExpressPath) {
|
|
28
30
|
this.logger.warn(
|
|
29
31
|
`getExpressPath deprecated. Please use getHttpPath instead. Will be removed on v5`,
|
|
30
32
|
);
|
|
33
|
+
// @ts-ignore
|
|
31
34
|
httpPath = this.getExpressPath();
|
|
32
35
|
}
|
|
33
36
|
|
|
@@ -57,6 +60,7 @@ class AbstractController extends Base {
|
|
|
57
60
|
httpPath,
|
|
58
61
|
);
|
|
59
62
|
const middlewaresInfo = this.parseMiddlewares(
|
|
63
|
+
// @ts-ignore
|
|
60
64
|
this.constructor.middleware,
|
|
61
65
|
httpPath,
|
|
62
66
|
);
|
|
@@ -369,6 +373,7 @@ class AbstractController extends Base {
|
|
|
369
373
|
* You should provide path relative to controller and then array of middlewares to apply.
|
|
370
374
|
* Order is matter.
|
|
371
375
|
* Be default path apply to ANY' method, but you can preattach 'METHOD' into patch to scope patch to this METHOD
|
|
376
|
+
* @returns {Map<string, Array<AbstractMiddleware | [Function, ...any]>>}
|
|
372
377
|
* @example
|
|
373
378
|
* return new Map([
|
|
374
379
|
* ['/*', [GetUserByToken]] // for any method for this controller
|
|
@@ -405,4 +410,4 @@ class AbstractController extends Base {
|
|
|
405
410
|
}
|
|
406
411
|
}
|
|
407
412
|
|
|
408
|
-
|
|
413
|
+
export default AbstractController;
|
package/modules/AbstractModel.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import mongoose from 'mongoose';
|
|
2
|
+
import Base from './Base.js';
|
|
3
3
|
|
|
4
4
|
class AbstractModel extends Base {
|
|
5
5
|
/**
|
|
6
|
-
* @param {import('../server')} app //TODO change to *.d.ts as this is a Server, not app
|
|
6
|
+
* @param {import('../server.js').default['app']} app //TODO change to *.d.ts as this is a Server, not app
|
|
7
7
|
* @param function callback optional callback when connection ready
|
|
8
8
|
*/
|
|
9
9
|
constructor(app, callback = () => {}) {
|
|
10
10
|
super(app);
|
|
11
|
-
this.mongooseSchema = mongoose.Schema(this.modelSchema);
|
|
11
|
+
this.mongooseSchema = new mongoose.Schema(this.modelSchema);
|
|
12
12
|
mongoose.set('strictQuery', true);
|
|
13
13
|
this.mongooseSchema.set('timestamps', true);
|
|
14
14
|
this.mongooseSchema.set('minimize', false);
|
|
@@ -22,6 +22,9 @@ class AbstractModel extends Base {
|
|
|
22
22
|
);
|
|
23
23
|
if (!mongoose.connection.readyState) {
|
|
24
24
|
this.app.events.on('shutdown', async () => {
|
|
25
|
+
this.logger.verbose(
|
|
26
|
+
'Shutdown was called. Closing all mongoose connections',
|
|
27
|
+
);
|
|
25
28
|
for (const c of mongoose.connections) {
|
|
26
29
|
c.close(true);
|
|
27
30
|
}
|
|
@@ -59,4 +62,4 @@ class AbstractModel extends Base {
|
|
|
59
62
|
this.logger.verbose('Model have no hooks');
|
|
60
63
|
}
|
|
61
64
|
}
|
|
62
|
-
|
|
65
|
+
export default AbstractModel;
|
package/modules/Base.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import winston from 'winston';
|
|
2
|
-
import Server from '../server';
|
|
2
|
+
import Server from '../server.js';
|
|
3
|
+
import type { Dirent } from 'fs';
|
|
3
4
|
|
|
4
5
|
declare class Base {
|
|
5
6
|
app: Server['app'];
|
|
@@ -26,11 +27,11 @@ declare class Base {
|
|
|
26
27
|
getFilesPathWithInheritance(
|
|
27
28
|
internalFolder: string,
|
|
28
29
|
externalFolder: string,
|
|
29
|
-
): Promise<
|
|
30
|
+
): Promise<Dirent[]>;
|
|
30
31
|
|
|
31
32
|
/**
|
|
32
33
|
* Return logger group. Just to have all logs groupped logically
|
|
33
34
|
*/
|
|
34
35
|
static get loggerGroup(): string;
|
|
35
36
|
}
|
|
36
|
-
export
|
|
37
|
+
export default Base;
|
package/modules/Base.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import { getFilesPathWithInheritance } from '../helpers/files.js';
|
|
2
2
|
|
|
3
3
|
class Base {
|
|
4
4
|
#realLogger = null;
|
|
@@ -50,4 +50,4 @@ class Base {
|
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
export default Base;
|
package/modules/BaseCli.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/* eslint-disable no-console */
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import * as url from 'node:url';
|
|
4
|
+
import Base from './Base.js';
|
|
4
5
|
|
|
5
6
|
class Cli extends Base {
|
|
6
7
|
constructor(server) {
|
|
@@ -13,8 +14,9 @@ class Cli extends Base {
|
|
|
13
14
|
if (Object.keys(this.commands).length) {
|
|
14
15
|
return true;
|
|
15
16
|
}
|
|
17
|
+
const dirname = url.fileURLToPath(new URL('.', import.meta.url));
|
|
16
18
|
const commandsToLoad = await this.getFilesPathWithInheritance(
|
|
17
|
-
path.join(
|
|
19
|
+
path.join(dirname, '../commands'),
|
|
18
20
|
this.server.app.foldersConfig.commands,
|
|
19
21
|
);
|
|
20
22
|
for (const com of commandsToLoad) {
|
|
@@ -64,4 +66,4 @@ class Cli extends Base {
|
|
|
64
66
|
}
|
|
65
67
|
}
|
|
66
68
|
|
|
67
|
-
|
|
69
|
+
export default Cli;
|
package/modules/Modules.test.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import SomeController from '../controllers/test/SomeController';
|
|
3
|
-
import AbstractController from './AbstractController';
|
|
2
|
+
import SomeController from '../controllers/test/SomeController.js';
|
|
3
|
+
import AbstractController from './AbstractController.js';
|
|
4
4
|
|
|
5
5
|
describe('abstract controller methods', () => {
|
|
6
6
|
it('can get routes', async () => {
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adaptivestone/framework",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0-alpha.10",
|
|
4
4
|
"description": "Adaptive stone node js framework",
|
|
5
5
|
"main": "index.js",
|
|
6
|
+
"type": "module",
|
|
6
7
|
"engines": {
|
|
7
|
-
"node": ">=
|
|
8
|
+
"node": ">=20.12.0"
|
|
8
9
|
},
|
|
9
10
|
"repository": {
|
|
10
11
|
"type": "git",
|
|
@@ -12,14 +13,15 @@
|
|
|
12
13
|
},
|
|
13
14
|
"homepage": "https://framework.adaptivestone.com/",
|
|
14
15
|
"scripts": {
|
|
15
|
-
"dev": "
|
|
16
|
-
"prod": "
|
|
16
|
+
"dev": "node --watch ./index.js",
|
|
17
|
+
"prod": "node --watch ./cluster.js",
|
|
17
18
|
"test": "vitest run",
|
|
19
|
+
"t": "vitest --coverage=false --reporter=default",
|
|
18
20
|
"prettier": "prettier --check '**/*.(js|jsx|ts|tsx|json|css|scss|md)'",
|
|
19
21
|
"lint": "eslint '**/*.js'",
|
|
20
22
|
"lint:fix": "eslint '**/*.js' --fix",
|
|
21
23
|
"codestyle": "npm run prettier && npm run lint",
|
|
22
|
-
"prepare": "husky
|
|
24
|
+
"prepare": "husky",
|
|
23
25
|
"cli": "node cliCommand",
|
|
24
26
|
"benchmark": "h2load -n 10000 -c 50 -p 'http/1.1' http://localhost:3300/",
|
|
25
27
|
"benchmark2": "h2load -n 10000 -c 50 https://localhost:3300/",
|
|
@@ -29,40 +31,38 @@
|
|
|
29
31
|
"license": "MIT",
|
|
30
32
|
"dependencies": {
|
|
31
33
|
"deepmerge": "^4.2.2",
|
|
32
|
-
"dotenv": "^16.0.0",
|
|
33
34
|
"express": "^4.17.1",
|
|
34
35
|
"formidable": "^3.5.1",
|
|
35
36
|
"html-to-text": "^9.0.3",
|
|
36
37
|
"i18next": "^23.2.8",
|
|
37
38
|
"i18next-chained-backend": "^4.0.0",
|
|
38
39
|
"i18next-fs-backend": "^2.0.0",
|
|
39
|
-
"juice": "^
|
|
40
|
-
"mime": "^
|
|
40
|
+
"juice": "^10.0.0",
|
|
41
|
+
"mime": "^4.0.0",
|
|
41
42
|
"minimist": "^1.2.5",
|
|
42
|
-
"mongoose": "^
|
|
43
|
+
"mongoose": "^8.0.0",
|
|
43
44
|
"nodemailer": "^6.6.3",
|
|
44
45
|
"nodemailer-sendmail-transport": "^1.0.2",
|
|
45
46
|
"nodemailer-stub-transport": "^1.1.0",
|
|
46
47
|
"pug": "^3.0.2",
|
|
47
|
-
"rate-limiter-flexible": "^
|
|
48
|
+
"rate-limiter-flexible": "^5.0.0",
|
|
48
49
|
"redis": "^4.3.1",
|
|
49
50
|
"winston": "^3.3.3",
|
|
50
51
|
"winston-transport-sentry-node": "^2.0.0",
|
|
51
52
|
"yup": "^1.0.0"
|
|
52
53
|
},
|
|
53
54
|
"devDependencies": {
|
|
54
|
-
"@vitest/coverage-v8": "^0.
|
|
55
|
+
"@vitest/coverage-v8": "^2.0.0",
|
|
55
56
|
"eslint": "^8.0.0",
|
|
56
57
|
"eslint-config-airbnb-base": "^15.0.0",
|
|
57
58
|
"eslint-config-prettier": "^9.0.0",
|
|
58
59
|
"eslint-plugin-prettier": "^5.0.0",
|
|
59
|
-
"eslint-plugin-vitest": "^0.
|
|
60
|
-
"husky": "^
|
|
60
|
+
"eslint-plugin-vitest": "^0.4.0",
|
|
61
|
+
"husky": "^9.0.0",
|
|
61
62
|
"lint-staged": "^15.0.0",
|
|
62
|
-
"mongodb-memory-server": "^
|
|
63
|
-
"nodemon": "^3.0.1",
|
|
63
|
+
"mongodb-memory-server": "^10.0.0",
|
|
64
64
|
"prettier": "^3.0.0",
|
|
65
|
-
"vitest": "^0.
|
|
65
|
+
"vitest": "^2.0.0"
|
|
66
66
|
},
|
|
67
67
|
"lint-staged": {
|
|
68
68
|
"**/*.{js,jsx,ts,tsx,json,css,scss,md}": [
|
package/server.d.ts
CHANGED
|
@@ -9,6 +9,8 @@ import BaseCli from './modules/BaseCli';
|
|
|
9
9
|
import Cache from './services/cache/Cache';
|
|
10
10
|
import winston from 'winston';
|
|
11
11
|
|
|
12
|
+
import HttpServer from './services/http/HttpServer.js';
|
|
13
|
+
|
|
12
14
|
type ServerConfig = {
|
|
13
15
|
folders: ExpandDeep<TFolderConfig>;
|
|
14
16
|
};
|
|
@@ -24,7 +26,7 @@ declare class Server {
|
|
|
24
26
|
events: EventEmitter;
|
|
25
27
|
get cache(): Server['cacheService'];
|
|
26
28
|
get logger(): winston.Logger;
|
|
27
|
-
httpServer: null;
|
|
29
|
+
httpServer: HttpServer | null;
|
|
28
30
|
controllerManager: null;
|
|
29
31
|
};
|
|
30
32
|
cacheService: Cache;
|
|
@@ -33,7 +35,7 @@ declare class Server {
|
|
|
33
35
|
configs: Map<string, {}>;
|
|
34
36
|
models: Map<string, MongooseModel<any>>;
|
|
35
37
|
};
|
|
36
|
-
cli:
|
|
38
|
+
cli: null | BaseCli;
|
|
37
39
|
|
|
38
40
|
/**
|
|
39
41
|
* Construct new server
|
|
@@ -68,7 +70,7 @@ declare class Server {
|
|
|
68
70
|
* @see updateConfig
|
|
69
71
|
* @TODO generate that based on real data
|
|
70
72
|
*/
|
|
71
|
-
getConfig(configName: string): {};
|
|
73
|
+
getConfig(configName: string): { [key: string]: any };
|
|
72
74
|
|
|
73
75
|
/**
|
|
74
76
|
* Return or create new logger instance. This is a main logger instance
|
|
@@ -79,7 +81,7 @@ declare class Server {
|
|
|
79
81
|
* Primary designed for tests when we need to update some configs before start testing
|
|
80
82
|
* Should be called before any initialization was done
|
|
81
83
|
*/
|
|
82
|
-
updateConfig(configName: string, config: {}): {};
|
|
84
|
+
updateConfig(configName: string, config: {}): { [key: string]: any };
|
|
83
85
|
|
|
84
86
|
/**
|
|
85
87
|
* Return model from {modelName} (file name) on model folder.
|
|
@@ -93,4 +95,4 @@ declare class Server {
|
|
|
93
95
|
runCliCommand(commandName: string, args: {}): Promise<BaseCli['run']>;
|
|
94
96
|
}
|
|
95
97
|
|
|
96
|
-
export
|
|
98
|
+
export default Server;
|
package/server.js
CHANGED
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
/* eslint-disable no-console */
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
2
|
+
import EventEmitter from 'node:events';
|
|
3
|
+
import { hrtime, loadEnvFile } from 'node:process';
|
|
4
|
+
import * as url from 'node:url';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
|
|
7
|
+
import merge from 'deepmerge';
|
|
8
|
+
import winston from 'winston';
|
|
9
|
+
import { getFilesPathWithInheritance } from './helpers/files.js';
|
|
10
|
+
import { consoleLogger } from './helpers/logger.js';
|
|
11
|
+
import Cache from './services/cache/Cache.js';
|
|
12
|
+
|
|
13
|
+
try {
|
|
14
|
+
loadEnvFile();
|
|
15
|
+
} catch (e) {
|
|
16
|
+
console.warn('No env file found. This is ok. But please check youself.');
|
|
17
|
+
}
|
|
12
18
|
|
|
13
19
|
/**
|
|
14
20
|
* Main framework class.
|
|
@@ -18,6 +24,8 @@ class Server {
|
|
|
18
24
|
|
|
19
25
|
#isInited = false;
|
|
20
26
|
|
|
27
|
+
cli = null;
|
|
28
|
+
|
|
21
29
|
/**
|
|
22
30
|
* Construct new server
|
|
23
31
|
* @param {Object} config main config object
|
|
@@ -26,7 +34,6 @@ class Server {
|
|
|
26
34
|
* @param {String} config.folders.models path to folder with moidels files
|
|
27
35
|
* @param {String} config.folders.controllers path to folder with controllers files
|
|
28
36
|
* @param {String} config.folders.views path to folder with view files
|
|
29
|
-
* @param {String} config.folders.public path to folder with public files
|
|
30
37
|
* @param {String} config.folders.locales path to folder with locales files
|
|
31
38
|
* @param {String} config.folders.emails path to folder with emails files
|
|
32
39
|
*/
|
|
@@ -55,8 +62,6 @@ class Server {
|
|
|
55
62
|
models: new Map(),
|
|
56
63
|
modelConstructors: new Map(),
|
|
57
64
|
};
|
|
58
|
-
|
|
59
|
-
this.cli = false;
|
|
60
65
|
}
|
|
61
66
|
|
|
62
67
|
/**
|
|
@@ -139,8 +144,9 @@ class Server {
|
|
|
139
144
|
}
|
|
140
145
|
|
|
141
146
|
async #initConfigFiles() {
|
|
147
|
+
const dirname = url.fileURLToPath(new URL('.', import.meta.url));
|
|
142
148
|
const files = await getFilesPathWithInheritance({
|
|
143
|
-
internalFolder:
|
|
149
|
+
internalFolder: path.join(dirname, '/config'),
|
|
144
150
|
externalFolder: this.app.foldersConfig.config,
|
|
145
151
|
loggerFileType: 'CONFIG',
|
|
146
152
|
logger: (m) => consoleLogger('info', m),
|
|
@@ -192,8 +198,9 @@ class Server {
|
|
|
192
198
|
}
|
|
193
199
|
|
|
194
200
|
async #loadModelFiles() {
|
|
201
|
+
const dirname = url.fileURLToPath(new URL('.', import.meta.url));
|
|
195
202
|
const files = await getFilesPathWithInheritance({
|
|
196
|
-
internalFolder:
|
|
203
|
+
internalFolder: path.join(dirname, '/models'),
|
|
197
204
|
externalFolder: this.app.foldersConfig.models,
|
|
198
205
|
loggerFileType: 'MODEL',
|
|
199
206
|
logger: (m) => consoleLogger('info', m),
|
|
@@ -347,7 +354,7 @@ class Server {
|
|
|
347
354
|
* Return model from {modelName} (file name) on model folder.
|
|
348
355
|
* Support cache
|
|
349
356
|
* @param {String} modelName name on config file to load
|
|
350
|
-
* @returns {import('mongoose').Model}
|
|
357
|
+
* @returns {import('mongoose').Model | false| {}}
|
|
351
358
|
*/
|
|
352
359
|
getModel(modelName) {
|
|
353
360
|
if (modelName.endsWith('s')) {
|
|
@@ -395,4 +402,4 @@ class Server {
|
|
|
395
402
|
}
|
|
396
403
|
}
|
|
397
404
|
|
|
398
|
-
|
|
405
|
+
export default Server;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import Base from '../../modules/Base';
|
|
2
|
-
import Server from '../../server';
|
|
2
|
+
import Server from '../../server.js';
|
|
3
3
|
|
|
4
4
|
declare class Cache extends Base {
|
|
5
5
|
app: Server['app'];
|
|
@@ -32,4 +32,4 @@ declare class Cache extends Base {
|
|
|
32
32
|
removeKey(key: string): Promise<number>;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
export
|
|
35
|
+
export default Cache;
|
package/services/cache/Cache.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import Base from '../../modules/Base.js';
|
|
2
2
|
|
|
3
3
|
class Cache extends Base {
|
|
4
4
|
constructor(app) {
|
|
@@ -69,12 +69,14 @@ class Cache extends Base {
|
|
|
69
69
|
return Promise.reject(e);
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
this.redisClient.
|
|
72
|
+
this.redisClient.set(
|
|
73
73
|
key,
|
|
74
|
-
storeTime,
|
|
75
74
|
JSON.stringify(result, (jsonkey, value) =>
|
|
76
75
|
typeof value === 'bigint' ? `${value}n` : value,
|
|
77
76
|
),
|
|
77
|
+
{
|
|
78
|
+
EX: storeTime,
|
|
79
|
+
},
|
|
78
80
|
);
|
|
79
81
|
} else {
|
|
80
82
|
this.logger.verbose(
|
|
@@ -117,4 +119,4 @@ class Cache extends Base {
|
|
|
117
119
|
}
|
|
118
120
|
}
|
|
119
121
|
|
|
120
|
-
|
|
122
|
+
export default Cache;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import Base from '../../modules/Base.js';
|
|
2
|
+
import ValidateService from '../validate/ValidateService.js';
|
|
3
3
|
|
|
4
4
|
class DocumentationGenerator extends Base {
|
|
5
5
|
// eslint-disable-next-line class-methods-use-this
|
|
@@ -166,4 +166,4 @@ class DocumentationGenerator extends Base {
|
|
|
166
166
|
}
|
|
167
167
|
}
|
|
168
168
|
|
|
169
|
-
|
|
169
|
+
export default DocumentationGenerator;
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const Base = require('../../modules/Base');
|
|
1
|
+
import http from 'node:http';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import * as url from 'node:url';
|
|
4
|
+
import express from 'express';
|
|
5
|
+
import RequestLoggerMiddleware from './middleware/RequestLogger.js';
|
|
6
|
+
import I18nMiddleware from './middleware/I18n.js';
|
|
7
|
+
import PrepareAppInfoMiddleware from './middleware/PrepareAppInfo.js';
|
|
8
|
+
import RequestParserMiddleware from './middleware/RequestParser.js';
|
|
9
|
+
import IpDetector from './middleware/IpDetector.js';
|
|
10
|
+
import Cors from './middleware/Cors.js';
|
|
11
|
+
import Base from '../../modules/Base.js';
|
|
13
12
|
|
|
14
13
|
/**
|
|
15
14
|
* HTTP server based on Express
|
|
@@ -19,13 +18,15 @@ class HttpServer extends Base {
|
|
|
19
18
|
super(app);
|
|
20
19
|
this.express = express();
|
|
21
20
|
this.express.disable('x-powered-by');
|
|
21
|
+
const dirname = url.fileURLToPath(new URL('.', import.meta.url));
|
|
22
22
|
this.express.set('views', [
|
|
23
23
|
this.app.foldersConfig.views,
|
|
24
|
-
path.join(
|
|
24
|
+
path.join(dirname, '../../views'),
|
|
25
25
|
]);
|
|
26
26
|
this.express.set('view engine', 'pug');
|
|
27
27
|
|
|
28
28
|
this.express.use(new PrepareAppInfoMiddleware(this.app).getMiddleware());
|
|
29
|
+
this.express.use(new IpDetector(this.app).getMiddleware());
|
|
29
30
|
this.express.use(new RequestLoggerMiddleware(this.app).getMiddleware());
|
|
30
31
|
this.express.use(new I18nMiddleware(this.app).getMiddleware());
|
|
31
32
|
|
|
@@ -35,15 +36,6 @@ class HttpServer extends Base {
|
|
|
35
36
|
origins: httpConfig.corsDomains,
|
|
36
37
|
}).getMiddleware(),
|
|
37
38
|
);
|
|
38
|
-
// todo whitelist
|
|
39
|
-
this.express.use(
|
|
40
|
-
new StaticFilesMiddleware(this.app, {
|
|
41
|
-
folders: [
|
|
42
|
-
this.app.foldersConfig.public,
|
|
43
|
-
path.join(__dirname, '../../public/files'),
|
|
44
|
-
],
|
|
45
|
-
}).getMiddleware(),
|
|
46
|
-
);
|
|
47
39
|
|
|
48
40
|
this.express.use(new RequestParserMiddleware(this.app).getMiddleware());
|
|
49
41
|
|
|
@@ -57,7 +49,7 @@ class HttpServer extends Base {
|
|
|
57
49
|
res.status(500).json({ message: 'Something broke!' });
|
|
58
50
|
});
|
|
59
51
|
|
|
60
|
-
this.httpServer = http.
|
|
52
|
+
this.httpServer = http.createServer(this.express);
|
|
61
53
|
|
|
62
54
|
const listener = this.httpServer.listen(
|
|
63
55
|
httpConfig.port,
|
|
@@ -101,4 +93,4 @@ class HttpServer extends Base {
|
|
|
101
93
|
}
|
|
102
94
|
}
|
|
103
95
|
|
|
104
|
-
|
|
96
|
+
export default HttpServer;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import yup from 'yup';
|
|
2
|
+
import Base from '../../../modules/Base.js';
|
|
3
3
|
|
|
4
4
|
class AbstractMiddleware extends Base {
|
|
5
5
|
constructor(app, params) {
|
|
@@ -48,4 +48,4 @@ class AbstractMiddleware extends Base {
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
export default AbstractMiddleware;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import AbstractMiddleware from './AbstractMiddleware.js';
|
|
2
2
|
|
|
3
3
|
class AuthMiddleware extends AbstractMiddleware {
|
|
4
4
|
static get description() {
|
|
@@ -17,4 +17,4 @@ class AuthMiddleware extends AbstractMiddleware {
|
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
export default AuthMiddleware;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import AbstractMiddleware from './AbstractMiddleware.js';
|
|
2
2
|
|
|
3
3
|
class Cors extends AbstractMiddleware {
|
|
4
4
|
constructor(app, params) {
|
|
@@ -43,4 +43,4 @@ class Cors extends AbstractMiddleware {
|
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
export default Cors;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import AbstractMiddleware from './AbstractMiddleware.js';
|
|
2
2
|
|
|
3
3
|
class GetUserByToken extends AbstractMiddleware {
|
|
4
4
|
static get description() {
|
|
@@ -11,7 +11,7 @@ class GetUserByToken extends AbstractMiddleware {
|
|
|
11
11
|
name: 'Authorization',
|
|
12
12
|
type: 'apiKey',
|
|
13
13
|
in: 'header',
|
|
14
|
-
description: this
|
|
14
|
+
description: this.constructor.description,
|
|
15
15
|
},
|
|
16
16
|
];
|
|
17
17
|
}
|
|
@@ -43,4 +43,4 @@ class GetUserByToken extends AbstractMiddleware {
|
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
export default GetUserByToken;
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const AbstractMiddleware = require('./AbstractMiddleware');
|
|
1
|
+
import i18next from 'i18next';
|
|
2
|
+
import BackendFS from 'i18next-fs-backend';
|
|
3
|
+
import Backend from 'i18next-chained-backend';
|
|
4
|
+
import AbstractMiddleware from './AbstractMiddleware.js';
|
|
6
5
|
|
|
7
6
|
class I18n extends AbstractMiddleware {
|
|
8
7
|
constructor(app, params) {
|
|
@@ -116,4 +115,4 @@ class I18n extends AbstractMiddleware {
|
|
|
116
115
|
}
|
|
117
116
|
}
|
|
118
117
|
|
|
119
|
-
|
|
118
|
+
export default I18n;
|