@adaptivestone/framework 5.0.0-beta.4 → 5.0.0-beta.41
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 +1117 -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/redis/redisConnection.d.ts +6 -0
- package/dist/helpers/redis/redisConnection.js +48 -0
- package/dist/helpers/redis/redisConnection.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 +95 -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 +102 -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 +26 -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 +27 -0
- package/dist/services/http/middleware/GetUserByToken.js +47 -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 +102 -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 +13 -0
- package/dist/services/logging/SentryTransport.js +121 -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 +53 -40
- 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,76 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import { format, join, parse } from 'node:path';
|
|
3
|
+
const getFilesPathWithInheritance = async ({ internalFolder, externalFolder, logger, loggerFileType = '', filter: { startWithCapital = true, notTests = true, notHidden = true } = {}, }) => {
|
|
4
|
+
const [internalFiles, externalFiles] = await Promise.all([
|
|
5
|
+
fs.readdir(internalFolder, { recursive: true, withFileTypes: true }),
|
|
6
|
+
fs.readdir(externalFolder, { recursive: true, withFileTypes: true }),
|
|
7
|
+
]);
|
|
8
|
+
const filterIndexFile = (fileDirent) => {
|
|
9
|
+
if (!fileDirent.isFile()) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
const fileArray = fileDirent.name.split('/');
|
|
13
|
+
const file = fileArray[fileArray.length - 1];
|
|
14
|
+
if (startWithCapital && file[0] !== file[0].toUpperCase()) {
|
|
15
|
+
// not start with capital
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
if (notTests &&
|
|
19
|
+
(file.endsWith('.test.js') ||
|
|
20
|
+
file.endsWith('.test.ts') ||
|
|
21
|
+
file.endsWith('.d.ts'))) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
if (!file.endsWith('.js') && !file.endsWith('.ts')) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
if (notHidden && file[0] === '.') {
|
|
28
|
+
// not start with dot
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
return true;
|
|
32
|
+
};
|
|
33
|
+
const internalFilesString = internalFiles
|
|
34
|
+
.filter(filterIndexFile)
|
|
35
|
+
.map((fileDirent) => join(fileDirent.parentPath, fileDirent.name)
|
|
36
|
+
.replace(`${internalFolder}/`, '')
|
|
37
|
+
.replace(`${internalFolder}`, ''));
|
|
38
|
+
const externalFilesString = externalFiles
|
|
39
|
+
.filter(filterIndexFile)
|
|
40
|
+
.map((fileDirent) => join(fileDirent.parentPath, fileDirent.name)
|
|
41
|
+
.replace(`${externalFolder}/`, '')
|
|
42
|
+
.replace(`${externalFolder}`, ''));
|
|
43
|
+
const filesToLoad = [];
|
|
44
|
+
for (const file of internalFilesString) {
|
|
45
|
+
const fileDetails = parse(file);
|
|
46
|
+
const jsFile = format({
|
|
47
|
+
dir: fileDetails.dir,
|
|
48
|
+
name: fileDetails.name,
|
|
49
|
+
ext: '.js',
|
|
50
|
+
});
|
|
51
|
+
const tsFile = format({
|
|
52
|
+
dir: fileDetails.dir,
|
|
53
|
+
name: fileDetails.name,
|
|
54
|
+
ext: '.ts',
|
|
55
|
+
});
|
|
56
|
+
if (externalFilesString.includes(jsFile) ||
|
|
57
|
+
externalFilesString.includes(tsFile)) {
|
|
58
|
+
logger(`Skipping register INTERNAL file '${file}' ${loggerFileType ? `of type ${loggerFileType}` : ''} as it override by EXTERNAL ONE`);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
filesToLoad.push({
|
|
62
|
+
path: join(internalFolder, file),
|
|
63
|
+
file,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
for (const file of externalFilesString) {
|
|
68
|
+
filesToLoad.push({
|
|
69
|
+
path: join(externalFolder, file),
|
|
70
|
+
file,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return filesToLoad;
|
|
74
|
+
};
|
|
75
|
+
export { getFilesPathWithInheritance };
|
|
76
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/helpers/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const levels = ['error', 'warn', 'info', 'debug'];
|
|
2
|
+
function isLogLevel(level) {
|
|
3
|
+
return (typeof level === 'string' &&
|
|
4
|
+
levels.includes(level));
|
|
5
|
+
}
|
|
6
|
+
const consoleLogger = (level, message) => {
|
|
7
|
+
const configuredLevelIndex = isLogLevel(level) ? levels.indexOf(level) : -1;
|
|
8
|
+
const currentLevelIndex = levels.indexOf(level);
|
|
9
|
+
const shouldLog = configuredLevelIndex === -1 || configuredLevelIndex >= currentLevelIndex;
|
|
10
|
+
if (shouldLog) {
|
|
11
|
+
if (console[level]) {
|
|
12
|
+
console[level](message);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
console.log(message);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
export { levels, consoleLogger };
|
|
20
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/helpers/logger.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAI3D,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACxB,MAAgC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAClD,CAAC;AACJ,CAAC;AAED,MAAM,aAAa,GAAG,CAAC,KAAe,EAAE,OAAe,EAAE,EAAE;IACzD,MAAM,oBAAoB,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,SAAS,GACb,oBAAoB,KAAK,CAAC,CAAC,IAAI,oBAAoB,IAAI,iBAAiB,CAAC;IAC3E,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const clearNamespace = async (redisClient, namespace) => {
|
|
2
|
+
const deletedKeys = [];
|
|
3
|
+
const keys = await redisClient.sendCommand([
|
|
4
|
+
'keys',
|
|
5
|
+
`*${namespace}*`,
|
|
6
|
+
]);
|
|
7
|
+
if (keys && keys.length > 0) {
|
|
8
|
+
for (const key of keys) {
|
|
9
|
+
deletedKeys.push(redisClient.sendCommand(['del', key]));
|
|
10
|
+
}
|
|
11
|
+
await Promise.all(deletedKeys);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=clearNamespace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clearNamespace.js","sourceRoot":"","sources":["../../../src/helpers/redis/clearNamespace.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,WAA4B,EAC5B,SAAiB,EACjB,EAAE;IACF,MAAM,WAAW,GAAG,EAAE,CAAC;IAEvB,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,WAAW,CAAW;QACnD,MAAM;QACN,IAAI,SAAS,GAAG;KACjB,CAAC,CAAC;IAEH,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { RedisClientType } from '@redis/client';
|
|
2
|
+
export declare const getRedisClient: () => Promise<RedisClientType>;
|
|
3
|
+
/**
|
|
4
|
+
* Synchronous way to get redis client. Make sure to call connect on it before usage
|
|
5
|
+
*/
|
|
6
|
+
export declare const getRedisClientSync: () => RedisClientType;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { createClient } from '@redis/client';
|
|
2
|
+
import { appInstance } from "../appInstance.js";
|
|
3
|
+
let redisClient = null;
|
|
4
|
+
export const getRedisClient = async () => {
|
|
5
|
+
if (redisClient) {
|
|
6
|
+
return redisClient;
|
|
7
|
+
}
|
|
8
|
+
const redisClientLocal = createNewRedisClient();
|
|
9
|
+
await redisClientLocal.connect();
|
|
10
|
+
return redisClientLocal;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Synchronous way to get redis client. Make sure to call connect on it before usage
|
|
14
|
+
*/
|
|
15
|
+
export const getRedisClientSync = () => {
|
|
16
|
+
if (redisClient) {
|
|
17
|
+
return redisClient;
|
|
18
|
+
}
|
|
19
|
+
const redisClientLocal = createNewRedisClient();
|
|
20
|
+
// to make sure connection is established
|
|
21
|
+
(async () => {
|
|
22
|
+
await redisClientLocal.connect();
|
|
23
|
+
})();
|
|
24
|
+
return redisClientLocal;
|
|
25
|
+
};
|
|
26
|
+
const createNewRedisClient = () => {
|
|
27
|
+
if (redisClient) {
|
|
28
|
+
return redisClient;
|
|
29
|
+
}
|
|
30
|
+
const redisConfig = appInstance.getConfig('redis');
|
|
31
|
+
redisClient = createClient({
|
|
32
|
+
url: redisConfig.url,
|
|
33
|
+
});
|
|
34
|
+
redisClient.on('error', (error, b, c) => {
|
|
35
|
+
appInstance.logger?.error('Redis Client Error', error, b, c);
|
|
36
|
+
});
|
|
37
|
+
redisClient.on('connect', () => {
|
|
38
|
+
appInstance.logger?.info('Redis connection established');
|
|
39
|
+
});
|
|
40
|
+
appInstance.events.on('shutdown', async () => {
|
|
41
|
+
if (redisClient) {
|
|
42
|
+
await redisClient.quit();
|
|
43
|
+
redisClient = null;
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
return redisClient;
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=redisConnection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redisConnection.js","sourceRoot":"","sources":["../../../src/helpers/redis/redisConnection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,IAAI,WAAW,GAA2B,IAAI,CAAC;AAE/C,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,IAA8B,EAAE;IACjE,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,MAAM,gBAAgB,GAAG,oBAAoB,EAAE,CAAC;IAChD,MAAM,gBAAgB,CAAC,OAAO,EAAE,CAAC;IAEjC,OAAO,gBAAgB,CAAC;AAC1B,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAoB,EAAE;IACtD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,MAAM,gBAAgB,GAAG,oBAAoB,EAAE,CAAC;IAChD,yCAAyC;IACzC,CAAC,KAAK,IAAI,EAAE;QACV,MAAM,gBAAgB,CAAC,OAAO,EAAE,CAAC;IACnC,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO,gBAAgB,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,GAAoB,EAAE;IACjD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,OAAO,CAEhD,CAAC;IAEF,WAAW,GAAG,YAAY,CAAC;QACzB,GAAG,EAAE,WAAW,CAAC,GAAG;KACrB,CAAC,CAAC;IAEH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;QACtC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QAC7B,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;QAC3C,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;YACzB,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Schema } from 'yup';
|
|
2
|
+
/**
|
|
3
|
+
* Validator for file
|
|
4
|
+
* use as
|
|
5
|
+
* @example
|
|
6
|
+
* request: yup.object().shape({
|
|
7
|
+
* someFile: new YupFile().required(),
|
|
8
|
+
* })
|
|
9
|
+
*/
|
|
10
|
+
declare class YupFile extends Schema {
|
|
11
|
+
constructor();
|
|
12
|
+
}
|
|
13
|
+
export { YupFile };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { PersistentFile } from 'formidable';
|
|
2
|
+
import { Schema } from 'yup';
|
|
3
|
+
/**
|
|
4
|
+
* Validator for file
|
|
5
|
+
* use as
|
|
6
|
+
* @example
|
|
7
|
+
* request: yup.object().shape({
|
|
8
|
+
* someFile: new YupFile().required(),
|
|
9
|
+
* })
|
|
10
|
+
*/
|
|
11
|
+
class YupFile extends Schema {
|
|
12
|
+
constructor() {
|
|
13
|
+
super({
|
|
14
|
+
type: 'file',
|
|
15
|
+
check: (value) => Array.isArray(value) &&
|
|
16
|
+
value.every((item) => item instanceof PersistentFile),
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export { YupFile };
|
|
21
|
+
//# sourceMappingURL=yup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yup.js","sourceRoot":"","sources":["../../src/helpers/yup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAE7B;;;;;;;GAOG;AACH,MAAM,OAAQ,SAAQ,MAAM;IAC1B;QACE,KAAK,CAAC;YACJ,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,CAAC,KAAc,EAAE,EAAE,CACxB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACpB,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,YAAY,cAAc,CAAC;SACxD,CAAC,CAAC;IACL,CAAC;CACF;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,mBAAmB,CAAC;AAC7C,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC;AAExC,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;IAC7B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { Schema } from 'mongoose';
|
|
2
|
+
import type { GetModelTypeFromClass, GetModelTypeLiteFromSchema } from '../modules/BaseModel.ts';
|
|
3
|
+
import { BaseModel } from '../modules/BaseModel.ts';
|
|
4
|
+
export type TLock = GetModelTypeFromClass<typeof Lock>;
|
|
5
|
+
declare class Lock extends BaseModel {
|
|
6
|
+
static initHooks(schema: Schema): void;
|
|
7
|
+
static get modelSchema(): {
|
|
8
|
+
readonly _id: {
|
|
9
|
+
readonly type: StringConstructor;
|
|
10
|
+
readonly required: true;
|
|
11
|
+
};
|
|
12
|
+
readonly expiredAt: {
|
|
13
|
+
readonly type: DateConstructor;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
static get modelStatics(): {
|
|
17
|
+
/**
|
|
18
|
+
* acquire lock based on lock name
|
|
19
|
+
* @param {string} name
|
|
20
|
+
* @param {number} [ttlSeconds=30]
|
|
21
|
+
*/
|
|
22
|
+
readonly acquireLock: (this: GetModelTypeLiteFromSchema<{
|
|
23
|
+
readonly _id: {
|
|
24
|
+
readonly type: StringConstructor;
|
|
25
|
+
readonly required: true;
|
|
26
|
+
};
|
|
27
|
+
readonly expiredAt: {
|
|
28
|
+
readonly type: DateConstructor;
|
|
29
|
+
};
|
|
30
|
+
}, {}>, name: string, ttlSeconds?: number) => Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* release lock based on lock name
|
|
33
|
+
* @param {string} name
|
|
34
|
+
*/
|
|
35
|
+
readonly releaseLock: (this: GetModelTypeLiteFromSchema<{
|
|
36
|
+
readonly _id: {
|
|
37
|
+
readonly type: StringConstructor;
|
|
38
|
+
readonly required: true;
|
|
39
|
+
};
|
|
40
|
+
readonly expiredAt: {
|
|
41
|
+
readonly type: DateConstructor;
|
|
42
|
+
};
|
|
43
|
+
}, {}>, name: string) => Promise<boolean>;
|
|
44
|
+
/**
|
|
45
|
+
* wait lock based on lock name
|
|
46
|
+
* @param {string} name
|
|
47
|
+
*/
|
|
48
|
+
readonly waitForUnlock: (this: GetModelTypeLiteFromSchema<{
|
|
49
|
+
readonly _id: {
|
|
50
|
+
readonly type: StringConstructor;
|
|
51
|
+
readonly required: true;
|
|
52
|
+
};
|
|
53
|
+
readonly expiredAt: {
|
|
54
|
+
readonly type: DateConstructor;
|
|
55
|
+
};
|
|
56
|
+
}, {}>, name: string) => Promise<unknown>;
|
|
57
|
+
/**
|
|
58
|
+
* get lock remaining time based on lock name
|
|
59
|
+
* @param {string} name
|
|
60
|
+
*/
|
|
61
|
+
readonly getLockData: (this: GetModelTypeLiteFromSchema<{
|
|
62
|
+
readonly _id: {
|
|
63
|
+
readonly type: StringConstructor;
|
|
64
|
+
readonly required: true;
|
|
65
|
+
};
|
|
66
|
+
readonly expiredAt: {
|
|
67
|
+
readonly type: DateConstructor;
|
|
68
|
+
};
|
|
69
|
+
}, {}>, name: string) => Promise<{
|
|
70
|
+
ttl: number;
|
|
71
|
+
}>;
|
|
72
|
+
/**
|
|
73
|
+
* get lock remaining time based on lock name
|
|
74
|
+
* @param {string[]} names
|
|
75
|
+
*/
|
|
76
|
+
readonly getLocksData: (this: GetModelTypeLiteFromSchema<{
|
|
77
|
+
readonly _id: {
|
|
78
|
+
readonly type: StringConstructor;
|
|
79
|
+
readonly required: true;
|
|
80
|
+
};
|
|
81
|
+
readonly expiredAt: {
|
|
82
|
+
readonly type: DateConstructor;
|
|
83
|
+
};
|
|
84
|
+
}, {}>, names: string[]) => Promise<{
|
|
85
|
+
name: string;
|
|
86
|
+
ttl: number;
|
|
87
|
+
}[]>;
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
export default Lock;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { BaseModel } from "../modules/BaseModel.js";
|
|
2
|
+
class Lock extends BaseModel {
|
|
3
|
+
static initHooks(schema) {
|
|
4
|
+
schema.index({ expiredAt: 1 }, { expireAfterSeconds: 0 });
|
|
5
|
+
}
|
|
6
|
+
static get modelSchema() {
|
|
7
|
+
return {
|
|
8
|
+
_id: { type: String, required: true },
|
|
9
|
+
expiredAt: {
|
|
10
|
+
type: Date,
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
static get modelStatics() {
|
|
15
|
+
return {
|
|
16
|
+
/**
|
|
17
|
+
* acquire lock based on lock name
|
|
18
|
+
* @param {string} name
|
|
19
|
+
* @param {number} [ttlSeconds=30]
|
|
20
|
+
*/
|
|
21
|
+
acquireLock: async function (name, ttlSeconds = 30) {
|
|
22
|
+
try {
|
|
23
|
+
await this.create({
|
|
24
|
+
_id: name,
|
|
25
|
+
expiredAt: new Date(Date.now() + ttlSeconds * 1000),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
if (error.code !== 11000) {
|
|
30
|
+
// not a duplicate keys
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
return true;
|
|
36
|
+
},
|
|
37
|
+
/**
|
|
38
|
+
* release lock based on lock name
|
|
39
|
+
* @param {string} name
|
|
40
|
+
*/
|
|
41
|
+
releaseLock: async function (name) {
|
|
42
|
+
const res = await this.deleteOne({ _id: name });
|
|
43
|
+
if (res.acknowledged && res.deletedCount) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
},
|
|
48
|
+
/**
|
|
49
|
+
* wait lock based on lock name
|
|
50
|
+
* @param {string} name
|
|
51
|
+
*/
|
|
52
|
+
waitForUnlock: async function (name) {
|
|
53
|
+
const res = await this.findOne({ _id: name });
|
|
54
|
+
if (!res) {
|
|
55
|
+
return Promise.resolve();
|
|
56
|
+
}
|
|
57
|
+
return new Promise((resolve) => {
|
|
58
|
+
const stream = this.watch([
|
|
59
|
+
{ $match: { operationType: 'delete', 'documentKey._id': name } },
|
|
60
|
+
]);
|
|
61
|
+
stream.on('change', () => {
|
|
62
|
+
stream.close();
|
|
63
|
+
resolve(true);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
},
|
|
67
|
+
/**
|
|
68
|
+
* get lock remaining time based on lock name
|
|
69
|
+
* @param {string} name
|
|
70
|
+
*/
|
|
71
|
+
getLockData: async function (name) {
|
|
72
|
+
const res = await this.findOne({ _id: name });
|
|
73
|
+
if (!res || !res.expiredAt) {
|
|
74
|
+
return { ttl: 0 };
|
|
75
|
+
}
|
|
76
|
+
return { ttl: res.expiredAt.getTime() - Date.now() };
|
|
77
|
+
},
|
|
78
|
+
/**
|
|
79
|
+
* get lock remaining time based on lock name
|
|
80
|
+
* @param {string[]} names
|
|
81
|
+
*/
|
|
82
|
+
getLocksData: async function (names) {
|
|
83
|
+
const res = await this.find({ _id: { $in: names } });
|
|
84
|
+
const lockMap = new Map(res.map((lock) => [lock._id, lock]));
|
|
85
|
+
return names.map((name) => {
|
|
86
|
+
const lock = lockMap.get(name);
|
|
87
|
+
return {
|
|
88
|
+
name,
|
|
89
|
+
ttl: lock?.expiredAt ? lock.expiredAt.getTime() - Date.now() : 0,
|
|
90
|
+
};
|
|
91
|
+
});
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export default Lock;
|
|
97
|
+
//# sourceMappingURL=Lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Lock.js","sourceRoot":"","sources":["../../src/models/Lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { GetModelTypeFromClass } from '../modules/BaseModel.ts';
|
|
2
|
+
import { BaseModel } from '../modules/BaseModel.ts';
|
|
3
|
+
export type TMigration = GetModelTypeFromClass<typeof Migration>;
|
|
4
|
+
declare class Migration extends BaseModel {
|
|
5
|
+
static get modelSchema(): {
|
|
6
|
+
readonly migrationFile: {
|
|
7
|
+
readonly type: StringConstructor;
|
|
8
|
+
readonly unique: true;
|
|
9
|
+
readonly required: true;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export default Migration;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { BaseModel } from "../modules/BaseModel.js";
|
|
2
|
+
class Migration extends BaseModel {
|
|
3
|
+
static get modelSchema() {
|
|
4
|
+
return {
|
|
5
|
+
migrationFile: {
|
|
6
|
+
type: String,
|
|
7
|
+
unique: true,
|
|
8
|
+
required: true,
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export default Migration;
|
|
14
|
+
//# sourceMappingURL=Migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Migration.js","sourceRoot":"","sources":["../../src/models/Migration.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGpD,MAAM,SAAU,SAAQ,SAAS;IAC/B,MAAM,KAAK,WAAW;QACpB,OAAO;YACL,aAAa,EAAE;gBACb,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,IAAI;gBACZ,QAAQ,EAAE,IAAI;aACf;SACO,CAAC;IACb,CAAC;CACF;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { GetModelTypeFromClass, GetModelTypeLiteFromSchema } from '../modules/BaseModel.ts';
|
|
2
|
+
import { BaseModel } from '../modules/BaseModel.ts';
|
|
3
|
+
export type TSequence = GetModelTypeFromClass<typeof Sequence>;
|
|
4
|
+
declare class Sequence extends BaseModel {
|
|
5
|
+
static get modelSchema(): {
|
|
6
|
+
readonly _id: {
|
|
7
|
+
readonly type: StringConstructor;
|
|
8
|
+
readonly required: true;
|
|
9
|
+
};
|
|
10
|
+
readonly seq: {
|
|
11
|
+
readonly type: NumberConstructor;
|
|
12
|
+
readonly default: 1;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
static get modelStatics(): {
|
|
16
|
+
readonly getSequence: (this: GetModelTypeLiteFromSchema<{
|
|
17
|
+
readonly _id: {
|
|
18
|
+
readonly type: StringConstructor;
|
|
19
|
+
readonly required: true;
|
|
20
|
+
};
|
|
21
|
+
readonly seq: {
|
|
22
|
+
readonly type: NumberConstructor;
|
|
23
|
+
readonly default: 1;
|
|
24
|
+
};
|
|
25
|
+
}, {}>, forType: string) => Promise<number>;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export default Sequence;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { BaseModel } from "../modules/BaseModel.js";
|
|
2
|
+
class Sequence extends BaseModel {
|
|
3
|
+
static get modelSchema() {
|
|
4
|
+
return {
|
|
5
|
+
_id: { type: String, required: true },
|
|
6
|
+
seq: { type: Number, default: 1 },
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
static get modelStatics() {
|
|
10
|
+
return {
|
|
11
|
+
getSequence: async function (forType) {
|
|
12
|
+
const sequence = await this.findByIdAndUpdate({ _id: forType }, { $inc: { seq: 1 } }, { new: true, upsert: true });
|
|
13
|
+
return sequence.seq;
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export default Sequence;
|
|
19
|
+
//# sourceMappingURL=Sequence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sequence.js","sourceRoot":"","sources":["../../src/models/Sequence.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAIpD,MAAM,QAAS,SAAQ,SAAS;IAC9B,MAAM,KAAK,WAAW;QACpB,OAAO;YACL,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;YACrC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE;SACzB,CAAC;IACb,CAAC;IAED,MAAM,KAAK,YAAY;QAKrB,OAAO;YACL,WAAW,EAAE,KAAK,WAEhB,OAAe;gBAEf,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAC3C,EAAE,GAAG,EAAE,OAAO,EAAE,EAChB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EACpB,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAC5B,CAAC;gBACF,OAAO,QAAQ,CAAC,GAAG,CAAC;YACtB,CAAC;SACO,CAAC;IACb,CAAC;CACF;AAED,eAAe,QAAQ,CAAC"}
|