@adaptivestone/framework 5.0.0-beta.2 → 5.0.0-beta.21
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 +126 -1
- 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 +81 -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 +12 -0
- package/dist/commands/GenerateTypes.js +60 -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 +32 -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 +46 -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 +10 -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 +22 -0
- package/dist/config/log.js +23 -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 +15 -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 +74 -0
- package/dist/controllers/Auth.js +181 -0
- package/dist/controllers/Auth.js.map +1 -0
- package/dist/controllers/Home.d.ts +15 -0
- package/dist/controllers/Home.js +24 -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 +15 -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 +14 -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 +28 -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/{helpers → dist/helpers}/yup.js +9 -12
- 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 +89 -0
- package/dist/models/Lock.js +99 -0
- package/dist/models/Lock.js.map +1 -0
- package/dist/models/Migration.d.ts +10 -0
- package/dist/models/Migration.js +13 -0
- package/dist/models/Migration.js.map +1 -0
- package/dist/models/Sequence.d.ts +27 -0
- package/dist/models/Sequence.js +19 -0
- package/dist/models/Sequence.js.map +1 -0
- package/dist/models/User.d.ts +2372 -0
- package/dist/models/User.js +280 -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 +34 -0
- package/dist/modules/AbstractCommand.js +48 -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 +90 -0
- package/dist/modules/AbstractController.js +324 -0
- package/dist/modules/AbstractController.js.map +1 -0
- package/dist/modules/AbstractModel.d.ts +29 -0
- package/dist/modules/AbstractModel.js +43 -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 +41 -0
- package/dist/modules/BaseModel.js +36 -0
- package/dist/modules/BaseModel.js.map +1 -0
- package/dist/server.d.ts +121 -0
- package/dist/server.js +432 -0
- package/dist/server.js.map +1 -0
- package/dist/services/cache/Cache.d.ts +31 -0
- package/dist/services/cache/Cache.js +115 -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 +134 -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 +71 -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 +43 -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 +10 -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 +19 -0
- package/dist/services/http/middleware/GetUserByToken.js +40 -0
- package/dist/services/http/middleware/GetUserByToken.js.map +1 -0
- package/dist/services/http/middleware/I18n.d.ts +26 -0
- package/dist/services/http/middleware/I18n.js +97 -0
- package/dist/services/http/middleware/I18n.js.map +1 -0
- package/dist/services/http/middleware/IpDetector.d.ts +12 -0
- package/dist/services/http/middleware/IpDetector.js +51 -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 +47 -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 +18 -0
- package/dist/services/http/middleware/RateLimiter.js +106 -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 +9 -0
- package/dist/services/http/middleware/Role.js +24 -0
- package/dist/services/http/middleware/Role.js.map +1 -0
- package/dist/services/validate/ValidateService.d.ts +31 -0
- package/dist/services/validate/ValidateService.js +96 -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 +32 -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/globalSetupVitest.d.ts +2 -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 +99 -0
- package/dist/tests/setupVitest.js.map +1 -0
- package/package.json +38 -23
- 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/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 -86
- 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 -429
- 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,51 @@
|
|
|
1
|
+
import { BlockList } from 'node:net';
|
|
2
|
+
import AbstractMiddleware from "./AbstractMiddleware.js";
|
|
3
|
+
class IpDetector extends AbstractMiddleware {
|
|
4
|
+
static get description() {
|
|
5
|
+
return 'Detect real user IP address. Support proxy and load balancer';
|
|
6
|
+
}
|
|
7
|
+
blockList;
|
|
8
|
+
constructor(app, params) {
|
|
9
|
+
super(app, params);
|
|
10
|
+
const { trustedProxy } = this.app.getConfig('ipDetector');
|
|
11
|
+
this.blockList = new BlockList();
|
|
12
|
+
for (const subnet of trustedProxy) {
|
|
13
|
+
const addressType = subnet.includes(':') ? 'ipv6' : 'ipv4';
|
|
14
|
+
if (subnet.includes('/')) {
|
|
15
|
+
// CIDR
|
|
16
|
+
const [realSubnet, prefixLength] = subnet.split('/');
|
|
17
|
+
this.blockList.addSubnet(realSubnet, parseInt(prefixLength, 10), addressType);
|
|
18
|
+
}
|
|
19
|
+
else if (subnet.includes('-')) {
|
|
20
|
+
// RANGE
|
|
21
|
+
const [start, end] = subnet.split('-');
|
|
22
|
+
this.blockList.addRange(start, end, addressType);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
// just an address
|
|
26
|
+
this.blockList.addAddress(subnet, addressType);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async middleware(req, res, next) {
|
|
31
|
+
const { headers } = this.app.getConfig('ipDetector');
|
|
32
|
+
const initialIp = req.socket.remoteAddress;
|
|
33
|
+
req.appInfo.ip = initialIp;
|
|
34
|
+
const addressType = initialIp?.includes(':') ? 'ipv6' : 'ipv4';
|
|
35
|
+
if (this.blockList.check(initialIp ?? '', addressType)) {
|
|
36
|
+
// we can trust this source
|
|
37
|
+
for (const header of headers) {
|
|
38
|
+
// in a range
|
|
39
|
+
const ipHeader = req.headers[header.toLowerCase()];
|
|
40
|
+
if (ipHeader) {
|
|
41
|
+
const [firstIp] = ipHeader.split(',').map((ip) => ip.trim());
|
|
42
|
+
req.appInfo.ip = firstIp;
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
next();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export default IpDetector;
|
|
51
|
+
//# sourceMappingURL=IpDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IpDetector.js","sourceRoot":"","sources":["../../../../src/services/http/middleware/IpDetector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AAMzD,MAAM,UAAW,SAAQ,kBAAkB;IACzC,MAAM,KAAK,WAAW;QACpB,OAAO,8DAA8D,CAAC;IACxE,CAAC;IAED,SAAS,CAAY;IAErB,YAAY,GAAS,EAAE,MAAY;QACjC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACnB,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAE1D,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;QAEjC,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;YAClC,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YAC3D,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzB,OAAO;gBACP,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACrD,IAAI,CAAC,SAAS,CAAC,SAAS,CACtB,UAAU,EACV,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC,EAC1B,WAAW,CACZ,CAAC;YACJ,CAAC;iBAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChC,QAAQ;gBACR,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACvC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,kBAAkB;gBAClB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAqB,EAAE,GAAa,EAAE,IAAkB;QACvE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3C,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC;QAC3B,MAAM,WAAW,GAAG,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAE/D,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,EAAE,WAAW,CAAC,EAAE,CAAC;YACvD,2BAA2B;YAC3B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,aAAa;gBACb,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAW,CAAC;gBAC7D,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC7D,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC;oBACzB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,EAAE,CAAC;IACT,CAAC;CACF;AAED,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import AbstractMiddleware from './AbstractMiddleware.ts';
|
|
2
|
+
import type { Response, NextFunction } from 'express';
|
|
3
|
+
import type { FrameworkRequest } from '../HttpServer.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,47 @@
|
|
|
1
|
+
import { object, number } 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
|
+
// eslint-disable-next-line class-methods-use-this
|
|
11
|
+
get relatedQueryParameters() {
|
|
12
|
+
return object().shape({
|
|
13
|
+
page: number(),
|
|
14
|
+
limit: number(),
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
async middleware(req, res, next) {
|
|
18
|
+
let { limit, maxLimit } = this.params;
|
|
19
|
+
limit = (typeof limit !== 'number' ? parseInt(limit, 10) : limit) || 10;
|
|
20
|
+
maxLimit =
|
|
21
|
+
(typeof maxLimit !== 'number' ? parseInt(maxLimit, 10) : maxLimit) || 100;
|
|
22
|
+
req.appInfo.pagination = {
|
|
23
|
+
page: typeof req?.query?.page === 'string'
|
|
24
|
+
? parseInt(req?.query?.page, 10) || 1
|
|
25
|
+
: 1,
|
|
26
|
+
limit: typeof req?.query?.limit === 'string'
|
|
27
|
+
? parseInt(req?.query?.limit, 10) || 0
|
|
28
|
+
: limit,
|
|
29
|
+
skip: 0,
|
|
30
|
+
};
|
|
31
|
+
if (req.appInfo.pagination.limit > maxLimit) {
|
|
32
|
+
req.appInfo.pagination.limit = maxLimit;
|
|
33
|
+
}
|
|
34
|
+
if (req.appInfo.pagination.page < 1) {
|
|
35
|
+
req.appInfo.pagination.page = 1;
|
|
36
|
+
}
|
|
37
|
+
if (req.appInfo.pagination.limit < 0) {
|
|
38
|
+
req.appInfo.pagination.limit = 0;
|
|
39
|
+
}
|
|
40
|
+
req.appInfo.pagination.skip =
|
|
41
|
+
req.appInfo.pagination.page * req.appInfo.pagination.limit -
|
|
42
|
+
req.appInfo.pagination.limit;
|
|
43
|
+
return next();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export default Pagination;
|
|
47
|
+
//# sourceMappingURL=Pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pagination.js","sourceRoot":"","sources":["../../../../src/services/http/middleware/Pagination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AACrC,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AAezD;;GAEG;AACH,MAAM,UAAW,SAAQ,kBAAkB;IACzC,MAAM,KAAK,WAAW;QACpB,OAAO,yEAAyE,CAAC;IACnF,CAAC;IAED,kDAAkD;IAClD,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,GAAa,EACb,IAAkB;QAElB,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QAEtC,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 AbstractMiddleware from './AbstractMiddleware.ts';
|
|
2
|
+
import type { Response, NextFunction } from 'express';
|
|
3
|
+
import type { FrameworkRequest } from '../HttpServer.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-ignore
|
|
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":"AAAA,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AAKzD,MAAM,cAAe,SAAQ,kBAAkB;IAC7C,MAAM,KAAK,WAAW;QACpB,OAAO,oDAAoD,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAqB,EAAE,GAAa,EAAE,IAAkB;QACvE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACjB,YAAY;YACZ,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,18 @@
|
|
|
1
|
+
import { RateLimiterRedis } from 'rate-limiter-flexible';
|
|
2
|
+
import AbstractMiddleware from './AbstractMiddleware.ts';
|
|
3
|
+
import type { Response, NextFunction } from 'express';
|
|
4
|
+
import type { RateLimiterAbstract } from 'rate-limiter-flexible';
|
|
5
|
+
import type { FrameworkRequest } from '../HttpServer.ts';
|
|
6
|
+
import type { GetUserByTokenAppInfo } from './GetUserByToken.ts';
|
|
7
|
+
import type { IApp } from '../../../server.ts';
|
|
8
|
+
import type rateLimiterConfig from '../../../config/rateLimiter.js';
|
|
9
|
+
declare class RateLimiter extends AbstractMiddleware {
|
|
10
|
+
static get description(): string;
|
|
11
|
+
finalOptions: typeof rateLimiterConfig;
|
|
12
|
+
limiter: RateLimiterAbstract;
|
|
13
|
+
constructor(app: IApp, params?: any);
|
|
14
|
+
initRedisLimiter(): RateLimiterRedis;
|
|
15
|
+
gerenateConsumeKey(req: FrameworkRequest & GetUserByTokenAppInfo): string;
|
|
16
|
+
middleware(req: FrameworkRequest, res: Response, next: NextFunction): Promise<void | Response<any, Record<string, any>>>;
|
|
17
|
+
}
|
|
18
|
+
export default RateLimiter;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { RateLimiterMemory, RateLimiterRedis, RateLimiterMongo, } from 'rate-limiter-flexible';
|
|
2
|
+
import merge from 'deepmerge';
|
|
3
|
+
import { createClient } from '@redis/client';
|
|
4
|
+
import mongoose from 'mongoose';
|
|
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
|
+
...this.finalOptions.limiterOptions,
|
|
27
|
+
});
|
|
28
|
+
break;
|
|
29
|
+
default:
|
|
30
|
+
this.logger?.error(`Unknwon option for driver ${this.finalOptions.driver}`);
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
initRedisLimiter() {
|
|
35
|
+
const redisConfig = this.app.getConfig('redis');
|
|
36
|
+
const redisClient = createClient({
|
|
37
|
+
url: redisConfig.url,
|
|
38
|
+
});
|
|
39
|
+
// TODO: change it
|
|
40
|
+
(async () => {
|
|
41
|
+
await redisClient.connect();
|
|
42
|
+
})();
|
|
43
|
+
redisClient.on('error', (error, b, c) => {
|
|
44
|
+
this.logger?.error(error, b, c);
|
|
45
|
+
});
|
|
46
|
+
redisClient.on('connect', () => {
|
|
47
|
+
this.logger?.info('Redis connection success');
|
|
48
|
+
});
|
|
49
|
+
this.app.events.on('shutdown', async () => {
|
|
50
|
+
await redisClient.disconnect();
|
|
51
|
+
});
|
|
52
|
+
return new RateLimiterRedis({
|
|
53
|
+
storeClient: redisClient,
|
|
54
|
+
useRedisPackage: true,
|
|
55
|
+
...this.finalOptions.limiterOptions,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
gerenateConsumeKey(req) {
|
|
59
|
+
const { ip, route, user, request } = this.finalOptions.consumeKeyComponents;
|
|
60
|
+
const key = [];
|
|
61
|
+
if (ip) {
|
|
62
|
+
if (!req.appInfo.ip) {
|
|
63
|
+
this.logger?.error(`RateLimiter: Can't get remote address from request. Please check that you used IpDetecor middleware before RateLimiter`);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
key.push(req.appInfo.ip);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (route) {
|
|
70
|
+
key.push(`${req.baseUrl ?? ''}${req.path ?? ''}`); // to avoid quesry params
|
|
71
|
+
}
|
|
72
|
+
if (user && req.appInfo?.user) {
|
|
73
|
+
key.push(req.appInfo?.user.id);
|
|
74
|
+
}
|
|
75
|
+
if (request && request.length) {
|
|
76
|
+
request.forEach((val) => {
|
|
77
|
+
if (req.body && req.body[val]) {
|
|
78
|
+
key.push(req.body[val]);
|
|
79
|
+
}
|
|
80
|
+
// if (req.appInfo.request && req.appInfo.request[val]) {
|
|
81
|
+
// key.push(req.appInfo.request[val]);
|
|
82
|
+
// }
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return key.join('_');
|
|
86
|
+
}
|
|
87
|
+
async middleware(req, res, next) {
|
|
88
|
+
if (!this.limiter) {
|
|
89
|
+
this.logger?.info(`RateLimiter not inited correclty! Please check init logs `);
|
|
90
|
+
return res.status(500).json({ message: 'RateLimiter error' });
|
|
91
|
+
}
|
|
92
|
+
const { namespace } = this.app.getConfig('redis');
|
|
93
|
+
const consumeKey = `${namespace}-${this.gerenateConsumeKey(req)}`;
|
|
94
|
+
const consumeResult = await this.limiter
|
|
95
|
+
.consume(consumeKey, this.finalOptions.consumePoints)
|
|
96
|
+
.catch(() => {
|
|
97
|
+
this.logger?.warn(`Too many requests. Consume key: ${consumeKey}`);
|
|
98
|
+
});
|
|
99
|
+
if (consumeResult) {
|
|
100
|
+
return next();
|
|
101
|
+
}
|
|
102
|
+
return res.status(429).json({ message: 'Too Many Requests' });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export default RateLimiter;
|
|
106
|
+
//# sourceMappingURL=RateLimiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RateLimiter.js","sourceRoot":"","sources":["../../../../src/services/http/middleware/RateLimiter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,MAAM,WAAW,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AAUzD,MAAM,WAAY,SAAQ,kBAAkB;IAC1C,MAAM,KAAK,WAAW;QACpB,OAAO,iFAAiF,CAAC;IAC3F,CAAC;IAED,YAAY,CAA2B;IACvC,OAAO,CAAuB;IAE9B,YAAY,GAAS,EAAE,MAAY;QACjC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACnB,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAEzD,IAAI,CAAC,YAAY,GAAG,KAAK,CACvB,cAAc,EACd,MAAM,IAAI,EAAE,CACe,CAAC;QAE9B,QAAQ,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YACjC,KAAK,QAAQ;gBACX,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;gBACvE,MAAM;YAER,KAAK,OAAO;gBACV,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACvC,MAAM;YAER,KAAK,OAAO;gBACV,IAAI,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC;oBAClC,WAAW,EAAE,QAAQ,CAAC,UAAU;oBAChC,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc;iBACpC,CAAC,CAAC;gBACH,MAAM;YAER;gBACE,IAAI,CAAC,MAAM,EAAE,KAAK,CAChB,6BAA6B,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CACxD,CAAC;gBACF,MAAM;QACV,CAAC;IACH,CAAC;IAED,gBAAgB;QACd,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,YAAY,CAAC;YAC/B,GAAG,EAAE,WAAW,CAAC,GAAG;SACrB,CAAC,CAAC;QAEH,kBAAkB;QAClB,CAAC,KAAK,IAAI,EAAE;YACV,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC,CAAC,EAAE,CAAC;QAEL,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YACtC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YAC7B,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;YACxC,MAAM,WAAW,CAAC,UAAU,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,gBAAgB,CAAC;YAC1B,WAAW,EAAE,WAAW;YACxB,eAAe,EAAE,IAAI;YACrB,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc;SACpC,CAAC,CAAC;IACL,CAAC;IAED,kBAAkB,CAAC,GAA6C;QAC9D,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC;QAE5E,MAAM,GAAG,GAAG,EAAE,CAAC;QACf,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;gBACpB,IAAI,CAAC,MAAM,EAAE,KAAK,CAChB,wHAAwH,CACzH,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,IAAI,KAAK,EAAE,CAAC;YACV,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,yBAAyB;QAC9E,CAAC;QACD,IAAI,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;YAC9B,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAC9B,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACtB,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC9B,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1B,CAAC;gBACD,yDAAyD;gBACzD,wCAAwC;gBACxC,IAAI;YACN,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAqB,EAAE,GAAa,EAAE,IAAkB;QACvE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,EAAE,IAAI,CACf,2DAA2D,CAC5D,CAAC;YACF,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAElD,MAAM,UAAU,GAAG,GAAG,SAAS,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;QAElE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO;aACrC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;aACpD,KAAK,CAAC,GAAG,EAAE;YACV,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,mCAAmC,UAAU,EAAE,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QACL,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QACD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAChE,CAAC;CACF;AAED,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import AbstractMiddleware from './AbstractMiddleware.ts';
|
|
2
|
+
import type { Response, NextFunction } from 'express';
|
|
3
|
+
import type { FrameworkRequest } from '../HttpServer.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":"AAAA,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AAIzD,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 AbstractMiddleware from './AbstractMiddleware.ts';
|
|
2
|
+
import type { Response, NextFunction } from 'express';
|
|
3
|
+
import type { FrameworkRequest } from '../HttpServer.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":"AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AAKzD,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,MAAM,CAAC;QACX,IAAI,KAAK,CAAC;QACV,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,9 @@
|
|
|
1
|
+
import AbstractMiddleware from './AbstractMiddleware.ts';
|
|
2
|
+
import type { Response, NextFunction } from 'express';
|
|
3
|
+
import type { FrameworkRequest } from '../HttpServer.ts';
|
|
4
|
+
import type { GetUserByTokenAppInfo } from './GetUserByToken.ts';
|
|
5
|
+
declare class RoleMiddleware extends AbstractMiddleware {
|
|
6
|
+
static get description(): string;
|
|
7
|
+
middleware(req: FrameworkRequest & GetUserByTokenAppInfo, res: Response, next: NextFunction): Promise<void | Response<any, Record<string, any>>>;
|
|
8
|
+
}
|
|
9
|
+
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":"AAAA,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AAMzD,MAAM,cAAe,SAAQ,kBAAkB;IAC7C,MAAM,KAAK,WAAW;QACpB,OAAO,uIAAuI,CAAC;IACjJ,CAAC;IAED,KAAK,CAAC,UAAU,CACd,GAA6C,EAC7C,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,CAAC,OAAO,CAAC,CAAC,IAAY,EAAE,EAAE;YAClC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,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,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';
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { isSchema } from 'yup';
|
|
2
|
+
import YupValidator from './drivers/YupValidator.js';
|
|
3
|
+
import CustomValidator from './drivers/CustomValidator.js';
|
|
4
|
+
import Base from "../../modules/Base.js";
|
|
5
|
+
class ValidateService extends Base {
|
|
6
|
+
constructor(app, validator) {
|
|
7
|
+
super(app);
|
|
8
|
+
this.validator = validator
|
|
9
|
+
? ValidateService.getDriverByValidatorBody(app, validator)
|
|
10
|
+
: null;
|
|
11
|
+
}
|
|
12
|
+
static drivers = {
|
|
13
|
+
YupValidator,
|
|
14
|
+
CustomValidator,
|
|
15
|
+
};
|
|
16
|
+
static isValidatorExists(validator) {
|
|
17
|
+
if (!(validator instanceof Object)) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
return Object.values(this.drivers).some((driver) => validator instanceof driver);
|
|
21
|
+
}
|
|
22
|
+
static getDriverByValidatorBody(app, body = {}) {
|
|
23
|
+
if (this.isValidatorExists(body)) {
|
|
24
|
+
return body;
|
|
25
|
+
}
|
|
26
|
+
if (isSchema(body)) {
|
|
27
|
+
const yupValidator = new YupValidator(app, body);
|
|
28
|
+
return yupValidator;
|
|
29
|
+
}
|
|
30
|
+
const customValidator = new CustomValidator(app, body);
|
|
31
|
+
return customValidator;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Filter middlewares by route path and select all parameters
|
|
35
|
+
*/
|
|
36
|
+
filterRelatedParametersByRoute(middlewares, method, path) {
|
|
37
|
+
const middlewaresParams = middlewares
|
|
38
|
+
.filter((middleware) => middleware.method.toLowerCase() === method.toLowerCase() &&
|
|
39
|
+
middleware.fullPath.toLowerCase() === path.toLowerCase())
|
|
40
|
+
?.map((middleware) => {
|
|
41
|
+
const instance = new middleware.MiddlewareFunction(this.app, middleware.params);
|
|
42
|
+
return instance.relatedReqParameters;
|
|
43
|
+
});
|
|
44
|
+
return middlewaresParams;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Group all middleware(routes + controller) parameters
|
|
48
|
+
*/
|
|
49
|
+
getMiddlewareParams(controllerMiddlewares, AllrouteMiddlewares, options) {
|
|
50
|
+
const { method, path } = options;
|
|
51
|
+
const routeMiddlewaresParams = this.filterRelatedParametersByRoute(AllrouteMiddlewares, method, path);
|
|
52
|
+
const controllerMiddlewaresParams = this.filterRelatedParametersByRoute(controllerMiddlewares, method, path);
|
|
53
|
+
return {
|
|
54
|
+
request: [
|
|
55
|
+
...controllerMiddlewaresParams.map((x) => x.request),
|
|
56
|
+
...routeMiddlewaresParams.map((x) => x.request),
|
|
57
|
+
],
|
|
58
|
+
query: [
|
|
59
|
+
...controllerMiddlewaresParams.map((x) => x.query),
|
|
60
|
+
...routeMiddlewaresParams.map((x) => x.query),
|
|
61
|
+
],
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// eslint-disable-next-line class-methods-use-this
|
|
65
|
+
async validateSchema(req, validator, data) {
|
|
66
|
+
if (!validator) {
|
|
67
|
+
return {};
|
|
68
|
+
}
|
|
69
|
+
await validator.validateFields(data, req);
|
|
70
|
+
return validator.castFields(data, req);
|
|
71
|
+
}
|
|
72
|
+
async validateArrayOfSchemas(req, validators, data) {
|
|
73
|
+
const result = [];
|
|
74
|
+
for (const validator of validators) {
|
|
75
|
+
const formatedValidator = ValidateService.getDriverByValidatorBody(this.app, validator);
|
|
76
|
+
result.push(this.validateSchema(req, formatedValidator, data));
|
|
77
|
+
}
|
|
78
|
+
return Promise.all(result);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Validate req data. For example req.body, req.query
|
|
82
|
+
*/
|
|
83
|
+
async validateReqData(req, options) {
|
|
84
|
+
const { selectedReqData, additionalMiddlewareFieldsData } = options;
|
|
85
|
+
const { middlewaresInfo, routeMiddlewaresReg, options: routeOptions, } = additionalMiddlewareFieldsData;
|
|
86
|
+
let validatedFields = await this.validateSchema(req, this.validator, selectedReqData);
|
|
87
|
+
const additionalMiddlewareSchemas = this.getMiddlewareParams(middlewaresInfo, routeMiddlewaresReg, routeOptions)[routeOptions.prefix];
|
|
88
|
+
if (additionalMiddlewareSchemas.length) {
|
|
89
|
+
const middlewareValidatedFields = await this.validateArrayOfSchemas(req, additionalMiddlewareSchemas, selectedReqData);
|
|
90
|
+
validatedFields = Object.assign({}, validatedFields, ...middlewareValidatedFields);
|
|
91
|
+
}
|
|
92
|
+
return validatedFields;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export default ValidateService;
|
|
96
|
+
//# sourceMappingURL=ValidateService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValidateService.js","sourceRoot":"","sources":["../../../src/services/validate/ValidateService.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export default AbstractValidator;
|
|
2
|
+
declare class AbstractValidator extends Base {
|
|
3
|
+
static convertFieldsToJson(fields: any): {};
|
|
4
|
+
constructor(app: any, body: any);
|
|
5
|
+
body: any;
|
|
6
|
+
get fieldsInJsonFormat(): {};
|
|
7
|
+
validateFields(data: any, { query, body, appInfo }: {
|
|
8
|
+
query: any;
|
|
9
|
+
body: any;
|
|
10
|
+
appInfo: any;
|
|
11
|
+
}): Promise<boolean>;
|
|
12
|
+
castFields(): Promise<boolean>;
|
|
13
|
+
}
|
|
14
|
+
import Base from '../../../modules/Base.ts';
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import Base from "../../../modules/Base.js";
|
|
2
|
+
class AbstractValidator extends Base {
|
|
3
|
+
constructor(app, body) {
|
|
4
|
+
super(app);
|
|
5
|
+
this.body = body;
|
|
6
|
+
}
|
|
7
|
+
// eslint-disable-next-line no-unused-vars
|
|
8
|
+
static convertFieldsToJson(fields) {
|
|
9
|
+
// IMPLENT;
|
|
10
|
+
return {};
|
|
11
|
+
}
|
|
12
|
+
// eslint-disable-next-line class-methods-use-this
|
|
13
|
+
get fieldsInJsonFormat() {
|
|
14
|
+
// IMPLENT;
|
|
15
|
+
return {};
|
|
16
|
+
}
|
|
17
|
+
// eslint-disable-next-line class-methods-use-this, no-unused-vars
|
|
18
|
+
async validateFields(data, { query, body, appInfo }) {
|
|
19
|
+
// IMPLENT;
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
// eslint-disable-next-line class-methods-use-this
|
|
23
|
+
async castFields() {
|
|
24
|
+
// IMPLENT;
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
static get loggerGroup() {
|
|
28
|
+
return 'AbstractValidator_';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export default AbstractValidator;
|
|
32
|
+
//# sourceMappingURL=AbstractValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractValidator.js","sourceRoot":"","sources":["../../../../src/services/validate/drivers/AbstractValidator.js"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,0BAA0B,CAAC;AAE5C,MAAM,iBAAkB,SAAQ,IAAI;IAClC,YAAY,GAAG,EAAE,IAAI;QACnB,KAAK,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,0CAA0C;IAC1C,MAAM,CAAC,mBAAmB,CAAC,MAAM;QAC/B,WAAW;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,kDAAkD;IAClD,IAAI,kBAAkB;QACpB,WAAW;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,kEAAkE;IAClE,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE;QACjD,WAAW;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kDAAkD;IAClD,KAAK,CAAC,UAAU;QACd,WAAW;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,WAAW;QACpB,OAAO,oBAAoB,CAAC;IAC9B,CAAC;CACF;AACD,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export default CustomValidator;
|
|
2
|
+
declare class CustomValidator extends AbstractValidator {
|
|
3
|
+
validateFields(data: any, { query, body, appInfo }: {
|
|
4
|
+
query: any;
|
|
5
|
+
body: any;
|
|
6
|
+
appInfo: any;
|
|
7
|
+
}): Promise<void>;
|
|
8
|
+
castFields(data: any, { query, body, appInfo }: {
|
|
9
|
+
query: any;
|
|
10
|
+
body: any;
|
|
11
|
+
appInfo: any;
|
|
12
|
+
}): Promise<any>;
|
|
13
|
+
}
|
|
14
|
+
import AbstractValidator from './AbstractValidator.js';
|