@adaptivestone/framework 5.0.0-beta.11 → 5.0.0-beta.13

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.
Files changed (271) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/LICENCE +1 -1
  3. package/cliCommand.ts +10 -0
  4. package/dist/Cli.d.ts +7 -0
  5. package/dist/Cli.js +19 -0
  6. package/dist/Cli.js.map +1 -0
  7. package/dist/cluster.d.ts +1 -0
  8. package/dist/cluster.js +18 -0
  9. package/dist/cluster.js.map +1 -0
  10. package/dist/commands/CreateUser.d.ts +32 -0
  11. package/dist/commands/CreateUser.js +81 -0
  12. package/dist/commands/CreateUser.js.map +1 -0
  13. package/dist/commands/Documentation.d.ts +5 -0
  14. package/dist/commands/Documentation.js +15 -0
  15. package/dist/commands/Documentation.js.map +1 -0
  16. package/dist/commands/DropIndex.d.ts +16 -0
  17. package/dist/commands/DropIndex.js +30 -0
  18. package/dist/commands/DropIndex.js.map +1 -0
  19. package/dist/commands/GenerateRandomBytes.d.ts +7 -0
  20. package/dist/commands/GenerateRandomBytes.js +18 -0
  21. package/dist/commands/GenerateRandomBytes.js.map +1 -0
  22. package/dist/commands/GetOpenApiJson.d.ts +17 -0
  23. package/dist/commands/GetOpenApiJson.js +272 -0
  24. package/dist/commands/GetOpenApiJson.js.map +1 -0
  25. package/dist/commands/SyncIndexes.d.ts +6 -0
  26. package/dist/commands/SyncIndexes.js +32 -0
  27. package/dist/commands/SyncIndexes.js.map +1 -0
  28. package/dist/commands/migration/Create.d.ts +18 -0
  29. package/dist/commands/migration/Create.js +57 -0
  30. package/dist/commands/migration/Create.js.map +1 -0
  31. package/dist/commands/migration/Migrate.d.ts +6 -0
  32. package/dist/commands/migration/Migrate.js +46 -0
  33. package/dist/commands/migration/Migrate.js.map +1 -0
  34. package/dist/config/auth.d.ts +6 -0
  35. package/dist/config/auth.js +7 -0
  36. package/dist/config/auth.js.map +1 -0
  37. package/dist/config/http.d.ts +8 -0
  38. package/dist/config/http.js +10 -0
  39. package/dist/config/http.js.map +1 -0
  40. package/dist/config/i18n.d.ts +10 -0
  41. package/dist/config/i18n.js +13 -0
  42. package/dist/config/i18n.js.map +1 -0
  43. package/dist/config/ipDetector.d.ts +5 -0
  44. package/dist/config/ipDetector.js +15 -0
  45. package/dist/config/ipDetector.js.map +1 -0
  46. package/dist/config/log.d.ts +22 -0
  47. package/dist/config/log.js +23 -0
  48. package/dist/config/log.js.map +1 -0
  49. package/dist/config/mongo.d.ts +4 -0
  50. package/dist/config/mongo.js +4 -0
  51. package/dist/config/mongo.js.map +1 -0
  52. package/dist/config/rateLimiter.d.ts +15 -0
  53. package/dist/config/rateLimiter.js +17 -0
  54. package/dist/config/rateLimiter.js.map +1 -0
  55. package/dist/config/redis.d.ts +5 -0
  56. package/dist/config/redis.js +5 -0
  57. package/dist/config/redis.js.map +1 -0
  58. package/dist/config/validate.d.ts +4 -0
  59. package/dist/config/validate.js +4 -0
  60. package/dist/config/validate.js.map +1 -0
  61. package/dist/controllers/Auth.d.ts +74 -0
  62. package/dist/controllers/Auth.js +181 -0
  63. package/dist/controllers/Auth.js.map +1 -0
  64. package/dist/controllers/Home.d.ts +15 -0
  65. package/dist/controllers/Home.js +24 -0
  66. package/dist/controllers/Home.js.map +1 -0
  67. package/dist/controllers/index.d.ts +16 -0
  68. package/dist/controllers/index.js +59 -0
  69. package/dist/controllers/index.js.map +1 -0
  70. package/dist/folderConfig.d.ts +34 -0
  71. package/dist/folderConfig.js +15 -0
  72. package/dist/folderConfig.js.map +1 -0
  73. package/dist/helpers/files.d.ts +16 -0
  74. package/dist/helpers/files.js +76 -0
  75. package/dist/helpers/files.js.map +1 -0
  76. package/dist/helpers/logger.d.ts +4 -0
  77. package/dist/helpers/logger.js +28 -0
  78. package/dist/helpers/logger.js.map +1 -0
  79. package/dist/helpers/redis/clearNamespace.d.ts +3 -0
  80. package/dist/helpers/redis/clearNamespace.js +15 -0
  81. package/dist/helpers/redis/clearNamespace.js.map +1 -0
  82. package/dist/helpers/yup.d.ts +13 -0
  83. package/{helpers → dist/helpers}/yup.js +8 -9
  84. package/dist/helpers/yup.js.map +1 -0
  85. package/dist/index.d.ts +1 -0
  86. package/dist/index.js +7 -0
  87. package/dist/index.js.map +1 -0
  88. package/dist/models/Lock.d.ts +62 -0
  89. package/dist/models/Lock.js +94 -0
  90. package/dist/models/Lock.js.map +1 -0
  91. package/dist/models/Migration.d.ts +13 -0
  92. package/dist/models/Migration.js +14 -0
  93. package/dist/models/Migration.js.map +1 -0
  94. package/dist/models/Sequence.d.ts +23 -0
  95. package/dist/models/Sequence.js +16 -0
  96. package/dist/models/Sequence.js.map +1 -0
  97. package/dist/models/User.d.ts +178 -0
  98. package/dist/models/User.js +244 -0
  99. package/dist/models/User.js.map +1 -0
  100. package/dist/modules/AbstractCommand.d.ts +30 -0
  101. package/dist/modules/AbstractCommand.js +44 -0
  102. package/dist/modules/AbstractCommand.js.map +1 -0
  103. package/dist/modules/AbstractConnector.d.ts +5 -0
  104. package/dist/modules/AbstractConnector.js +8 -0
  105. package/dist/modules/AbstractConnector.js.map +1 -0
  106. package/dist/modules/AbstractController.d.ts +90 -0
  107. package/dist/modules/AbstractController.js +324 -0
  108. package/dist/modules/AbstractController.js.map +1 -0
  109. package/dist/modules/AbstractModel.d.ts +29 -0
  110. package/dist/modules/AbstractModel.js +73 -0
  111. package/dist/modules/AbstractModel.js.map +1 -0
  112. package/dist/modules/Base.d.ts +29 -0
  113. package/dist/modules/Base.js +54 -0
  114. package/dist/modules/Base.js.map +1 -0
  115. package/dist/modules/BaseCli.d.ts +25 -0
  116. package/dist/modules/BaseCli.js +138 -0
  117. package/dist/modules/BaseCli.js.map +1 -0
  118. package/dist/server.d.ts +110 -0
  119. package/dist/server.js +372 -0
  120. package/dist/server.js.map +1 -0
  121. package/dist/services/cache/Cache.d.ts +31 -0
  122. package/dist/services/cache/Cache.js +115 -0
  123. package/dist/services/cache/Cache.js.map +1 -0
  124. package/dist/services/documentation/DocumentationGenerator.d.ts +11 -0
  125. package/dist/services/documentation/DocumentationGenerator.js +134 -0
  126. package/dist/services/documentation/DocumentationGenerator.js.map +1 -0
  127. package/dist/services/http/HttpServer.d.ts +35 -0
  128. package/dist/services/http/HttpServer.js +71 -0
  129. package/dist/services/http/HttpServer.js.map +1 -0
  130. package/dist/services/http/middleware/AbstractMiddleware.d.ts +25 -0
  131. package/dist/services/http/middleware/AbstractMiddleware.js +43 -0
  132. package/dist/services/http/middleware/AbstractMiddleware.js.map +1 -0
  133. package/dist/services/http/middleware/Auth.d.ts +9 -0
  134. package/dist/services/http/middleware/Auth.js +18 -0
  135. package/dist/services/http/middleware/Auth.js.map +1 -0
  136. package/dist/services/http/middleware/Cors.d.ts +10 -0
  137. package/dist/services/http/middleware/Cors.js +36 -0
  138. package/dist/services/http/middleware/Cors.js.map +1 -0
  139. package/dist/services/http/middleware/GetUserByToken.d.ts +19 -0
  140. package/dist/services/http/middleware/GetUserByToken.js +40 -0
  141. package/dist/services/http/middleware/GetUserByToken.js.map +1 -0
  142. package/dist/services/http/middleware/I18n.d.ts +26 -0
  143. package/dist/services/http/middleware/I18n.js +97 -0
  144. package/dist/services/http/middleware/I18n.js.map +1 -0
  145. package/dist/services/http/middleware/IpDetector.d.ts +12 -0
  146. package/dist/services/http/middleware/IpDetector.js +51 -0
  147. package/dist/services/http/middleware/IpDetector.js.map +1 -0
  148. package/dist/services/http/middleware/Pagination.d.ts +27 -0
  149. package/dist/services/http/middleware/Pagination.js +47 -0
  150. package/dist/services/http/middleware/Pagination.js.map +1 -0
  151. package/dist/services/http/middleware/PrepareAppInfo.d.ts +8 -0
  152. package/dist/services/http/middleware/PrepareAppInfo.js +17 -0
  153. package/dist/services/http/middleware/PrepareAppInfo.js.map +1 -0
  154. package/dist/services/http/middleware/RateLimiter.d.ts +18 -0
  155. package/dist/services/http/middleware/RateLimiter.js +106 -0
  156. package/dist/services/http/middleware/RateLimiter.js.map +1 -0
  157. package/dist/services/http/middleware/RequestLogger.d.ts +8 -0
  158. package/dist/services/http/middleware/RequestLogger.js +18 -0
  159. package/dist/services/http/middleware/RequestLogger.js.map +1 -0
  160. package/dist/services/http/middleware/RequestParser.d.ts +8 -0
  161. package/dist/services/http/middleware/RequestParser.js +35 -0
  162. package/dist/services/http/middleware/RequestParser.js.map +1 -0
  163. package/dist/services/http/middleware/Role.d.ts +9 -0
  164. package/dist/services/http/middleware/Role.js +24 -0
  165. package/dist/services/http/middleware/Role.js.map +1 -0
  166. package/dist/services/validate/ValidateService.d.ts +31 -0
  167. package/dist/services/validate/ValidateService.js +96 -0
  168. package/dist/services/validate/ValidateService.js.map +1 -0
  169. package/dist/services/validate/drivers/AbstractValidator.d.ts +14 -0
  170. package/dist/services/validate/drivers/AbstractValidator.js +32 -0
  171. package/dist/services/validate/drivers/AbstractValidator.js.map +1 -0
  172. package/dist/services/validate/drivers/CustomValidator.d.ts +14 -0
  173. package/dist/services/validate/drivers/CustomValidator.js +48 -0
  174. package/dist/services/validate/drivers/CustomValidator.js.map +1 -0
  175. package/dist/services/validate/drivers/YupValidator.d.ts +13 -0
  176. package/dist/services/validate/drivers/YupValidator.js +86 -0
  177. package/dist/services/validate/drivers/YupValidator.js.map +1 -0
  178. package/dist/tests/globalSetupVitest.d.ts +2 -0
  179. package/dist/tests/globalSetupVitest.js +29 -0
  180. package/dist/tests/globalSetupVitest.js.map +1 -0
  181. package/dist/tests/setupVitest.d.ts +1 -0
  182. package/dist/tests/setupVitest.js +99 -0
  183. package/dist/tests/setupVitest.js.map +1 -0
  184. package/package.json +21 -11
  185. package/Cli.js +0 -21
  186. package/cluster.js +0 -25
  187. package/commands/.gitkeep +0 -0
  188. package/commands/CreateUser.js +0 -106
  189. package/commands/Documentation.js +0 -17
  190. package/commands/DropIndex.js +0 -38
  191. package/commands/GenerateRandomBytes.js +0 -21
  192. package/commands/GetOpenApiJson.js +0 -336
  193. package/commands/SyncIndexes.js +0 -40
  194. package/commands/migration/Create.js +0 -72
  195. package/commands/migration/Migrate.js +0 -56
  196. package/config/auth.js +0 -9
  197. package/config/http.js +0 -9
  198. package/config/i18n.js +0 -12
  199. package/config/ipDetector.js +0 -14
  200. package/config/log.js +0 -22
  201. package/config/mongo.js +0 -3
  202. package/config/rateLimiter.js +0 -16
  203. package/config/redis.js +0 -4
  204. package/config/validate.js +0 -3
  205. package/controllers/Auth.js +0 -201
  206. package/controllers/Home.js +0 -28
  207. package/controllers/index.js +0 -66
  208. package/eslint.config.js +0 -68
  209. package/folderConfig.js +0 -13
  210. package/helpers/files.js +0 -76
  211. package/helpers/logger.js +0 -16
  212. package/helpers/redis/clearNamespace.js +0 -14
  213. package/index.js +0 -8
  214. package/jsconfig.json +0 -9
  215. package/locales/en/translation.json +0 -27
  216. package/locales/ru/translation.json +0 -27
  217. package/migrations/.gitkeep +0 -0
  218. package/models/Lock.js +0 -107
  219. package/models/Migration.js +0 -15
  220. package/models/Sequence.js +0 -22
  221. package/models/User.js +0 -280
  222. package/modules/AbstractCommand.d.ts +0 -50
  223. package/modules/AbstractCommand.js +0 -52
  224. package/modules/AbstractConnector.js +0 -9
  225. package/modules/AbstractController.d.ts +0 -55
  226. package/modules/AbstractController.js +0 -400
  227. package/modules/AbstractModel.d.ts +0 -48
  228. package/modules/AbstractModel.js +0 -92
  229. package/modules/Base.d.ts +0 -37
  230. package/modules/Base.js +0 -64
  231. package/modules/BaseCli.js +0 -162
  232. package/server.d.ts +0 -100
  233. package/server.js +0 -439
  234. package/services/cache/Cache.d.ts +0 -35
  235. package/services/cache/Cache.js +0 -124
  236. package/services/documentation/DocumentationGenerator.js +0 -169
  237. package/services/http/HttpServer.js +0 -89
  238. package/services/http/middleware/AbstractMiddleware.js +0 -51
  239. package/services/http/middleware/Auth.js +0 -20
  240. package/services/http/middleware/Cors.js +0 -46
  241. package/services/http/middleware/GetUserByToken.js +0 -47
  242. package/services/http/middleware/I18n.js +0 -117
  243. package/services/http/middleware/IpDetector.js +0 -59
  244. package/services/http/middleware/Pagination.js +0 -57
  245. package/services/http/middleware/PrepareAppInfo.js +0 -18
  246. package/services/http/middleware/RateLimiter.js +0 -134
  247. package/services/http/middleware/RequestLogger.js +0 -22
  248. package/services/http/middleware/RequestParser.js +0 -40
  249. package/services/http/middleware/Role.js +0 -29
  250. package/services/messaging/email/resources/.gitkeep +0 -1
  251. package/services/messaging/email/templates/.gitkeep +0 -0
  252. package/services/messaging/email/templates/recovery/html.pug +0 -8
  253. package/services/messaging/email/templates/recovery/subject.pug +0 -2
  254. package/services/messaging/email/templates/recovery/text.pug +0 -3
  255. package/services/messaging/email/templates/verification/html.pug +0 -10
  256. package/services/messaging/email/templates/verification/subject.pug +0 -1
  257. package/services/messaging/email/templates/verification/text.pug +0 -1
  258. package/services/validate/ValidateService.js +0 -157
  259. package/services/validate/drivers/AbstractValidator.js +0 -37
  260. package/services/validate/drivers/CustomValidator.js +0 -51
  261. package/services/validate/drivers/YupValidator.js +0 -103
  262. package/tests/globalSetupVitest.js +0 -35
  263. package/tests/setup.js +0 -120
  264. package/tests/setupVitest.js +0 -111
  265. package/types/Expand.d.ts +0 -11
  266. package/types/ICommandArguments.d.ts +0 -41
  267. package/types/TFoldersConfig.d.ts +0 -20
  268. package/views/404.pug +0 -3
  269. package/views/home.pug +0 -3
  270. package/views/layouts/base.pug +0 -39
  271. package/vitest.config.js +0 -17
