@adaptivestone/framework 5.0.0-beta.4 → 5.0.0-beta.40
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/CHANGELOG.md +1107 -528
- package/LICENCE +1 -1
- package/dist/Cli.d.ts +7 -0
- package/dist/Cli.js +19 -0
- package/dist/Cli.js.map +1 -0
- package/dist/cluster.d.ts +1 -0
- package/dist/cluster.js +18 -0
- package/dist/cluster.js.map +1 -0
- package/dist/commands/CreateUser.d.ts +32 -0
- package/dist/commands/CreateUser.js +83 -0
- package/dist/commands/CreateUser.js.map +1 -0
- package/dist/commands/Documentation.d.ts +5 -0
- package/dist/commands/Documentation.js +15 -0
- package/dist/commands/Documentation.js.map +1 -0
- package/dist/commands/DropIndex.d.ts +16 -0
- package/dist/commands/DropIndex.js +30 -0
- package/dist/commands/DropIndex.js.map +1 -0
- package/dist/commands/GenerateRandomBytes.d.ts +7 -0
- package/dist/commands/GenerateRandomBytes.js +18 -0
- package/dist/commands/GenerateRandomBytes.js.map +1 -0
- package/dist/commands/GenerateTypes.d.ts +11 -0
- package/dist/commands/GenerateTypes.js +52 -0
- package/dist/commands/GenerateTypes.js.map +1 -0
- package/dist/commands/GetOpenApiJson.d.ts +17 -0
- package/dist/commands/GetOpenApiJson.js +272 -0
- package/dist/commands/GetOpenApiJson.js.map +1 -0
- package/dist/commands/SyncIndexes.d.ts +6 -0
- package/dist/commands/SyncIndexes.js +31 -0
- package/dist/commands/SyncIndexes.js.map +1 -0
- package/dist/commands/migration/Create.d.ts +18 -0
- package/dist/commands/migration/Create.js +57 -0
- package/dist/commands/migration/Create.js.map +1 -0
- package/dist/commands/migration/Migrate.d.ts +6 -0
- package/dist/commands/migration/Migrate.js +43 -0
- package/dist/commands/migration/Migrate.js.map +1 -0
- package/dist/config/auth.d.ts +6 -0
- package/dist/config/auth.js +7 -0
- package/dist/config/auth.js.map +1 -0
- package/dist/config/http.d.ts +8 -0
- package/dist/config/http.js +10 -0
- package/dist/config/http.js.map +1 -0
- package/dist/config/i18n.d.ts +13 -0
- package/dist/config/i18n.js +13 -0
- package/dist/config/i18n.js.map +1 -0
- package/dist/config/ipDetector.d.ts +5 -0
- package/dist/config/ipDetector.js +15 -0
- package/dist/config/ipDetector.js.map +1 -0
- package/dist/config/log.d.ts +11 -0
- package/dist/config/log.js +20 -0
- package/dist/config/log.js.map +1 -0
- package/dist/config/mongo.d.ts +4 -0
- package/dist/config/mongo.js +4 -0
- package/dist/config/mongo.js.map +1 -0
- package/dist/config/rateLimiter.d.ts +13 -0
- package/dist/config/rateLimiter.js +17 -0
- package/dist/config/rateLimiter.js.map +1 -0
- package/dist/config/redis.d.ts +5 -0
- package/dist/config/redis.js +5 -0
- package/dist/config/redis.js.map +1 -0
- package/dist/config/validate.d.ts +4 -0
- package/dist/config/validate.js +4 -0
- package/dist/config/validate.js.map +1 -0
- package/dist/controllers/Auth.d.ts +131 -0
- package/dist/controllers/Auth.js +186 -0
- package/dist/controllers/Auth.js.map +1 -0
- package/dist/controllers/Home.d.ts +15 -0
- package/dist/controllers/Home.js +22 -0
- package/dist/controllers/Home.js.map +1 -0
- package/dist/controllers/index.d.ts +16 -0
- package/dist/controllers/index.js +59 -0
- package/dist/controllers/index.js.map +1 -0
- package/dist/folderConfig.d.ts +34 -0
- package/dist/folderConfig.js +14 -0
- package/dist/folderConfig.js.map +1 -0
- package/dist/helpers/appInstance.d.ts +3 -0
- package/dist/helpers/appInstance.js +8 -0
- package/dist/helpers/appInstance.js.map +1 -0
- package/dist/helpers/crypto.d.ts +3 -0
- package/dist/helpers/crypto.js +17 -0
- package/dist/helpers/crypto.js.map +1 -0
- package/dist/helpers/files.d.ts +16 -0
- package/dist/helpers/files.js +76 -0
- package/dist/helpers/files.js.map +1 -0
- package/dist/helpers/logger.d.ts +4 -0
- package/dist/helpers/logger.js +20 -0
- package/dist/helpers/logger.js.map +1 -0
- package/dist/helpers/redis/clearNamespace.d.ts +2 -0
- package/dist/helpers/redis/clearNamespace.js +14 -0
- package/dist/helpers/redis/clearNamespace.js.map +1 -0
- package/dist/helpers/yup.d.ts +13 -0
- package/dist/helpers/yup.js +21 -0
- package/dist/helpers/yup.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/models/Lock.d.ts +90 -0
- package/dist/models/Lock.js +97 -0
- package/dist/models/Lock.js.map +1 -0
- package/dist/models/Migration.d.ts +13 -0
- package/dist/models/Migration.js +14 -0
- package/dist/models/Migration.js.map +1 -0
- package/dist/models/Sequence.d.ts +28 -0
- package/dist/models/Sequence.js +19 -0
- package/dist/models/Sequence.js.map +1 -0
- package/dist/models/User.d.ts +656 -0
- package/dist/models/User.js +291 -0
- package/dist/models/User.js.map +1 -0
- package/dist/models/UserOld.d.ts +179 -0
- package/dist/models/UserOld.js +230 -0
- package/dist/models/UserOld.js.map +1 -0
- package/dist/modules/AbstractCommand.d.ts +51 -0
- package/dist/modules/AbstractCommand.js +60 -0
- package/dist/modules/AbstractCommand.js.map +1 -0
- package/dist/modules/AbstractConnector.d.ts +5 -0
- package/dist/modules/AbstractConnector.js +8 -0
- package/dist/modules/AbstractConnector.js.map +1 -0
- package/dist/modules/AbstractController.d.ts +94 -0
- package/dist/modules/AbstractController.js +323 -0
- package/dist/modules/AbstractController.js.map +1 -0
- package/dist/modules/AbstractModel.d.ts +29 -0
- package/dist/modules/AbstractModel.js +42 -0
- package/dist/modules/AbstractModel.js.map +1 -0
- package/dist/modules/Base.d.ts +29 -0
- package/dist/modules/Base.js +58 -0
- package/dist/modules/Base.js.map +1 -0
- package/dist/modules/BaseCli.d.ts +25 -0
- package/dist/modules/BaseCli.js +147 -0
- package/dist/modules/BaseCli.js.map +1 -0
- package/dist/modules/BaseModel.d.ts +55 -0
- package/dist/modules/BaseModel.js +37 -0
- package/dist/modules/BaseModel.js.map +1 -0
- package/dist/server.d.ts +123 -0
- package/dist/server.js +468 -0
- package/dist/server.js.map +1 -0
- package/dist/services/cache/Cache.d.ts +31 -0
- package/dist/services/cache/Cache.js +113 -0
- package/dist/services/cache/Cache.js.map +1 -0
- package/dist/services/documentation/DocumentationGenerator.d.ts +11 -0
- package/dist/services/documentation/DocumentationGenerator.js +130 -0
- package/dist/services/documentation/DocumentationGenerator.js.map +1 -0
- package/dist/services/http/HttpServer.d.ts +35 -0
- package/dist/services/http/HttpServer.js +70 -0
- package/dist/services/http/HttpServer.js.map +1 -0
- package/dist/services/http/middleware/AbstractMiddleware.d.ts +25 -0
- package/dist/services/http/middleware/AbstractMiddleware.js +41 -0
- package/dist/services/http/middleware/AbstractMiddleware.js.map +1 -0
- package/dist/services/http/middleware/Auth.d.ts +9 -0
- package/dist/services/http/middleware/Auth.js +18 -0
- package/dist/services/http/middleware/Auth.js.map +1 -0
- package/dist/services/http/middleware/Cors.d.ts +12 -0
- package/dist/services/http/middleware/Cors.js +36 -0
- package/dist/services/http/middleware/Cors.js.map +1 -0
- package/dist/services/http/middleware/GetUserByToken.d.ts +20 -0
- package/dist/services/http/middleware/GetUserByToken.js +39 -0
- package/dist/services/http/middleware/GetUserByToken.js.map +1 -0
- package/dist/services/http/middleware/I18n.d.ts +23 -0
- package/dist/services/http/middleware/I18n.js +61 -0
- package/dist/services/http/middleware/I18n.js.map +1 -0
- package/dist/services/http/middleware/IpDetector.d.ts +14 -0
- package/dist/services/http/middleware/IpDetector.js +55 -0
- package/dist/services/http/middleware/IpDetector.js.map +1 -0
- package/dist/services/http/middleware/Pagination.d.ts +27 -0
- package/dist/services/http/middleware/Pagination.js +46 -0
- package/dist/services/http/middleware/Pagination.js.map +1 -0
- package/dist/services/http/middleware/PrepareAppInfo.d.ts +8 -0
- package/dist/services/http/middleware/PrepareAppInfo.js +17 -0
- package/dist/services/http/middleware/PrepareAppInfo.js.map +1 -0
- package/dist/services/http/middleware/RateLimiter.d.ts +26 -0
- package/dist/services/http/middleware/RateLimiter.js +118 -0
- package/dist/services/http/middleware/RateLimiter.js.map +1 -0
- package/dist/services/http/middleware/RequestLogger.d.ts +8 -0
- package/dist/services/http/middleware/RequestLogger.js +18 -0
- package/dist/services/http/middleware/RequestLogger.js.map +1 -0
- package/dist/services/http/middleware/RequestParser.d.ts +8 -0
- package/dist/services/http/middleware/RequestParser.js +35 -0
- package/dist/services/http/middleware/RequestParser.js.map +1 -0
- package/dist/services/http/middleware/Role.d.ts +12 -0
- package/dist/services/http/middleware/Role.js +24 -0
- package/dist/services/http/middleware/Role.js.map +1 -0
- package/dist/services/i18n/I18n.d.ts +15 -0
- package/dist/services/i18n/I18n.js +58 -0
- package/dist/services/i18n/I18n.js.map +1 -0
- package/dist/services/logging/SentryTransport.d.ts +14 -0
- package/dist/services/logging/SentryTransport.js +57 -0
- package/dist/services/logging/SentryTransport.js.map +1 -0
- package/dist/services/validate/ValidateService.d.ts +31 -0
- package/dist/services/validate/ValidateService.js +95 -0
- package/dist/services/validate/ValidateService.js.map +1 -0
- package/dist/services/validate/drivers/AbstractValidator.d.ts +14 -0
- package/dist/services/validate/drivers/AbstractValidator.js +29 -0
- package/dist/services/validate/drivers/AbstractValidator.js.map +1 -0
- package/dist/services/validate/drivers/CustomValidator.d.ts +14 -0
- package/dist/services/validate/drivers/CustomValidator.js +48 -0
- package/dist/services/validate/drivers/CustomValidator.js.map +1 -0
- package/dist/services/validate/drivers/YupValidator.d.ts +13 -0
- package/dist/services/validate/drivers/YupValidator.js +86 -0
- package/dist/services/validate/drivers/YupValidator.js.map +1 -0
- package/dist/tests/frameworkVitestSetup.d.ts +1 -0
- package/dist/tests/frameworkVitestSetup.js +9 -0
- package/dist/tests/frameworkVitestSetup.js.map +1 -0
- package/dist/tests/globalSetupVitest.d.ts +3 -0
- package/dist/tests/globalSetupVitest.js +29 -0
- package/dist/tests/globalSetupVitest.js.map +1 -0
- package/dist/tests/setupVitest.d.ts +1 -0
- package/dist/tests/setupVitest.js +91 -0
- package/dist/tests/setupVitest.js.map +1 -0
- package/dist/tests/testHelpers.d.ts +340 -0
- package/dist/tests/testHelpers.js +48 -0
- package/dist/tests/testHelpers.js.map +1 -0
- package/package.json +45 -39
- package/Cli.js +0 -22
- package/cluster.js +0 -27
- package/commands/CreateUser.js +0 -75
- package/commands/Documentation.js +0 -17
- package/commands/DropIndex.js +0 -29
- package/commands/GenerateRandomBytes.js +0 -21
- package/commands/GetOpenApiJson.js +0 -325
- package/commands/SyncIndexes.js +0 -39
- package/commands/migration/Create.js +0 -61
- package/commands/migration/Migrate.js +0 -55
- package/config/auth.js +0 -9
- package/config/http.js +0 -9
- package/config/i18n.js +0 -12
- package/config/ipDetector.js +0 -14
- package/config/log.js +0 -22
- package/config/mail.js +0 -29
- package/config/mongo.js +0 -3
- package/config/rateLimiter.js +0 -16
- package/config/redis.js +0 -4
- package/config/validate.js +0 -3
- package/controllers/Auth.js +0 -210
- package/controllers/Home.js +0 -28
- package/controllers/index.js +0 -60
- package/folderConfig.js +0 -14
- package/helpers/files.js +0 -79
- package/helpers/logger.js +0 -17
- package/helpers/redis/clearNamespace.js +0 -14
- package/helpers/yup.js +0 -24
- package/index.js +0 -8
- package/jsconfig.json +0 -9
- package/locales/en/translation.json +0 -27
- package/locales/ru/translation.json +0 -27
- package/migrations/.gitkeep +0 -0
- package/models/Migration.js +0 -15
- package/models/Sequence.js +0 -22
- package/models/User.js +0 -263
- package/modules/AbstractCommand.js +0 -43
- package/modules/AbstractConnector.js +0 -9
- package/modules/AbstractController.js +0 -413
- package/modules/AbstractModel.d.ts +0 -48
- package/modules/AbstractModel.js +0 -92
- package/modules/Base.d.ts +0 -37
- package/modules/Base.js +0 -63
- package/modules/BaseCli.js +0 -97
- package/server.d.ts +0 -98
- package/server.js +0 -438
- package/services/cache/Cache.d.ts +0 -35
- package/services/cache/Cache.js +0 -124
- package/services/documentation/DocumentationGenerator.js +0 -169
- package/services/http/HttpServer.js +0 -96
- package/services/http/middleware/AbstractMiddleware.js +0 -51
- package/services/http/middleware/Auth.js +0 -20
- package/services/http/middleware/Cors.js +0 -46
- package/services/http/middleware/GetUserByToken.js +0 -47
- package/services/http/middleware/I18n.js +0 -117
- package/services/http/middleware/IpDetector.js +0 -59
- package/services/http/middleware/Pagination.js +0 -57
- package/services/http/middleware/PrepareAppInfo.js +0 -18
- package/services/http/middleware/RateLimiter.js +0 -134
- package/services/http/middleware/RequestLogger.js +0 -22
- package/services/http/middleware/RequestParser.js +0 -40
- package/services/http/middleware/Role.js +0 -29
- package/services/messaging/email/index.js +0 -217
- package/services/messaging/email/resources/.gitkeep +0 -1
- package/services/messaging/email/templates/emptyTemplate/html.pug +0 -9
- package/services/messaging/email/templates/emptyTemplate/subject.pug +0 -1
- package/services/messaging/email/templates/emptyTemplate/text.pug +0 -1
- package/services/messaging/email/templates/recovery/html.pug +0 -8
- package/services/messaging/email/templates/recovery/subject.pug +0 -2
- package/services/messaging/email/templates/recovery/text.pug +0 -3
- package/services/messaging/email/templates/verification/html.pug +0 -10
- package/services/messaging/email/templates/verification/subject.pug +0 -1
- package/services/messaging/email/templates/verification/text.pug +0 -1
- package/services/messaging/index.js +0 -3
- package/services/validate/ValidateService.js +0 -157
- package/services/validate/drivers/AbstractValidator.js +0 -37
- package/services/validate/drivers/CustomValidator.js +0 -51
- package/services/validate/drivers/YupValidator.js +0 -103
- package/tests/globalSetupVitest.js +0 -35
- package/tests/setup.js +0 -118
- package/tests/setupVitest.js +0 -109
- package/types/Expand.d.ts +0 -11
- package/types/TFoldersConfig.d.ts +0 -17
- package/views/404.pug +0 -3
- package/views/home.pug +0 -3
- package/views/layouts/base.pug +0 -39
- package/vitest.config.js +0 -16
- /package/{commands → dist/migrations}/.gitkeep +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IpDetector.js","sourceRoot":"","sources":["../../../../src/services/http/middleware/IpDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { NextFunction, Response } from 'express';
|
|
2
|
+
import type { FrameworkRequest } from '../HttpServer.ts';
|
|
3
|
+
import AbstractMiddleware from './AbstractMiddleware.ts';
|
|
4
|
+
export interface PaginationMiddlewareAppInfo {
|
|
5
|
+
appInfo: {
|
|
6
|
+
pagination: {
|
|
7
|
+
page: number;
|
|
8
|
+
limit: number;
|
|
9
|
+
skip: number;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Middleware for reusing pagination
|
|
15
|
+
*/
|
|
16
|
+
declare class Pagination extends AbstractMiddleware {
|
|
17
|
+
static get description(): string;
|
|
18
|
+
get relatedQueryParameters(): import("yup").ObjectSchema<{
|
|
19
|
+
page: number | undefined;
|
|
20
|
+
limit: number | undefined;
|
|
21
|
+
}, import("yup").AnyObject, {
|
|
22
|
+
page: undefined;
|
|
23
|
+
limit: undefined;
|
|
24
|
+
}, "">;
|
|
25
|
+
middleware(req: FrameworkRequest & PaginationMiddlewareAppInfo, _res: Response, next: NextFunction): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
export default Pagination;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { number, object } from 'yup';
|
|
2
|
+
import AbstractMiddleware from "./AbstractMiddleware.js";
|
|
3
|
+
/**
|
|
4
|
+
* Middleware for reusing pagination
|
|
5
|
+
*/
|
|
6
|
+
class Pagination extends AbstractMiddleware {
|
|
7
|
+
static get description() {
|
|
8
|
+
return 'Pagination middleware. You can use limit=10 and maxLimit=100 parameters';
|
|
9
|
+
}
|
|
10
|
+
get relatedQueryParameters() {
|
|
11
|
+
return object().shape({
|
|
12
|
+
page: number(),
|
|
13
|
+
limit: number(),
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
async middleware(req, _res, next) {
|
|
17
|
+
let { limit, maxLimit } = this.params;
|
|
18
|
+
limit = (typeof limit !== 'number' ? parseInt(limit, 10) : limit) || 10;
|
|
19
|
+
maxLimit =
|
|
20
|
+
(typeof maxLimit !== 'number' ? parseInt(maxLimit, 10) : maxLimit) || 100;
|
|
21
|
+
req.appInfo.pagination = {
|
|
22
|
+
page: typeof req?.query?.page === 'string'
|
|
23
|
+
? parseInt(req?.query?.page, 10) || 1
|
|
24
|
+
: 1,
|
|
25
|
+
limit: typeof req?.query?.limit === 'string'
|
|
26
|
+
? parseInt(req?.query?.limit, 10) || 0
|
|
27
|
+
: limit,
|
|
28
|
+
skip: 0,
|
|
29
|
+
};
|
|
30
|
+
if (req.appInfo.pagination.limit > maxLimit) {
|
|
31
|
+
req.appInfo.pagination.limit = maxLimit;
|
|
32
|
+
}
|
|
33
|
+
if (req.appInfo.pagination.page < 1) {
|
|
34
|
+
req.appInfo.pagination.page = 1;
|
|
35
|
+
}
|
|
36
|
+
if (req.appInfo.pagination.limit < 0) {
|
|
37
|
+
req.appInfo.pagination.limit = 0;
|
|
38
|
+
}
|
|
39
|
+
req.appInfo.pagination.skip =
|
|
40
|
+
req.appInfo.pagination.page * req.appInfo.pagination.limit -
|
|
41
|
+
req.appInfo.pagination.limit;
|
|
42
|
+
return next();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export default Pagination;
|
|
46
|
+
//# sourceMappingURL=Pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pagination.js","sourceRoot":"","sources":["../../../../src/services/http/middleware/Pagination.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAErC,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AAYzD;;GAEG;AACH,MAAM,UAAW,SAAQ,kBAAkB;IACzC,MAAM,KAAK,WAAW;QACpB,OAAO,yEAAyE,CAAC;IACnF,CAAC;IAED,IAAI,sBAAsB;QACxB,OAAO,MAAM,EAAE,CAAC,KAAK,CAAC;YACpB,IAAI,EAAE,MAAM,EAAE;YACd,KAAK,EAAE,MAAM,EAAE;SAChB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CACd,GAAmD,EACnD,IAAc,EACd,IAAkB;QAElB,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,MAG9B,CAAC;QAEF,KAAK,GAAG,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACxE,QAAQ;YACN,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;QAE5E,GAAG,CAAC,OAAO,CAAC,UAAU,GAAG;YACvB,IAAI,EACF,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,KAAK,QAAQ;gBAClC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;gBACrC,CAAC,CAAC,CAAC;YAEP,KAAK,EACH,OAAO,GAAG,EAAE,KAAK,EAAE,KAAK,KAAK,QAAQ;gBACnC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC;gBACtC,CAAC,CAAC,KAAK;YACX,IAAI,EAAE,CAAC;SACR,CAAC;QAEF,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,GAAG,QAAQ,EAAE,CAAC;YAC5C,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,GAAG,QAAQ,CAAC;QAC1C,CAAC;QAED,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACpC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC;QACnC,CAAC;QAED,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI;YACzB,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK;gBAC1D,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;QAE/B,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC;CACF;AAED,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { NextFunction, Response } from 'express';
|
|
2
|
+
import type { FrameworkRequest } from '../HttpServer.ts';
|
|
3
|
+
import AbstractMiddleware from './AbstractMiddleware.ts';
|
|
4
|
+
declare class PrepareAppInfo extends AbstractMiddleware {
|
|
5
|
+
static get description(): string;
|
|
6
|
+
middleware(req: FrameworkRequest, _res: Response, next: NextFunction): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export default PrepareAppInfo;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import AbstractMiddleware from "./AbstractMiddleware.js";
|
|
2
|
+
class PrepareAppInfo extends AbstractMiddleware {
|
|
3
|
+
static get description() {
|
|
4
|
+
return 'Basic middleware that creates "req.appInfo" object';
|
|
5
|
+
}
|
|
6
|
+
async middleware(req, _res, next) {
|
|
7
|
+
if (!req.appInfo) {
|
|
8
|
+
//@ts-expect-error extending
|
|
9
|
+
req.appInfo = {
|
|
10
|
+
app: this.app,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
next();
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export default PrepareAppInfo;
|
|
17
|
+
//# sourceMappingURL=PrepareAppInfo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrepareAppInfo.js","sourceRoot":"","sources":["../../../../src/services/http/middleware/PrepareAppInfo.ts"],"names":[],"mappings":"AAEA,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AAEzD,MAAM,cAAe,SAAQ,kBAAkB;IAC7C,MAAM,KAAK,WAAW;QACpB,OAAO,oDAAoD,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAqB,EAAE,IAAc,EAAE,IAAkB;QACxE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACjB,4BAA4B;YAC5B,GAAG,CAAC,OAAO,GAAG;gBACZ,GAAG,EAAE,IAAI,CAAC,GAAG;aACd,CAAC;QACJ,CAAC;QACD,IAAI,EAAE,CAAC;IACT,CAAC;CACF;AAED,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { NextFunction, Response } from 'express';
|
|
2
|
+
import type { RateLimiterAbstract } from 'rate-limiter-flexible';
|
|
3
|
+
import { RateLimiterRedis } from 'rate-limiter-flexible';
|
|
4
|
+
import type rateLimiterConfig from '../../../config/rateLimiter.js';
|
|
5
|
+
import type { IApp } from '../../../server.ts';
|
|
6
|
+
import type { FrameworkRequest } from '../HttpServer.ts';
|
|
7
|
+
import AbstractMiddleware from './AbstractMiddleware.ts';
|
|
8
|
+
import type { GetUserByTokenAppInfo } from './GetUserByToken.ts';
|
|
9
|
+
declare class RateLimiter extends AbstractMiddleware {
|
|
10
|
+
static get description(): string;
|
|
11
|
+
finalOptions: typeof rateLimiterConfig;
|
|
12
|
+
limiter: RateLimiterAbstract;
|
|
13
|
+
constructor(app: IApp, params?: Record<string, unknown>);
|
|
14
|
+
initRedisLimiter(): RateLimiterRedis;
|
|
15
|
+
gerenateConsumeKey(req: FrameworkRequest & GetUserByTokenAppInfo): string;
|
|
16
|
+
consumeResult(consumeKey: string, consumePoints?: number): Promise<{
|
|
17
|
+
msBeforeNext: number;
|
|
18
|
+
remainingPoints: number;
|
|
19
|
+
consumedPoints: number;
|
|
20
|
+
isFirstInDuration: boolean;
|
|
21
|
+
isAllowed: boolean;
|
|
22
|
+
retryAfter: number;
|
|
23
|
+
}>;
|
|
24
|
+
middleware(req: FrameworkRequest, res: Response, next: NextFunction): Promise<void | Response<any, Record<string, any>>>;
|
|
25
|
+
}
|
|
26
|
+
export default RateLimiter;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { createClient } from '@redis/client';
|
|
2
|
+
import merge from 'deepmerge';
|
|
3
|
+
import mongoose from 'mongoose';
|
|
4
|
+
import { RateLimiterMemory, RateLimiterMongo, RateLimiterRedis, } from 'rate-limiter-flexible';
|
|
5
|
+
import AbstractMiddleware from "./AbstractMiddleware.js";
|
|
6
|
+
class RateLimiter extends AbstractMiddleware {
|
|
7
|
+
static get description() {
|
|
8
|
+
return 'Rate limiter middleware. Limit amount of request. Please refer to documentation';
|
|
9
|
+
}
|
|
10
|
+
finalOptions;
|
|
11
|
+
limiter;
|
|
12
|
+
constructor(app, params) {
|
|
13
|
+
super(app, params);
|
|
14
|
+
const limiterOptions = this.app.getConfig('rateLimiter');
|
|
15
|
+
this.finalOptions = merge(limiterOptions, params || {});
|
|
16
|
+
switch (this.finalOptions.driver) {
|
|
17
|
+
case 'memory':
|
|
18
|
+
this.limiter = new RateLimiterMemory(this.finalOptions.limiterOptions);
|
|
19
|
+
break;
|
|
20
|
+
case 'redis':
|
|
21
|
+
this.limiter = this.initRedisLimiter();
|
|
22
|
+
break;
|
|
23
|
+
case 'mongo':
|
|
24
|
+
this.limiter = new RateLimiterMongo({
|
|
25
|
+
storeClient: mongoose.connection,
|
|
26
|
+
disableIndexesCreation: process.env.TEST === 'true', // disable in test env, but we can still overrite it later
|
|
27
|
+
...this.finalOptions.limiterOptions,
|
|
28
|
+
});
|
|
29
|
+
break;
|
|
30
|
+
default:
|
|
31
|
+
this.logger?.error(`Unknwon option for driver ${this.finalOptions.driver}`);
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
initRedisLimiter() {
|
|
36
|
+
const redisConfig = this.app.getConfig('redis');
|
|
37
|
+
const redisClient = createClient({
|
|
38
|
+
url: redisConfig.url,
|
|
39
|
+
});
|
|
40
|
+
// TODO: change it
|
|
41
|
+
(async () => {
|
|
42
|
+
await redisClient.connect();
|
|
43
|
+
})();
|
|
44
|
+
redisClient.on('error', (error, b, c) => {
|
|
45
|
+
this.logger?.error(error, b, c);
|
|
46
|
+
});
|
|
47
|
+
redisClient.on('connect', () => {
|
|
48
|
+
this.logger?.info('Redis connection success');
|
|
49
|
+
});
|
|
50
|
+
this.app.events.on('shutdown', async () => {
|
|
51
|
+
await redisClient.disconnect();
|
|
52
|
+
});
|
|
53
|
+
return new RateLimiterRedis({
|
|
54
|
+
storeClient: redisClient,
|
|
55
|
+
useRedisPackage: true,
|
|
56
|
+
...this.finalOptions.limiterOptions,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
gerenateConsumeKey(req) {
|
|
60
|
+
const { ip, route, user, request } = this.finalOptions.consumeKeyComponents;
|
|
61
|
+
const key = [];
|
|
62
|
+
if (ip) {
|
|
63
|
+
if (!req.appInfo.ip) {
|
|
64
|
+
this.logger?.error(`RateLimiter: Can't get remote address from request. Please check that you used IpDetecor middleware before RateLimiter`);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
key.push(req.appInfo.ip);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (route) {
|
|
71
|
+
key.push(`${req.baseUrl ?? ''}${req.path ?? ''}`); // to avoid quesry params
|
|
72
|
+
}
|
|
73
|
+
if (user && req.appInfo?.user) {
|
|
74
|
+
key.push(req.appInfo?.user.id);
|
|
75
|
+
}
|
|
76
|
+
if (request?.length) {
|
|
77
|
+
request.forEach((val) => {
|
|
78
|
+
if (req?.body[val]) {
|
|
79
|
+
key.push(req.body[val]);
|
|
80
|
+
}
|
|
81
|
+
// if (req.appInfo.request && req.appInfo.request[val]) {
|
|
82
|
+
// key.push(req.appInfo.request[val]);
|
|
83
|
+
// }
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return key.join('_');
|
|
87
|
+
}
|
|
88
|
+
async consumeResult(consumeKey, consumePoints = 0) {
|
|
89
|
+
try {
|
|
90
|
+
const result = await this.limiter.consume(consumeKey, consumePoints || this.finalOptions.consumePoints);
|
|
91
|
+
return { isAllowed: true, retryAfter: 0, ...result };
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
this.logger?.warn(`Too many requests. Consume key: ${consumeKey}`);
|
|
95
|
+
const result = e;
|
|
96
|
+
const retryAfter = Math.round(result.msBeforeNext / 1000) || 1;
|
|
97
|
+
return { isAllowed: false, retryAfter, ...result };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async middleware(req, res, next) {
|
|
101
|
+
if (!this.limiter) {
|
|
102
|
+
this.logger?.info(`RateLimiter not inited correclty! Please check init logs `);
|
|
103
|
+
return res.status(500).json({ message: 'RateLimiter error' });
|
|
104
|
+
}
|
|
105
|
+
const { namespace } = this.app.getConfig('redis');
|
|
106
|
+
const consumeKey = `${namespace}-${this.gerenateConsumeKey(req)}`;
|
|
107
|
+
const consumeResult = await this.consumeResult(consumeKey);
|
|
108
|
+
if (consumeResult.isAllowed) {
|
|
109
|
+
return next();
|
|
110
|
+
}
|
|
111
|
+
return res
|
|
112
|
+
.status(429)
|
|
113
|
+
.setHeader('Retry-After', String(consumeResult.retryAfter))
|
|
114
|
+
.json({ message: 'Too Many Requests' });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export default RateLimiter;
|
|
118
|
+
//# sourceMappingURL=RateLimiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RateLimiter.js","sourceRoot":"","sources":["../../../../src/services/http/middleware/RateLimiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { NextFunction, Response } from 'express';
|
|
2
|
+
import type { FrameworkRequest } from '../HttpServer.ts';
|
|
3
|
+
import AbstractMiddleware from './AbstractMiddleware.ts';
|
|
4
|
+
declare class RequestLogger extends AbstractMiddleware {
|
|
5
|
+
static get description(): string;
|
|
6
|
+
middleware(req: FrameworkRequest, res: Response, next: NextFunction): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export default RequestLogger;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import AbstractMiddleware from "./AbstractMiddleware.js";
|
|
2
|
+
class RequestLogger extends AbstractMiddleware {
|
|
3
|
+
static get description() {
|
|
4
|
+
return 'Log info about the request';
|
|
5
|
+
}
|
|
6
|
+
async middleware(req, res, next) {
|
|
7
|
+
const startTime = performance.now();
|
|
8
|
+
const text = `Request is [${req.method}] ${req.url}`;
|
|
9
|
+
this.logger?.info(text);
|
|
10
|
+
res.on('finish', () => {
|
|
11
|
+
const end = performance.now();
|
|
12
|
+
this.logger?.info(`Finished ${text}. Status: ${res.statusCode}. [${(end - startTime).toFixed(2)} ms]`);
|
|
13
|
+
});
|
|
14
|
+
next();
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export default RequestLogger;
|
|
18
|
+
//# sourceMappingURL=RequestLogger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestLogger.js","sourceRoot":"","sources":["../../../../src/services/http/middleware/RequestLogger.ts"],"names":[],"mappings":"AAEA,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AAEzD,MAAM,aAAc,SAAQ,kBAAkB;IAC5C,MAAM,KAAK,WAAW;QACpB,OAAO,4BAA4B,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAqB,EAAE,GAAa,EAAE,IAAkB;QACvE,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,gBAAgB,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC;QACtD,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACpB,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,EAAE,IAAI,CACf,YAAY,IAAI,aAAa,GAAG,CAAC,UAAU,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CACrF,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,IAAI,EAAE,CAAC;IACT,CAAC;CACF;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { NextFunction, Response } from 'express';
|
|
2
|
+
import type { FrameworkRequest } from '../HttpServer.ts';
|
|
3
|
+
import AbstractMiddleware from './AbstractMiddleware.ts';
|
|
4
|
+
declare class RequestParser extends AbstractMiddleware {
|
|
5
|
+
static get description(): string;
|
|
6
|
+
middleware(req: FrameworkRequest, res: Response, next: NextFunction): Promise<void | Response<any, Record<string, any>>>;
|
|
7
|
+
}
|
|
8
|
+
export default RequestParser;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import formidable from 'formidable';
|
|
2
|
+
import AbstractMiddleware from "./AbstractMiddleware.js";
|
|
3
|
+
class RequestParser extends AbstractMiddleware {
|
|
4
|
+
static get description() {
|
|
5
|
+
return 'Parses incoming request. Based on Formidable library';
|
|
6
|
+
}
|
|
7
|
+
async middleware(req, res, next) {
|
|
8
|
+
const time = Date.now();
|
|
9
|
+
this.logger?.verbose(`Parsing request`);
|
|
10
|
+
// TODO update this to https://github.com/node-formidable/formidable/issues/412#issuecomment-1367914268 in node v20 (in 2023?)
|
|
11
|
+
const form = formidable(this.params); // not in construstor as reuse formidable affects performance
|
|
12
|
+
let fields;
|
|
13
|
+
let files;
|
|
14
|
+
try {
|
|
15
|
+
[fields, files] = await form.parse(req);
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
this.logger?.error(`Parsing failed ${err}`);
|
|
19
|
+
return res.status(400).json({
|
|
20
|
+
message: `Error to parse your request. You provided invalid content type or content-length. Please check your request headers and content type.`,
|
|
21
|
+
});
|
|
22
|
+
// return next(err);
|
|
23
|
+
}
|
|
24
|
+
this.logger?.verbose(`Parsing multipart/formdata request DONE ${Date.now() - time}ms`);
|
|
25
|
+
req.body = {
|
|
26
|
+
// todo avoid body in next versions
|
|
27
|
+
...(req.body || {}),
|
|
28
|
+
...fields,
|
|
29
|
+
...files,
|
|
30
|
+
};
|
|
31
|
+
return next();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export default RequestParser;
|
|
35
|
+
//# sourceMappingURL=RequestParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestParser.js","sourceRoot":"","sources":["../../../../src/services/http/middleware/RequestParser.ts"],"names":[],"mappings":"AACA,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AAEzD,MAAM,aAAc,SAAQ,kBAAkB;IAC5C,MAAM,KAAK,WAAW;QACpB,OAAO,sDAAsD,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAqB,EAAE,GAAa,EAAE,IAAkB;QACvE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACxC,8HAA8H;QAE9H,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,6DAA6D;QACnG,IAAI,MAAiC,CAAC;QACtC,IAAI,KAA+B,CAAC;QACpC,IAAI,CAAC;YACH,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC;YAC5C,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,OAAO,EAAE,uIAAuI;aACjJ,CAAC,CAAC;YACH,oBAAoB;QACtB,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,OAAO,CAClB,2CAA2C,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CACjE,CAAC;QAEF,GAAG,CAAC,IAAI,GAAG;YACT,mCAAmC;YACnC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;YACnB,GAAG,MAAM;YACT,GAAG,KAAK;SACT,CAAC;QACF,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC;CACF;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { NextFunction, Response } from 'express';
|
|
2
|
+
import type { TUser } from '../../../models/User.ts';
|
|
3
|
+
import type { FrameworkRequest } from '../HttpServer.ts';
|
|
4
|
+
import AbstractMiddleware from './AbstractMiddleware.ts';
|
|
5
|
+
import type { GetUserByTokenAppInfo } from './GetUserByToken.ts';
|
|
6
|
+
declare class RoleMiddleware extends AbstractMiddleware {
|
|
7
|
+
static get description(): string;
|
|
8
|
+
middleware(req: FrameworkRequest & GetUserByTokenAppInfo & {
|
|
9
|
+
user: InstanceType<TUser>;
|
|
10
|
+
}, res: Response, next: NextFunction): Promise<void | Response<any, Record<string, any>>>;
|
|
11
|
+
}
|
|
12
|
+
export default RoleMiddleware;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import AbstractMiddleware from "./AbstractMiddleware.js";
|
|
2
|
+
class RoleMiddleware extends AbstractMiddleware {
|
|
3
|
+
static get description() {
|
|
4
|
+
return 'Check user role (user.roles property). If the user has no role then stop request and return error. OR logic (any role will pass user)';
|
|
5
|
+
}
|
|
6
|
+
async middleware(req, res, next) {
|
|
7
|
+
const { user } = req.appInfo;
|
|
8
|
+
if (!user) {
|
|
9
|
+
return res.status(401).json({ message: 'User should be provided' });
|
|
10
|
+
}
|
|
11
|
+
let hasRole = false;
|
|
12
|
+
user.roles?.forEach((role) => {
|
|
13
|
+
if ((this.params?.roles).includes(role)) {
|
|
14
|
+
hasRole = true;
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
if (!hasRole) {
|
|
18
|
+
return res.status(403).json({ message: 'You do not have access' });
|
|
19
|
+
}
|
|
20
|
+
return next();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export default RoleMiddleware;
|
|
24
|
+
//# sourceMappingURL=Role.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Role.js","sourceRoot":"","sources":["../../../../src/services/http/middleware/Role.ts"],"names":[],"mappings":"AAGA,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AAGzD,MAAM,cAAe,SAAQ,kBAAkB;IAC7C,MAAM,KAAK,WAAW;QACpB,OAAO,uIAAuI,CAAC;IACjJ,CAAC;IAED,KAAK,CAAC,UAAU,CACd,GACuD,EACvD,GAAa,EACb,IAAkB;QAElB,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;QAE7B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,IAAY,EAAE,EAAE;YACnC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAuB,CAAA,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzD,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC;CACF;AAED,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { i18n, TFunction } from 'i18next';
|
|
2
|
+
import Base from '../../modules/Base.ts';
|
|
3
|
+
export type TI18n = {
|
|
4
|
+
t: TFunction;
|
|
5
|
+
language: string;
|
|
6
|
+
};
|
|
7
|
+
export declare class I18n extends Base {
|
|
8
|
+
#private;
|
|
9
|
+
getI18nForLang(lang?: string): Promise<{
|
|
10
|
+
t: TFunction;
|
|
11
|
+
language: string;
|
|
12
|
+
}>;
|
|
13
|
+
getI18nBaseInstance(): Promise<i18n>;
|
|
14
|
+
static get loggerGroup(): string;
|
|
15
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import Base from "../../modules/Base.js";
|
|
2
|
+
export class I18n extends Base {
|
|
3
|
+
#cache = {};
|
|
4
|
+
#i18nBase;
|
|
5
|
+
#i18nBasePromise;
|
|
6
|
+
#i18nFallback = {
|
|
7
|
+
t: ((text) => text),
|
|
8
|
+
language: 'en',
|
|
9
|
+
};
|
|
10
|
+
async getI18nForLang(lang) {
|
|
11
|
+
const i18NConfig = this.app.getConfig('i18n');
|
|
12
|
+
if (!i18NConfig.enabled) {
|
|
13
|
+
return this.#i18nFallback;
|
|
14
|
+
}
|
|
15
|
+
if (!lang || i18NConfig.supportedLngs.indexOf(lang) === -1) {
|
|
16
|
+
this.logger?.verbose(`Language "${lang}" is not supported or not provided. Using fallback on ${i18NConfig.fallbackLng}`);
|
|
17
|
+
lang = i18NConfig.fallbackLng;
|
|
18
|
+
}
|
|
19
|
+
if (!this.#cache[lang]) {
|
|
20
|
+
this.#cache[lang] = (await this.getI18nBaseInstance()).cloneInstance({
|
|
21
|
+
initAsync: false,
|
|
22
|
+
lng: lang,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return this.#cache[lang];
|
|
26
|
+
}
|
|
27
|
+
async getI18nBaseInstance() {
|
|
28
|
+
if (this.#i18nBase) {
|
|
29
|
+
return this.#i18nBase;
|
|
30
|
+
}
|
|
31
|
+
if (!this.#i18nBasePromise) {
|
|
32
|
+
this.#i18nBasePromise = (async () => {
|
|
33
|
+
const [{ default: i18next }, { default: BackendFS }] = await Promise.all([
|
|
34
|
+
import('i18next'), // Speed optimisation
|
|
35
|
+
import('i18next-fs-backend'), // Speed optimisation
|
|
36
|
+
]);
|
|
37
|
+
const i18NConfig = this.app.getConfig('i18n');
|
|
38
|
+
await i18next.use(BackendFS).init({
|
|
39
|
+
backend: {
|
|
40
|
+
loadPath: `${this.app.foldersConfig.locales}/{{lng}}/{{ns}}.json`,
|
|
41
|
+
addPath: `${this.app.foldersConfig.locales}/{{lng}}/{{ns}}.missing.json`,
|
|
42
|
+
},
|
|
43
|
+
fallbackLng: i18NConfig.fallbackLng,
|
|
44
|
+
preload: i18NConfig.preload,
|
|
45
|
+
saveMissing: i18NConfig.saveMissing,
|
|
46
|
+
debug: i18NConfig.debug,
|
|
47
|
+
});
|
|
48
|
+
this.#i18nBase = i18next;
|
|
49
|
+
return this.#i18nBase;
|
|
50
|
+
})();
|
|
51
|
+
}
|
|
52
|
+
return this.#i18nBasePromise;
|
|
53
|
+
}
|
|
54
|
+
static get loggerGroup() {
|
|
55
|
+
return 'I18n_';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=I18n.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"I18n.js","sourceRoot":"","sources":["../../../src/services/i18n/I18n.ts"],"names":[],"mappings":"AAEA,OAAO,IAAI,MAAM,uBAAuB,CAAC;AAIzC,MAAM,OAAO,IAAK,SAAQ,IAAI;IAC5B,MAAM,GAA4B,EAAE,CAAC;IAErC,SAAS,CAAQ;IACjB,gBAAgB,CAAiB;IAEjC,aAAa,GAAuC;QAClD,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAc;QAChC,QAAQ,EAAE,IAAI;KACf,CAAC;IAEF,KAAK,CAAC,cAAc,CAAC,IAAa;QAChC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAsB,CAAC;QACnE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC,MAAM,EAAE,OAAO,CAClB,aAAa,IAAI,yDAAyD,UAAU,CAAC,WAAW,EAAE,CACnG,CAAC;YACF,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC,aAAa,CAAC;gBACnE,SAAS,EAAE,KAAK;gBAChB,GAAG,EAAE,IAAI;aACV,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,SAAS,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,IAAI,CAAC,gBAAgB,GAAG,CAAC,KAAK,IAAI,EAAE;gBAClC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,GAClD,MAAM,OAAO,CAAC,GAAG,CAAC;oBAChB,MAAM,CAAC,SAAS,CAAC,EAAE,qBAAqB;oBACxC,MAAM,CAAC,oBAAoB,CAAC,EAAE,qBAAqB;iBACpD,CAAC,CAAC;gBACL,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAsB,CAAC;gBAEnE,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC;oBAChC,OAAO,EAAE;wBACP,QAAQ,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,sBAAsB;wBACjE,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,8BAA8B;qBACzE;oBACD,WAAW,EAAE,UAAU,CAAC,WAAW;oBACnC,OAAO,EAAE,UAAU,CAAC,OAAO;oBAC3B,WAAW,EAAE,UAAU,CAAC,WAAW;oBACnC,KAAK,EAAE,UAAU,CAAC,KAAK;iBACxB,CAAC,CAAC;gBACH,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;gBACzB,OAAO,IAAI,CAAC,SAAS,CAAC;YACxB,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED,MAAM,KAAK,WAAW;QACpB,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import Transport from 'winston-transport';
|
|
2
|
+
/**
|
|
3
|
+
* Winston transport wrapper for Sentry that conditionally loads @sentry/node
|
|
4
|
+
* Assumes Sentry is already initialized in the consuming application
|
|
5
|
+
* Only loads the Winston transport if @sentry/node is installed
|
|
6
|
+
*/
|
|
7
|
+
declare class SentryTransport extends Transport {
|
|
8
|
+
private sentryTransport;
|
|
9
|
+
private initializationAttempted;
|
|
10
|
+
constructor(opts?: Transport.TransportStreamOptions);
|
|
11
|
+
private loadSentryTransport;
|
|
12
|
+
log(info: unknown, callback: () => void): void;
|
|
13
|
+
}
|
|
14
|
+
export default SentryTransport;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
2
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
3
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
4
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
return path;
|
|
8
|
+
};
|
|
9
|
+
import Transport from 'winston-transport';
|
|
10
|
+
/**
|
|
11
|
+
* Winston transport wrapper for Sentry that conditionally loads @sentry/node
|
|
12
|
+
* Assumes Sentry is already initialized in the consuming application
|
|
13
|
+
* Only loads the Winston transport if @sentry/node is installed
|
|
14
|
+
*/
|
|
15
|
+
class SentryTransport extends Transport {
|
|
16
|
+
sentryTransport = null;
|
|
17
|
+
initializationAttempted = false;
|
|
18
|
+
constructor(opts = {}) {
|
|
19
|
+
super(opts);
|
|
20
|
+
// Try to load Sentry Winston transport asynchronously
|
|
21
|
+
this.loadSentryTransport(opts);
|
|
22
|
+
}
|
|
23
|
+
async loadSentryTransport(opts) {
|
|
24
|
+
if (this.initializationAttempted) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
this.initializationAttempted = true;
|
|
28
|
+
try {
|
|
29
|
+
// Dynamically import @sentry/node/winston - will fail if not installed
|
|
30
|
+
// Using dynamic import to avoid TypeScript errors when package is not installed
|
|
31
|
+
const sentryWinston = await import(__rewriteRelativeImportExtension('@sentry/node/winston'));
|
|
32
|
+
const SentryWinstonTransport = sentryWinston.default || sentryWinston;
|
|
33
|
+
// Create the actual Sentry transport
|
|
34
|
+
// Assuming Sentry SDK is already initialized by the consuming application
|
|
35
|
+
this.sentryTransport = new SentryWinstonTransport(opts);
|
|
36
|
+
console.log('[Framework] Sentry Winston transport loaded successfully');
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
// Sentry is not installed - this is fine for a framework
|
|
40
|
+
console.log('[Framework] Sentry Winston transport not available (package not installed)');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
log(info, callback) {
|
|
44
|
+
// If Sentry transport is loaded, delegate to it
|
|
45
|
+
if (this.sentryTransport && this.sentryTransport.log) {
|
|
46
|
+
this.sentryTransport.log(info, () => {
|
|
47
|
+
callback();
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// Otherwise, just call the callback (no-op)
|
|
52
|
+
setImmediate(callback);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export default SentryTransport;
|
|
57
|
+
//# sourceMappingURL=SentryTransport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SentryTransport.js","sourceRoot":"","sources":["../../../src/services/logging/SentryTransport.ts"],"names":[],"mappings":";;;;;;;;AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAE1C;;;;GAIG;AACH,MAAM,eAAgB,SAAQ,SAAS;IAC7B,eAAe,GAAqB,IAAI,CAAC;IACzC,uBAAuB,GAAG,KAAK,CAAC;IAExC,YAAY,OAAyC,EAAE;QACrD,KAAK,CAAC,IAAI,CAAC,CAAC;QAEZ,sDAAsD;QACtD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,IAAsC;QACtE,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;QAEpC,IAAI,CAAC;YACH,uEAAuE;YACvE,gFAAgF;YAChF,MAAM,aAAa,GAAG,MAAM,MAAM,kCAAC,sBAAgC,EAAC,CAAC;YACrE,MAAM,sBAAsB,GAAG,aAAa,CAAC,OAAO,IAAI,aAAa,CAAC;YAEtE,qCAAqC;YACrC,0EAA0E;YAC1E,IAAI,CAAC,eAAe,GAAG,IAAI,sBAAsB,CAAC,IAAI,CAAc,CAAC;YAErE,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,yDAAyD;YACzD,OAAO,CAAC,GAAG,CACT,4EAA4E,CAC7E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,GAAG,CAAC,IAAa,EAAE,QAAoB;QACrC,gDAAgD;QAChD,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;YACrD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE;gBAClC,QAAQ,EAAE,CAAC;YACb,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,4CAA4C;YAC5C,YAAY,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;CACF;AAED,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export default ValidateService;
|
|
2
|
+
declare class ValidateService extends Base {
|
|
3
|
+
static drivers: {
|
|
4
|
+
YupValidator: typeof YupValidator;
|
|
5
|
+
CustomValidator: typeof CustomValidator;
|
|
6
|
+
};
|
|
7
|
+
static isValidatorExists(validator: any): boolean;
|
|
8
|
+
static getDriverByValidatorBody(app: any, body?: {}): {};
|
|
9
|
+
constructor(app: any, validator: any);
|
|
10
|
+
validator: {} | null;
|
|
11
|
+
/**
|
|
12
|
+
* Filter middlewares by route path and select all parameters
|
|
13
|
+
*/
|
|
14
|
+
filterRelatedParametersByRoute(middlewares: any, method: any, path: any): any;
|
|
15
|
+
/**
|
|
16
|
+
* Group all middleware(routes + controller) parameters
|
|
17
|
+
*/
|
|
18
|
+
getMiddlewareParams(controllerMiddlewares: any, AllrouteMiddlewares: any, options: any): {
|
|
19
|
+
request: any[];
|
|
20
|
+
query: any[];
|
|
21
|
+
};
|
|
22
|
+
validateSchema(req: any, validator: any, data: any): Promise<any>;
|
|
23
|
+
validateArrayOfSchemas(req: any, validators: any, data: any): Promise<any[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Validate req data. For example req.body, req.query
|
|
26
|
+
*/
|
|
27
|
+
validateReqData(req: any, options: any): Promise<any>;
|
|
28
|
+
}
|
|
29
|
+
import Base from '../../modules/Base.ts';
|
|
30
|
+
import YupValidator from './drivers/YupValidator.js';
|
|
31
|
+
import CustomValidator from './drivers/CustomValidator.js';
|