@@ -0,0 +1,62 @@
1
+ import AbstractModel from '../modules/AbstractModel.ts';
2
+ import type { IAbstractModel, IAbstractModelMethods } from '../modules/AbstractModel.ts';
3
+ interface ILock {
4
+ _id: string;
5
+ expiredAt: Date;
6
+ }
7
+ interface IStatic extends IAbstractModel<ILock, IAbstractModelMethods<ILock>> {
8
+ acquireLock(name: string, ttlSeconds?: number): Promise<boolean>;
9
+ releaseLock(name: string): Promise<boolean>;
10
+ waitForUnlock(name: string): Promise<void>;
11
+ getLockData(name: string): Promise<{
12
+ ttl: number;
13
+ }>;
14
+ getLocksData(names: string[]): Promise<{
15
+ name: string;
16
+ ttl: number;
17
+ }[]>;
18
+ }
19
+ declare class Lock extends AbstractModel<ILock, IAbstractModelMethods<ILock>, IStatic> {
20
+ initHooks(): void;
21
+ get modelSchema(): {
22
+ _id: {
23
+ type: StringConstructor;
24
+ required: boolean;
25
+ };
26
+ expiredAt: {
27
+ type: DateConstructor;
28
+ };
29
+ };
30
+ /**
31
+ * acquire lock based on lock name
32
+ * @param {string} name
33
+ * @param {number} [ttlSeconds=30]
34
+ */
35
+ static acquireLock(this: Lock['mongooseModel'], name: string, ttlSeconds?: number): Promise<boolean>;
36
+ /**
37
+ * release lock based on lock name
38
+ * @param {string} name
39
+ */
40
+ static releaseLock(this: Lock['mongooseModel'], name: string): Promise<boolean>;
41
+ /**
42
+ * wait lock based on lock name
43
+ * @param {string} name
44
+ */
45
+ static waitForUnlock(this: Lock['mongooseModel'], name: string): Promise<unknown>;
46
+ /**
47
+ * get lock remaining time based on lock name
48
+ * @param {string} name
49
+ */
50
+ static getLockData(this: Lock['mongooseModel'], name: string): Promise<{
51
+ ttl: number;
52
+ }>;
53
+ /**
54
+ * get lock remaining time based on lock name
55
+ * @param {string[]} names
56
+ */
57
+ static getLocksData(this: Lock['mongooseModel'], names: string[]): Promise<{
58
+ name: string;
59
+ ttl: number;
60
+ }[]>;
61
+ }
62
+ export default Lock;
@@ -0,0 +1,94 @@
1
+ import AbstractModel from "../modules/AbstractModel.js";
2
+ class Lock extends AbstractModel {
3
+ initHooks() {
4
+ this.mongooseSchema.index({ expiredAt: 1 }, { expireAfterSeconds: 0 });
5
+ }
6
+ // eslint-disable-next-line class-methods-use-this
7
+ get modelSchema() {
8
+ return {
9
+ _id: { type: String, required: true },
10
+ expiredAt: {
11
+ type: Date,
12
+ },
13
+ };
14
+ }
15
+ /**
16
+ * acquire lock based on lock name
17
+ * @param {string} name
18
+ * @param {number} [ttlSeconds=30]
19
+ */
20
+ static async acquireLock(name, ttlSeconds = 30) {
21
+ try {
22
+ await this.create({
23
+ _id: name,
24
+ expiredAt: new Date(Date.now() + ttlSeconds * 1000),
25
+ });
26
+ }
27
+ catch (error) {
28
+ if (error.code !== 11000) {
29
+ // not a duplicate leys
30
+ throw error;
31
+ }
32
+ return false;
33
+ }
34
+ return true;
35
+ }
36
+ /**
37
+ * release lock based on lock name
38
+ * @param {string} name
39
+ */
40
+ static async releaseLock(name) {
41
+ const res = await this.deleteOne({ _id: name });
42
+ if (res.acknowledged && res.deletedCount) {
43
+ return true;
44
+ }
45
+ return false;
46
+ }
47
+ /**
48
+ * wait lock based on lock name
49
+ * @param {string} name
50
+ */
51
+ static async waitForUnlock(name) {
52
+ const res = await this.findOne({ _id: name });
53
+ if (!res) {
54
+ return Promise.resolve();
55
+ }
56
+ return new Promise((resolve) => {
57
+ const stream = this.watch([
58
+ { $match: { operationType: 'delete', 'documentKey._id': name } },
59
+ ]);
60
+ stream.on('change', () => {
61
+ stream.close();
62
+ resolve(true);
63
+ });
64
+ });
65
+ }
66
+ /**
67
+ * get lock remaining time based on lock name
68
+ * @param {string} name
69
+ */
70
+ static async getLockData(name) {
71
+ const res = await this.findOne({ _id: name });
72
+ if (!res) {
73
+ return { ttl: 0 };
74
+ }
75
+ return { ttl: res.expiredAt.getTime() - Date.now() };
76
+ }
77
+ /**
78
+ * get lock remaining time based on lock name
79
+ * @param {string[]} names
80
+ */
81
+ static async getLocksData(names) {
82
+ const res = await this.find({ _id: { $in: names } });
83
+ const lockMap = new Map(res.map((lock) => [lock._id, lock]));
84
+ return names.map((name) => {
85
+ const lock = lockMap.get(name);
86
+ return {
87
+ name,
88
+ ttl: lock ? lock.expiredAt.getTime() - Date.now() : 0,
89
+ };
90
+ });
91
+ }
92
+ }
93
+ export default Lock;
94
+ //# 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 AbstractModel from '../modules/AbstractModel.ts';
2
+ interface IMigration {
3
+ migrationFile: string;
4
+ }
5
+ declare class Migration extends AbstractModel<IMigration> {
6
+ get modelSchema(): {
7
+ migrationFile: {
8
+ type: StringConstructor;
9
+ unique: boolean;
10
+ };
11
+ };
12
+ }
13
+ export default Migration;
@@ -0,0 +1,14 @@
1
+ import AbstractModel from "../modules/AbstractModel.js";
2
+ class Migration extends AbstractModel {
3
+ // eslint-disable-next-line class-methods-use-this
4
+ get modelSchema() {
5
+ return {
6
+ migrationFile: {
7
+ type: String,
8
+ unique: 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":"AAAA,OAAO,aAAa,MAAM,6BAA6B,CAAC;AAMxD,MAAM,SAAU,SAAQ,aAAyB;IAC/C,kDAAkD;IAClD,IAAI,WAAW;QACb,OAAO;YACL,aAAa,EAAE;gBACb,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,IAAI;aACb;SACF,CAAC;IACJ,CAAC;CACF;AAED,eAAe,SAAS,CAAC"}
@@ -0,0 +1,23 @@
1
+ import AbstractModel from '../modules/AbstractModel.ts';
2
+ import type { IAbstractModel, IAbstractModelMethods } from '../modules/AbstractModel.ts';
3
+ interface ISequence {
4
+ _id: string;
5
+ seq: Number;
6
+ }
7
+ interface IStatic extends IAbstractModel<ISequence, IAbstractModelMethods<ISequence>> {
8
+ getSequence(forType: string): Promise<number>;
9
+ }
10
+ declare class Sequence extends AbstractModel<ISequence, IAbstractModelMethods<ISequence>, IStatic> {
11
+ get modelSchema(): {
12
+ _id: {
13
+ type: StringConstructor;
14
+ required: boolean;
15
+ };
16
+ seq: {
17
+ type: NumberConstructor;
18
+ default: number;
19
+ };
20
+ };
21
+ static getSequence(this: Sequence['mongooseModel'], forType: string): Promise<Number>;
22
+ }
23
+ export default Sequence;
@@ -0,0 +1,16 @@
1
+ import AbstractModel from "../modules/AbstractModel.js";
2
+ class Sequence extends AbstractModel {
3
+ // eslint-disable-next-line class-methods-use-this
4
+ get modelSchema() {
5
+ return {
6
+ _id: { type: String, required: true },
7
+ seq: { type: Number, default: 1 },
8
+ };
9
+ }
10
+ static async getSequence(forType) {
11
+ const sequence = await this.findByIdAndUpdate({ _id: forType }, { $inc: { seq: 1 } }, { new: true, upsert: true });
12
+ return sequence.seq;
13
+ }
14
+ }
15
+ export default Sequence;
16
+ //# sourceMappingURL=Sequence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sequence.js","sourceRoot":"","sources":["../../src/models/Sequence.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,6BAA6B,CAAC;AAiBxD,MAAM,QAAS,SAAQ,aAItB;IACC,kDAAkD;IAClD,IAAI,WAAW;QACb,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;SAClC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,WAAW,CAAkC,OAAe;QACvE,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;QACF,OAAO,QAAQ,CAAC,GAAG,CAAC;IACtB,CAAC;CACF;AAED,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,178 @@
1
+ import AbstractModel from '../modules/AbstractModel.ts';
2
+ import type { TFunction } from 'i18next';
3
+ import type { IApp } from '../server.ts';
4
+ import type { IAbstractModel, IAbstractModelMethods } from '../modules/AbstractModel.ts';
5
+ interface IUser {
6
+ avatar: string;
7
+ name: {
8
+ first: string;
9
+ last: string;
10
+ nick: string;
11
+ };
12
+ password: string;
13
+ email: string;
14
+ sessionTokens: {
15
+ token: string;
16
+ valid: Date;
17
+ }[];
18
+ verificationTokens: {
19
+ until: Date;
20
+ token: string;
21
+ }[];
22
+ passwordRecoveryTokens: {
23
+ until: Date;
24
+ token: string;
25
+ }[];
26
+ permissions: string[];
27
+ roles: string[];
28
+ isVerified: boolean;
29
+ locale: string;
30
+ languages: string[];
31
+ }
32
+ interface IStatic extends IAbstractModel<IUser, IAbstractModelMethods<IUser>> {
33
+ getUserByEmailAndPassword(email: string, password: string): Promise<InstanceType<User['mongooseModel']> | false>;
34
+ hashPassword(password: string): Promise<string>;
35
+ getUserByToken(token: string): Promise<InstanceType<User['mongooseModel']> | false>;
36
+ getUserByEmail(email: string): Promise<InstanceType<User['mongooseModel']> | false>;
37
+ getUserByPasswordRecoveryToken(token: string): Promise<InstanceType<User['mongooseModel']> | false>;
38
+ generateUserPasswordRecoveryToken(user: InstanceType<User['mongooseModel']>): Promise<{
39
+ token: string;
40
+ until: Date;
41
+ }>;
42
+ getUserByVerificationToken(token: string): Promise<InstanceType<User['mongooseModel']> | false>;
43
+ generateUserVerificationToken(user: InstanceType<User['mongooseModel']>): Promise<{
44
+ token: string;
45
+ until: Date;
46
+ }>;
47
+ }
48
+ declare class User extends AbstractModel<IUser, IAbstractModelMethods<IUser>, IStatic> {
49
+ hashRounds: number;
50
+ saltSecret: string;
51
+ constructor(app: IApp);
52
+ initHooks(): void;
53
+ get modelSchema(): {
54
+ avatar: {
55
+ type: StringConstructor;
56
+ maxlength: number;
57
+ };
58
+ name: {
59
+ first: {
60
+ type: StringConstructor;
61
+ maxlength: number;
62
+ };
63
+ last: {
64
+ type: StringConstructor;
65
+ maxlength: number;
66
+ };
67
+ nick: {
68
+ minlength: number;
69
+ maxlength: number;
70
+ type: StringConstructor;
71
+ index: {
72
+ unique: boolean;
73
+ partialFilterExpression: {
74
+ 'name.nick': {
75
+ $type: string;
76
+ };
77
+ };
78
+ };
79
+ };
80
+ };
81
+ password: StringConstructor;
82
+ email: {
83
+ type: StringConstructor;
84
+ maxlength: number;
85
+ index: {
86
+ unique: boolean;
87
+ partialFilterExpression: {
88
+ email: {
89
+ $type: string;
90
+ };
91
+ };
92
+ };
93
+ };
94
+ sessionTokens: {
95
+ token: StringConstructor;
96
+ valid: DateConstructor;
97
+ }[];
98
+ verificationTokens: {
99
+ until: DateConstructor;
100
+ token: StringConstructor;
101
+ }[];
102
+ passwordRecoveryTokens: {
103
+ until: DateConstructor;
104
+ token: StringConstructor;
105
+ }[];
106
+ permissions: never[];
107
+ roles: never[];
108
+ isVerified: {
109
+ type: BooleanConstructor;
110
+ default: boolean;
111
+ };
112
+ locale: {
113
+ type: StringConstructor;
114
+ default: string;
115
+ };
116
+ languages: StringConstructor[];
117
+ };
118
+ static getUserByEmailAndPassword(this: User['mongooseModel'], email: string, password: string): Promise<false | (import("mongoose").Document<unknown, {}, IUser> & Omit<IUser & {
119
+ _id: import("mongoose").Types.ObjectId;
120
+ } & {
121
+ __v: number;
122
+ }, "getSuper"> & IAbstractModelMethods<IUser>)>;
123
+ generateToken(this: InstanceType<User['mongooseModel']>): Promise<{
124
+ token: string;
125
+ valid: Date;
126
+ }>;
127
+ getPublic(this: InstanceType<User['mongooseModel']>): {
128
+ avatar: string;
129
+ name: {
130
+ first: string;
131
+ last: string;
132
+ nick: string;
133
+ };
134
+ email: string;
135
+ id: any;
136
+ isVerified: boolean;
137
+ permissions: string[];
138
+ locale: string;
139
+ };
140
+ static hashPassword(this: User['mongooseModel'], password: string): Promise<string>;
141
+ static getUserByToken(this: User['mongooseModel'], token: string): Promise<false | (import("mongoose").Document<unknown, {}, IUser> & Omit<IUser & {
142
+ _id: import("mongoose").Types.ObjectId;
143
+ } & {
144
+ __v: number;
145
+ }, "getSuper"> & IAbstractModelMethods<IUser>)>;
146
+ static getUserByEmail(this: User['mongooseModel'], email: string): Promise<false | (import("mongoose").Document<unknown, {}, IUser> & Omit<IUser & {
147
+ _id: import("mongoose").Types.ObjectId;
148
+ } & {
149
+ __v: number;
150
+ }, "getSuper"> & IAbstractModelMethods<IUser>)>;
151
+ static generateUserPasswordRecoveryToken(userMongoose: InstanceType<User['mongooseModel']>): Promise<{
152
+ token: string;
153
+ until: number;
154
+ }>;
155
+ static getUserByPasswordRecoveryToken(this: User['mongooseModel'], passwordRecoveryToken: string): Promise<import("mongoose").Document<unknown, {}, IUser> & Omit<IUser & {
156
+ _id: import("mongoose").Types.ObjectId;
157
+ } & {
158
+ __v: number;
159
+ }, "getSuper"> & IAbstractModelMethods<IUser>>;
160
+ sendPasswordRecoveryEmail(this: InstanceType<User['mongooseModel']>, i18n: {
161
+ t: TFunction;
162
+ language: string;
163
+ }): Promise<any>;
164
+ static generateUserVerificationToken(userMongoose: InstanceType<User['mongooseModel']>): Promise<{
165
+ token: string;
166
+ until: number;
167
+ }>;
168
+ static getUserByVerificationToken(this: User['mongooseModel'], verificationToken: string): Promise<import("mongoose").Document<unknown, {}, IUser> & Omit<IUser & {
169
+ _id: import("mongoose").Types.ObjectId;
170
+ } & {
171
+ __v: number;
172
+ }, "getSuper"> & IAbstractModelMethods<IUser>>;
173
+ sendVerificationEmail(this: InstanceType<User['mongooseModel']>, i18n: {
174
+ t: TFunction;
175
+ language: string;
176
+ }): Promise<any>;
177
+ }
178
+ export default User;
@@ -0,0 +1,244 @@
1
+ import { scrypt } from 'node:crypto';
2
+ import { promisify } from 'node:util';
3
+ import AbstractModel from "../modules/AbstractModel.js";
4
+ const scryptAsync = promisify(scrypt);
5
+ class User extends AbstractModel {
6
+ hashRounds;
7
+ saltSecret;
8
+ constructor(app) {
9
+ super(app);
10
+ const authConfig = this.app.getConfig('auth');
11
+ this.hashRounds = authConfig.hashRounds;
12
+ this.saltSecret = authConfig.saltSecret;
13
+ }
14
+ initHooks() {
15
+ this.mongooseSchema.pre('save', async function userPreSaveHook() {
16
+ if (this.isModified('password')) {
17
+ // @ts-ignore
18
+ this.password = await this.constructor.hashPassword(this.password);
19
+ }
20
+ });
21
+ }
22
+ // eslint-disable-next-line class-methods-use-this
23
+ get modelSchema() {
24
+ return {
25
+ avatar: {
26
+ type: String,
27
+ maxlength: 255,
28
+ },
29
+ name: {
30
+ first: {
31
+ type: String,
32
+ maxlength: 255,
33
+ },
34
+ last: {
35
+ type: String,
36
+ maxlength: 255,
37
+ },
38
+ nick: {
39
+ minlength: 3,
40
+ maxlength: 255,
41
+ type: String,
42
+ index: {
43
+ unique: true,
44
+ partialFilterExpression: { 'name.nick': { $type: 'string' } },
45
+ },
46
+ },
47
+ },
48
+ password: String,
49
+ email: {
50
+ type: String,
51
+ maxlength: 255,
52
+ index: {
53
+ unique: true,
54
+ partialFilterExpression: { email: { $type: 'string' } },
55
+ },
56
+ },
57
+ sessionTokens: [{ token: String, valid: Date }],
58
+ verificationTokens: [{ until: Date, token: String }],
59
+ passwordRecoveryTokens: [{ until: Date, token: String }],
60
+ permissions: [],
61
+ roles: [],
62
+ isVerified: { type: Boolean, default: false },
63
+ locale: { type: String, default: 'en' },
64
+ languages: [String],
65
+ };
66
+ }
67
+ static async getUserByEmailAndPassword(email, password) {
68
+ const data = await this.findOne({ email: String(email) });
69
+ if (!data) {
70
+ return false;
71
+ }
72
+ const hashedPasswords = await this.hashPassword(password);
73
+ if (data.password !== hashedPasswords) {
74
+ return false;
75
+ }
76
+ return data;
77
+ }
78
+ async generateToken() {
79
+ const timestamp = new Date();
80
+ timestamp.setDate(timestamp.getDate() + 30);
81
+ const data = await scryptAsync(this.email + Date.now(),
82
+ // @ts-ignore
83
+ this.getSuper().saltSecret,
84
+ // @ts-ignore
85
+ this.getSuper().hashRounds);
86
+ const token = data.toString('base64url');
87
+ this.sessionTokens.push({ token, valid: timestamp });
88
+ await this.save();
89
+ return { token, valid: timestamp };
90
+ }
91
+ getPublic() {
92
+ return {
93
+ avatar: this.avatar,
94
+ name: this.name,
95
+ email: this.email,
96
+ id: this.id,
97
+ isVerified: this.isVerified,
98
+ permissions: this.permissions,
99
+ locale: this.locale,
100
+ };
101
+ }
102
+ static async hashPassword(password) {
103
+ const data = await scryptAsync(String(password),
104
+ // @ts-ignore
105
+ this.getSuper().saltSecret,
106
+ // @ts-ignore
107
+ this.getSuper().hashRounds);
108
+ return data.toString('base64url');
109
+ }
110
+ static async getUserByToken(token) {
111
+ const data = await this.findOne({ 'sessionTokens.token': String(token) });
112
+ return data || false;
113
+ }
114
+ static async getUserByEmail(email) {
115
+ const data = await this.findOne({ email: String(email) });
116
+ if (!data) {
117
+ return false;
118
+ }
119
+ return data;
120
+ }
121
+ static async generateUserPasswordRecoveryToken(userMongoose) {
122
+ const date = new Date();
123
+ date.setDate(date.getDate() + 14);
124
+ const data = await scryptAsync(userMongoose.email + Date.now(),
125
+ // @ts-ignore
126
+ userMongoose.getSuper().saltSecret,
127
+ // @ts-ignore
128
+ userMongoose.getSuper().hashRounds);
129
+ const token = data.toString('base64url');
130
+ // if (err) {
131
+ // this.logger.error("Hash 2 error ", err);
132
+ // reject(err);
133
+ // return;
134
+ // }
135
+ userMongoose.passwordRecoveryTokens = [];
136
+ userMongoose.passwordRecoveryTokens.push({
137
+ until: date,
138
+ token,
139
+ });
140
+ await userMongoose.save();
141
+ return { token, until: date.getTime() };
142
+ }
143
+ static async getUserByPasswordRecoveryToken(passwordRecoveryToken) {
144
+ const data = await this.findOne({
145
+ passwordRecoveryTokens: {
146
+ $elemMatch: { token: String(passwordRecoveryToken) },
147
+ },
148
+ });
149
+ if (!data) {
150
+ return Promise.reject(new Error('User not exists'));
151
+ }
152
+ // TODO token expiration and remove that token
153
+ data.passwordRecoveryTokens.pop();
154
+ const result = await data.save();
155
+ return result;
156
+ }
157
+ async sendPasswordRecoveryEmail(i18n) {
158
+ const passwordRecoveryToken = await User.generateUserPasswordRecoveryToken(this);
159
+ let Mailer;
160
+ // speed optimisation
161
+ try {
162
+ // @ts-ignore
163
+ // eslint-disable-next-line import-x/no-unresolved
164
+ Mailer = (await import('@adaptivestone/framework-module-email')).default;
165
+ }
166
+ catch {
167
+ const error = 'Mailer not found. Please install @adaptivestone/framework-module-email in order to use it';
168
+ this.getSuper().logger?.error(error);
169
+ return false;
170
+ }
171
+ const mail = new Mailer(this.getSuper().app, 'recovery', {
172
+ link: `${i18n.language}/auth/recovery?password_recovery_token=${passwordRecoveryToken.token}`,
173
+ editor: this.name.nick,
174
+ }, i18n);
175
+ return mail.send(this.email);
176
+ }
177
+ static async generateUserVerificationToken(userMongoose) {
178
+ const date = new Date();
179
+ date.setDate(date.getDate() + 14);
180
+ const data = await scryptAsync(userMongoose.email + Date.now(),
181
+ // @ts-ignore
182
+ userMongoose.getSuper().saltSecret,
183
+ // @ts-ignore
184
+ userMongoose.getSuper().hashRounds);
185
+ const token = data.toString('base64url');
186
+ // if (err) {
187
+ // this.logger.error("Hash 2 error ", err);
188
+ // reject(err);
189
+ // return;
190
+ // }
191
+ userMongoose.verificationTokens = [];
192
+ userMongoose.verificationTokens.push({
193
+ until: date,
194
+ token,
195
+ });
196
+ await userMongoose.save();
197
+ return { token, until: date.getTime() };
198
+ }
199
+ static async getUserByVerificationToken(verificationToken) {
200
+ const data = await this.findOne({
201
+ verificationTokens: {
202
+ $elemMatch: { token: String(verificationToken) },
203
+ },
204
+ });
205
+ if (!data) {
206
+ return Promise.reject(new Error('User not exists'));
207
+ }
208
+ // TODO token expiration and remove that token
209
+ data.verificationTokens.pop();
210
+ const result = await data.save();
211
+ return result;
212
+ }
213
+ // async removeVerificationToken(verificationToken) {
214
+ // this.mongooseModel.updateOne(
215
+ // {
216
+ // verificationTokens: {
217
+ // $elemMatch: { token: String(verificationToken) },
218
+ // },
219
+ // },
220
+ // { $pop: { verificationTokens: 1 } },
221
+ // );
222
+ // }
223
+ async sendVerificationEmail(i18n) {
224
+ const verificationToken = await User.generateUserVerificationToken(this);
225
+ // speed optimisation
226
+ let Mailer;
227
+ try {
228
+ // @ts-ignore
229
+ Mailer = (await import('@adaptivestone/framework-module-email')).default;
230
+ }
231
+ catch {
232
+ const error = 'Mailer not found. Please install @adaptivestone/framework-module-email in order to use it';
233
+ this.getSuper().logger?.error(error);
234
+ return false;
235
+ }
236
+ const mail = new Mailer(this.getSuper().app, 'verification', {
237
+ link: `${i18n.language}/auth/login?verification_token=${verificationToken.token}`,
238
+ editor: this.name.nick,
239
+ }, i18n);
240
+ return mail.send(this.email);
241
+ }
242
+ }
243
+ export default User;
244
+ //# sourceMappingURL=User.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"User.js","sourceRoot":"","sources":["../../src/models/User.ts"],"names":[],"mappings":"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"}