@adaptivestone/framework 5.0.0-beta.4 → 5.0.0-beta.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (298) hide show
  1. package/CHANGELOG.md +1107 -528
  2. package/LICENCE +1 -1
  3. package/dist/Cli.d.ts +7 -0
  4. package/dist/Cli.js +19 -0
  5. package/dist/Cli.js.map +1 -0
  6. package/dist/cluster.d.ts +1 -0
  7. package/dist/cluster.js +18 -0
  8. package/dist/cluster.js.map +1 -0
  9. package/dist/commands/CreateUser.d.ts +32 -0
  10. package/dist/commands/CreateUser.js +83 -0
  11. package/dist/commands/CreateUser.js.map +1 -0
  12. package/dist/commands/Documentation.d.ts +5 -0
  13. package/dist/commands/Documentation.js +15 -0
  14. package/dist/commands/Documentation.js.map +1 -0
  15. package/dist/commands/DropIndex.d.ts +16 -0
  16. package/dist/commands/DropIndex.js +30 -0
  17. package/dist/commands/DropIndex.js.map +1 -0
  18. package/dist/commands/GenerateRandomBytes.d.ts +7 -0
  19. package/dist/commands/GenerateRandomBytes.js +18 -0
  20. package/dist/commands/GenerateRandomBytes.js.map +1 -0
  21. package/dist/commands/GenerateTypes.d.ts +11 -0
  22. package/dist/commands/GenerateTypes.js +52 -0
  23. package/dist/commands/GenerateTypes.js.map +1 -0
  24. package/dist/commands/GetOpenApiJson.d.ts +17 -0
  25. package/dist/commands/GetOpenApiJson.js +272 -0
  26. package/dist/commands/GetOpenApiJson.js.map +1 -0
  27. package/dist/commands/SyncIndexes.d.ts +6 -0
  28. package/dist/commands/SyncIndexes.js +31 -0
  29. package/dist/commands/SyncIndexes.js.map +1 -0
  30. package/dist/commands/migration/Create.d.ts +18 -0
  31. package/dist/commands/migration/Create.js +57 -0
  32. package/dist/commands/migration/Create.js.map +1 -0
  33. package/dist/commands/migration/Migrate.d.ts +6 -0
  34. package/dist/commands/migration/Migrate.js +43 -0
  35. package/dist/commands/migration/Migrate.js.map +1 -0
  36. package/dist/config/auth.d.ts +6 -0
  37. package/dist/config/auth.js +7 -0
  38. package/dist/config/auth.js.map +1 -0
  39. package/dist/config/http.d.ts +8 -0
  40. package/dist/config/http.js +10 -0
  41. package/dist/config/http.js.map +1 -0
  42. package/dist/config/i18n.d.ts +13 -0
  43. package/dist/config/i18n.js +13 -0
  44. package/dist/config/i18n.js.map +1 -0
  45. package/dist/config/ipDetector.d.ts +5 -0
  46. package/dist/config/ipDetector.js +15 -0
  47. package/dist/config/ipDetector.js.map +1 -0
  48. package/dist/config/log.d.ts +11 -0
  49. package/dist/config/log.js +20 -0
  50. package/dist/config/log.js.map +1 -0
  51. package/dist/config/mongo.d.ts +4 -0
  52. package/dist/config/mongo.js +4 -0
  53. package/dist/config/mongo.js.map +1 -0
  54. package/dist/config/rateLimiter.d.ts +13 -0
  55. package/dist/config/rateLimiter.js +17 -0
  56. package/dist/config/rateLimiter.js.map +1 -0
  57. package/dist/config/redis.d.ts +5 -0
  58. package/dist/config/redis.js +5 -0
  59. package/dist/config/redis.js.map +1 -0
  60. package/dist/config/validate.d.ts +4 -0
  61. package/dist/config/validate.js +4 -0
  62. package/dist/config/validate.js.map +1 -0
  63. package/dist/controllers/Auth.d.ts +131 -0
  64. package/dist/controllers/Auth.js +186 -0
  65. package/dist/controllers/Auth.js.map +1 -0
  66. package/dist/controllers/Home.d.ts +15 -0
  67. package/dist/controllers/Home.js +22 -0
  68. package/dist/controllers/Home.js.map +1 -0
  69. package/dist/controllers/index.d.ts +16 -0
  70. package/dist/controllers/index.js +59 -0
  71. package/dist/controllers/index.js.map +1 -0
  72. package/dist/folderConfig.d.ts +34 -0
  73. package/dist/folderConfig.js +14 -0
  74. package/dist/folderConfig.js.map +1 -0
  75. package/dist/helpers/appInstance.d.ts +3 -0
  76. package/dist/helpers/appInstance.js +8 -0
  77. package/dist/helpers/appInstance.js.map +1 -0
  78. package/dist/helpers/crypto.d.ts +3 -0
  79. package/dist/helpers/crypto.js +17 -0
  80. package/dist/helpers/crypto.js.map +1 -0
  81. package/dist/helpers/files.d.ts +16 -0
  82. package/dist/helpers/files.js +76 -0
  83. package/dist/helpers/files.js.map +1 -0
  84. package/dist/helpers/logger.d.ts +4 -0
  85. package/dist/helpers/logger.js +20 -0
  86. package/dist/helpers/logger.js.map +1 -0
  87. package/dist/helpers/redis/clearNamespace.d.ts +2 -0
  88. package/dist/helpers/redis/clearNamespace.js +14 -0
  89. package/dist/helpers/redis/clearNamespace.js.map +1 -0
  90. package/dist/helpers/yup.d.ts +13 -0
  91. package/dist/helpers/yup.js +21 -0
  92. package/dist/helpers/yup.js.map +1 -0
  93. package/dist/index.d.ts +1 -0
  94. package/dist/index.js +7 -0
  95. package/dist/index.js.map +1 -0
  96. package/dist/models/Lock.d.ts +90 -0
  97. package/dist/models/Lock.js +97 -0
  98. package/dist/models/Lock.js.map +1 -0
  99. package/dist/models/Migration.d.ts +13 -0
  100. package/dist/models/Migration.js +14 -0
  101. package/dist/models/Migration.js.map +1 -0
  102. package/dist/models/Sequence.d.ts +28 -0
  103. package/dist/models/Sequence.js +19 -0
  104. package/dist/models/Sequence.js.map +1 -0
  105. package/dist/models/User.d.ts +656 -0
  106. package/dist/models/User.js +291 -0
  107. package/dist/models/User.js.map +1 -0
  108. package/dist/models/UserOld.d.ts +179 -0
  109. package/dist/models/UserOld.js +230 -0
  110. package/dist/models/UserOld.js.map +1 -0
  111. package/dist/modules/AbstractCommand.d.ts +51 -0
  112. package/dist/modules/AbstractCommand.js +60 -0
  113. package/dist/modules/AbstractCommand.js.map +1 -0
  114. package/dist/modules/AbstractConnector.d.ts +5 -0
  115. package/dist/modules/AbstractConnector.js +8 -0
  116. package/dist/modules/AbstractConnector.js.map +1 -0
  117. package/dist/modules/AbstractController.d.ts +94 -0
  118. package/dist/modules/AbstractController.js +323 -0
  119. package/dist/modules/AbstractController.js.map +1 -0
  120. package/dist/modules/AbstractModel.d.ts +29 -0
  121. package/dist/modules/AbstractModel.js +42 -0
  122. package/dist/modules/AbstractModel.js.map +1 -0
  123. package/dist/modules/Base.d.ts +29 -0
  124. package/dist/modules/Base.js +58 -0
  125. package/dist/modules/Base.js.map +1 -0
  126. package/dist/modules/BaseCli.d.ts +25 -0
  127. package/dist/modules/BaseCli.js +147 -0
  128. package/dist/modules/BaseCli.js.map +1 -0
  129. package/dist/modules/BaseModel.d.ts +55 -0
  130. package/dist/modules/BaseModel.js +37 -0
  131. package/dist/modules/BaseModel.js.map +1 -0
  132. package/dist/server.d.ts +123 -0
  133. package/dist/server.js +468 -0
  134. package/dist/server.js.map +1 -0
  135. package/dist/services/cache/Cache.d.ts +31 -0
  136. package/dist/services/cache/Cache.js +113 -0
  137. package/dist/services/cache/Cache.js.map +1 -0
  138. package/dist/services/documentation/DocumentationGenerator.d.ts +11 -0
  139. package/dist/services/documentation/DocumentationGenerator.js +130 -0
  140. package/dist/services/documentation/DocumentationGenerator.js.map +1 -0
  141. package/dist/services/http/HttpServer.d.ts +35 -0
  142. package/dist/services/http/HttpServer.js +70 -0
  143. package/dist/services/http/HttpServer.js.map +1 -0
  144. package/dist/services/http/middleware/AbstractMiddleware.d.ts +25 -0
  145. package/dist/services/http/middleware/AbstractMiddleware.js +41 -0
  146. package/dist/services/http/middleware/AbstractMiddleware.js.map +1 -0
  147. package/dist/services/http/middleware/Auth.d.ts +9 -0
  148. package/dist/services/http/middleware/Auth.js +18 -0
  149. package/dist/services/http/middleware/Auth.js.map +1 -0
  150. package/dist/services/http/middleware/Cors.d.ts +12 -0
  151. package/dist/services/http/middleware/Cors.js +36 -0
  152. package/dist/services/http/middleware/Cors.js.map +1 -0
  153. package/dist/services/http/middleware/GetUserByToken.d.ts +20 -0
  154. package/dist/services/http/middleware/GetUserByToken.js +39 -0
  155. package/dist/services/http/middleware/GetUserByToken.js.map +1 -0
  156. package/dist/services/http/middleware/I18n.d.ts +23 -0
  157. package/dist/services/http/middleware/I18n.js +61 -0
  158. package/dist/services/http/middleware/I18n.js.map +1 -0
  159. package/dist/services/http/middleware/IpDetector.d.ts +14 -0
  160. package/dist/services/http/middleware/IpDetector.js +55 -0
  161. package/dist/services/http/middleware/IpDetector.js.map +1 -0
  162. package/dist/services/http/middleware/Pagination.d.ts +27 -0
  163. package/dist/services/http/middleware/Pagination.js +46 -0
  164. package/dist/services/http/middleware/Pagination.js.map +1 -0
  165. package/dist/services/http/middleware/PrepareAppInfo.d.ts +8 -0
  166. package/dist/services/http/middleware/PrepareAppInfo.js +17 -0
  167. package/dist/services/http/middleware/PrepareAppInfo.js.map +1 -0
  168. package/dist/services/http/middleware/RateLimiter.d.ts +26 -0
  169. package/dist/services/http/middleware/RateLimiter.js +118 -0
  170. package/dist/services/http/middleware/RateLimiter.js.map +1 -0
  171. package/dist/services/http/middleware/RequestLogger.d.ts +8 -0
  172. package/dist/services/http/middleware/RequestLogger.js +18 -0
  173. package/dist/services/http/middleware/RequestLogger.js.map +1 -0
  174. package/dist/services/http/middleware/RequestParser.d.ts +8 -0
  175. package/dist/services/http/middleware/RequestParser.js +35 -0
  176. package/dist/services/http/middleware/RequestParser.js.map +1 -0
  177. package/dist/services/http/middleware/Role.d.ts +12 -0
  178. package/dist/services/http/middleware/Role.js +24 -0
  179. package/dist/services/http/middleware/Role.js.map +1 -0
  180. package/dist/services/i18n/I18n.d.ts +15 -0
  181. package/dist/services/i18n/I18n.js +58 -0
  182. package/dist/services/i18n/I18n.js.map +1 -0
  183. package/dist/services/logging/SentryTransport.d.ts +14 -0
  184. package/dist/services/logging/SentryTransport.js +57 -0
  185. package/dist/services/logging/SentryTransport.js.map +1 -0
  186. package/dist/services/validate/ValidateService.d.ts +31 -0
  187. package/dist/services/validate/ValidateService.js +95 -0
  188. package/dist/services/validate/ValidateService.js.map +1 -0
  189. package/dist/services/validate/drivers/AbstractValidator.d.ts +14 -0
  190. package/dist/services/validate/drivers/AbstractValidator.js +29 -0
  191. package/dist/services/validate/drivers/AbstractValidator.js.map +1 -0
  192. package/dist/services/validate/drivers/CustomValidator.d.ts +14 -0
  193. package/dist/services/validate/drivers/CustomValidator.js +48 -0
  194. package/dist/services/validate/drivers/CustomValidator.js.map +1 -0
  195. package/dist/services/validate/drivers/YupValidator.d.ts +13 -0
  196. package/dist/services/validate/drivers/YupValidator.js +86 -0
  197. package/dist/services/validate/drivers/YupValidator.js.map +1 -0
  198. package/dist/tests/frameworkVitestSetup.d.ts +1 -0
  199. package/dist/tests/frameworkVitestSetup.js +9 -0
  200. package/dist/tests/frameworkVitestSetup.js.map +1 -0
  201. package/dist/tests/globalSetupVitest.d.ts +3 -0
  202. package/dist/tests/globalSetupVitest.js +29 -0
  203. package/dist/tests/globalSetupVitest.js.map +1 -0
  204. package/dist/tests/setupVitest.d.ts +1 -0
  205. package/dist/tests/setupVitest.js +91 -0
  206. package/dist/tests/setupVitest.js.map +1 -0
  207. package/dist/tests/testHelpers.d.ts +340 -0
  208. package/dist/tests/testHelpers.js +48 -0
  209. package/dist/tests/testHelpers.js.map +1 -0
  210. package/package.json +45 -39
  211. package/Cli.js +0 -22
  212. package/cluster.js +0 -27
  213. package/commands/CreateUser.js +0 -75
  214. package/commands/Documentation.js +0 -17
  215. package/commands/DropIndex.js +0 -29
  216. package/commands/GenerateRandomBytes.js +0 -21
  217. package/commands/GetOpenApiJson.js +0 -325
  218. package/commands/SyncIndexes.js +0 -39
  219. package/commands/migration/Create.js +0 -61
  220. package/commands/migration/Migrate.js +0 -55
  221. package/config/auth.js +0 -9
  222. package/config/http.js +0 -9
  223. package/config/i18n.js +0 -12
  224. package/config/ipDetector.js +0 -14
  225. package/config/log.js +0 -22
  226. package/config/mail.js +0 -29
  227. package/config/mongo.js +0 -3
  228. package/config/rateLimiter.js +0 -16
  229. package/config/redis.js +0 -4
  230. package/config/validate.js +0 -3
  231. package/controllers/Auth.js +0 -210
  232. package/controllers/Home.js +0 -28
  233. package/controllers/index.js +0 -60
  234. package/folderConfig.js +0 -14
  235. package/helpers/files.js +0 -79
  236. package/helpers/logger.js +0 -17
  237. package/helpers/redis/clearNamespace.js +0 -14
  238. package/helpers/yup.js +0 -24
  239. package/index.js +0 -8
  240. package/jsconfig.json +0 -9
  241. package/locales/en/translation.json +0 -27
  242. package/locales/ru/translation.json +0 -27
  243. package/migrations/.gitkeep +0 -0
  244. package/models/Migration.js +0 -15
  245. package/models/Sequence.js +0 -22
  246. package/models/User.js +0 -263
  247. package/modules/AbstractCommand.js +0 -43
  248. package/modules/AbstractConnector.js +0 -9
  249. package/modules/AbstractController.js +0 -413
  250. package/modules/AbstractModel.d.ts +0 -48
  251. package/modules/AbstractModel.js +0 -92
  252. package/modules/Base.d.ts +0 -37
  253. package/modules/Base.js +0 -63
  254. package/modules/BaseCli.js +0 -97
  255. package/server.d.ts +0 -98
  256. package/server.js +0 -438
  257. package/services/cache/Cache.d.ts +0 -35
  258. package/services/cache/Cache.js +0 -124
  259. package/services/documentation/DocumentationGenerator.js +0 -169
  260. package/services/http/HttpServer.js +0 -96
  261. package/services/http/middleware/AbstractMiddleware.js +0 -51
  262. package/services/http/middleware/Auth.js +0 -20
  263. package/services/http/middleware/Cors.js +0 -46
  264. package/services/http/middleware/GetUserByToken.js +0 -47
  265. package/services/http/middleware/I18n.js +0 -117
  266. package/services/http/middleware/IpDetector.js +0 -59
  267. package/services/http/middleware/Pagination.js +0 -57
  268. package/services/http/middleware/PrepareAppInfo.js +0 -18
  269. package/services/http/middleware/RateLimiter.js +0 -134
  270. package/services/http/middleware/RequestLogger.js +0 -22
  271. package/services/http/middleware/RequestParser.js +0 -40
  272. package/services/http/middleware/Role.js +0 -29
  273. package/services/messaging/email/index.js +0 -217
  274. package/services/messaging/email/resources/.gitkeep +0 -1
  275. package/services/messaging/email/templates/emptyTemplate/html.pug +0 -9
  276. package/services/messaging/email/templates/emptyTemplate/subject.pug +0 -1
  277. package/services/messaging/email/templates/emptyTemplate/text.pug +0 -1
  278. package/services/messaging/email/templates/recovery/html.pug +0 -8
  279. package/services/messaging/email/templates/recovery/subject.pug +0 -2
  280. package/services/messaging/email/templates/recovery/text.pug +0 -3
  281. package/services/messaging/email/templates/verification/html.pug +0 -10
  282. package/services/messaging/email/templates/verification/subject.pug +0 -1
  283. package/services/messaging/email/templates/verification/text.pug +0 -1
  284. package/services/messaging/index.js +0 -3
  285. package/services/validate/ValidateService.js +0 -157
  286. package/services/validate/drivers/AbstractValidator.js +0 -37
  287. package/services/validate/drivers/CustomValidator.js +0 -51
  288. package/services/validate/drivers/YupValidator.js +0 -103
  289. package/tests/globalSetupVitest.js +0 -35
  290. package/tests/setup.js +0 -118
  291. package/tests/setupVitest.js +0 -109
  292. package/types/Expand.d.ts +0 -11
  293. package/types/TFoldersConfig.d.ts +0 -17
  294. package/views/404.pug +0 -3
  295. package/views/home.pug +0 -3
  296. package/views/layouts/base.pug +0 -39
  297. package/vitest.config.js +0 -16
  298. /package/{commands → dist/migrations}/.gitkeep +0 -0
@@ -1,124 +0,0 @@
1
- import Base from '../../modules/Base.js';
2
-
3
- class Cache extends Base {
4
- constructor(app) {
5
- super(app);
6
- this.whenReady = this.#init();
7
- }
8
-
9
- async #init() {
10
- // todo for now only redis. refactor for drives support in future
11
- // at least memory and redis drivers should be presented
12
- // memory drives should works on master process level
13
- // we should support multiple cashe same time
14
- const redis = await import('redis');
15
- const conf = this.app.getConfig('redis');
16
- this.redisClient = redis.createClient({
17
- url: conf.url,
18
- });
19
-
20
- this.redisNamespace = conf.namespace;
21
-
22
- this.redisClient.on('error', (error, b, c) => {
23
- this.logger.error(error, b, c);
24
- });
25
- this.redisClient.on('connect', () => {
26
- this.logger.info('Redis connection success');
27
- });
28
- this.app.events.on('shutdown', () => {
29
- this.redisClient.quit();
30
- });
31
-
32
- this.promiseMapping = new Map();
33
- }
34
-
35
- getKeyWithNameSpace(key) {
36
- return `${this.redisNamespace}-${key}`;
37
- }
38
-
39
- async getSetValue(keyValue, onNotFound, storeTime = 60 * 5) {
40
- await this.whenReady;
41
- if (!this.redisClient.isOpen) {
42
- await this.redisClient.connect();
43
- }
44
- const key = this.getKeyWithNameSpace(keyValue);
45
- // 5 mins default
46
- // eslint-disable-next-line no-unused-vars
47
- let resolve = (value) => {};
48
- // eslint-disable-next-line no-unused-vars
49
- let reject = (value) => {};
50
- if (this.promiseMapping.has(key)) {
51
- return this.promiseMapping.get(key);
52
- }
53
-
54
- this.promiseMapping.set(
55
- key,
56
- new Promise((res, rej) => {
57
- resolve = res;
58
- reject = rej;
59
- }),
60
- );
61
-
62
- let result = await this.redisClient.get(key);
63
- if (!result) {
64
- this.logger.verbose(`getSetValueFromCache not found for key ${key}`);
65
- try {
66
- result = await onNotFound();
67
- } catch (e) {
68
- this.logger.error(`Cache onNotFound for key '${key}' error: ${e}`);
69
- this.promiseMapping.delete(key);
70
- reject(e);
71
- return Promise.reject(e);
72
- }
73
-
74
- this.redisClient.set(
75
- key,
76
- JSON.stringify(result, (_jsonkey, value) =>
77
- typeof value === 'bigint' ? `${value}n` : value,
78
- ),
79
- {
80
- EX: storeTime,
81
- },
82
- );
83
- } else {
84
- this.logger.verbose(
85
- `getSetValueFromCache FROM CACHE key ${key}, value ${result.substring(
86
- 0,
87
- 100,
88
- )}`,
89
- );
90
- try {
91
- result = JSON.parse(result, (_jsonkey, value) => {
92
- if (typeof value === 'string' && /^\d+n$/.test(value)) {
93
- return BigInt(value.slice(0, value.length - 1));
94
- }
95
- return value;
96
- });
97
- } catch (e) {
98
- this.logger.warn(
99
- 'Not able to parse json from redis cache. That can be a normal in case you store string here',
100
- );
101
- }
102
- }
103
-
104
- resolve(result);
105
- this.promiseMapping.delete(key);
106
- return result;
107
- }
108
-
109
- async removeKey(keyValue) {
110
- await this.whenReady;
111
-
112
- if (!this.redisClient.isOpen) {
113
- await this.redisClient.connect();
114
- }
115
- const key = this.getKeyWithNameSpace(keyValue);
116
- return this.redisClient.del(key);
117
- }
118
-
119
- static get loggerGroup() {
120
- return 'Cache_';
121
- }
122
- }
123
-
124
- export default Cache;
@@ -1,169 +0,0 @@
1
- import Base from '../../modules/Base.js';
2
- import ValidateService from '../validate/ValidateService.js';
3
-
4
- class DocumentationGenerator extends Base {
5
- // eslint-disable-next-line class-methods-use-this
6
- processingFields(fieldsByRoute) {
7
- const fields = [];
8
- if (!fieldsByRoute) {
9
- return fields;
10
- }
11
- const entries = Object.entries(fieldsByRoute);
12
- entries.forEach(([key, value]) => {
13
- const field = {};
14
- field.name = key;
15
- field.type = value.type;
16
- if (value.exclusiveTests) {
17
- field.required = value.exclusiveTests.required;
18
- }
19
- if (value?.innerType) {
20
- field.innerType = value?.innerType?.type;
21
- }
22
-
23
- if (value.fields) {
24
- field.fields = [];
25
- // eslint-disable-next-line no-shadow
26
- const entries = Object.entries(value.fields);
27
- // eslint-disable-next-line no-shadow
28
- entries.forEach(([key, value]) => {
29
- field.fields.push({
30
- name: key,
31
- type: value.type,
32
- });
33
- });
34
- }
35
- fields.push(field);
36
- });
37
- return fields;
38
- }
39
-
40
- // eslint-disable-next-line class-methods-use-this
41
- selectUniqueFields(fields) {
42
- return Array.from(
43
- new Map(fields.map((item) => [item.name, item])).values(),
44
- ).reduce((uniqueArray, item) => {
45
- const existingItem = uniqueArray.find(
46
- (uniqueItem) => uniqueItem.name === item.name,
47
- );
48
- if (!existingItem) {
49
- uniqueArray.push(item);
50
- } else if (item.required) {
51
- existingItem.required = true;
52
- }
53
- return uniqueArray;
54
- }, []);
55
- }
56
-
57
- groupFieldsFromSchemas(schemas) {
58
- const result = [];
59
- schemas.forEach((schema) => {
60
- const convertedSchema = new ValidateService(this.app, schema).validator;
61
-
62
- for (const [key, value] of Object.entries(
63
- convertedSchema?.fieldsInJsonFormat,
64
- )) {
65
- result.push({
66
- name: key,
67
- type: value.type,
68
- required: value.required,
69
- });
70
- }
71
- });
72
-
73
- return result;
74
- }
75
-
76
- convertDataToDocumentationElement(
77
- controllerName,
78
- routesInfo,
79
- middlewaresInfo,
80
- routeMiddlewaresReg,
81
- ) {
82
- return {
83
- contollerName: controllerName,
84
- routesInfo: routesInfo.map((route) => {
85
- const middlewareQueryParams = new ValidateService(
86
- this.app,
87
- ).getMiddlewareParams(middlewaresInfo, routeMiddlewaresReg, {
88
- method: route.method.toLowerCase(),
89
- path: route.fullPath,
90
- }).query;
91
-
92
- const middlewareRequestParams = new ValidateService(
93
- this.app,
94
- ).getMiddlewareParams(middlewaresInfo, routeMiddlewaresReg, {
95
- method: route.method.toLowerCase(),
96
- path: route.fullPath,
97
- }).request;
98
-
99
- const queryParams = this.groupFieldsFromSchemas(middlewareQueryParams);
100
-
101
- const requestParams = this.groupFieldsFromSchemas(
102
- middlewareRequestParams,
103
- );
104
-
105
- return {
106
- [route.fullPath]: {
107
- method: route.method,
108
- name: route.name,
109
- description: route?.description,
110
- fields: this.selectUniqueFields([
111
- ...this.processingFields(route.fields),
112
- ...requestParams,
113
- ]),
114
- queryFields: this.selectUniqueFields([
115
- ...this.processingFields(route.queryFields),
116
- ...queryParams,
117
- ]),
118
- routeMiddlewares: routeMiddlewaresReg
119
- .map((middleware) => {
120
- const routeFullPath = route.fullPath.toUpperCase();
121
- const middlewareFullPath = middleware.fullPath.toUpperCase();
122
- if (
123
- route.method.toLowerCase() ===
124
- middleware.method.toLowerCase() &&
125
- (middlewareFullPath === routeFullPath ||
126
- middlewareFullPath === `${routeFullPath}*`)
127
- ) {
128
- return {
129
- name: middleware.name,
130
- params: middleware.params,
131
- authParams: middleware.authParams,
132
- };
133
- }
134
- return null;
135
- })
136
- .filter(Boolean),
137
- controllerMiddlewares: [
138
- ...new Set(
139
- middlewaresInfo
140
- .filter((middleware) => {
141
- const routeFullPath = route.fullPath.toUpperCase();
142
- const middlewareFullPath =
143
- middleware.fullPath.toUpperCase();
144
- const middlewareFullPathWithSliced = middleware.fullPath
145
- .toUpperCase()
146
- .slice(0, -1);
147
-
148
- return (
149
- middlewareFullPath === routeFullPath ||
150
- middlewareFullPath === `${routeFullPath}*` ||
151
- routeFullPath?.indexOf(middlewareFullPathWithSliced) !==
152
- -1
153
- );
154
- })
155
- .map(({ name, params, authParams }) => ({
156
- name,
157
- params,
158
- authParams,
159
- })),
160
- ),
161
- ],
162
- },
163
- };
164
- }),
165
- };
166
- }
167
- }
168
-
169
- export default DocumentationGenerator;
@@ -1,96 +0,0 @@
1
- import http from 'node:http';
2
- // import path from 'node:path';
3
- // import * as url from 'node:url';
4
- import express from 'express';
5
- import RequestLoggerMiddleware from './middleware/RequestLogger.js';
6
- import I18nMiddleware from './middleware/I18n.js';
7
- import PrepareAppInfoMiddleware from './middleware/PrepareAppInfo.js';
8
- import RequestParserMiddleware from './middleware/RequestParser.js';
9
- import IpDetector from './middleware/IpDetector.js';
10
- import Cors from './middleware/Cors.js';
11
- import Base from '../../modules/Base.js';
12
-
13
- /**
14
- * HTTP server based on Express
15
- */
16
- class HttpServer extends Base {
17
- constructor(app) {
18
- super(app);
19
- this.express = express();
20
- this.express.disable('x-powered-by');
21
- // const dirname = url.fileURLToPath(new URL('.', import.meta.url));
22
- // this.express.set('views', [
23
- // this.app.foldersConfig.views,
24
- // path.join(dirname, '../../views'),
25
- // ]);
26
- // this.express.set('view engine', 'pug');
27
-
28
- this.express.use(new RequestLoggerMiddleware(this.app).getMiddleware());
29
- this.express.use(new PrepareAppInfoMiddleware(this.app).getMiddleware());
30
- this.express.use(new IpDetector(this.app).getMiddleware());
31
- this.express.use(new I18nMiddleware(this.app).getMiddleware());
32
-
33
- const httpConfig = this.app.getConfig('http');
34
- this.express.use(
35
- new Cors(this.app, {
36
- origins: httpConfig.corsDomains,
37
- }).getMiddleware(),
38
- );
39
-
40
- this.express.use(new RequestParserMiddleware(this.app).getMiddleware());
41
-
42
- // As exprress will check numbersof arguments
43
- // eslint-disable-next-line no-unused-vars
44
- this.express.use((err, req, res, next) => {
45
- // error handling
46
- // eslint-disable-next-line no-console
47
- console.error(err.stack);
48
- // TODO
49
- res.status(500).json({ message: 'Something broke!' });
50
- });
51
-
52
- this.httpServer = http.createServer(this.express);
53
-
54
- const listener = this.httpServer.listen(
55
- httpConfig.port,
56
- httpConfig.hostname,
57
- () => {
58
- this.logger.info(
59
- `App started and listening on port ${listener.address().port}`,
60
- );
61
- if (+listener.address().port !== +httpConfig.port) {
62
- // in case we using port 0
63
- this.app.updateConfig('http', { port: listener.address().port });
64
- this.logger.info(
65
- `Updating http config to use new port ${
66
- listener.address().port
67
- }. Old was ${httpConfig.port} `,
68
- );
69
- }
70
- },
71
- );
72
- }
73
-
74
- /**
75
- * Add handle for 404 error
76
- */
77
- add404Page() {
78
- this.express.use((req, res) => {
79
- // error handling
80
- res.status(404).json({ message: '404' });
81
- });
82
- }
83
-
84
- static get loggerGroup() {
85
- return 'service';
86
- }
87
-
88
- /**
89
- * Stop http server (mostly for unit testing)
90
- */
91
- shutdown() {
92
- this.httpServer.close();
93
- }
94
- }
95
-
96
- export default HttpServer;
@@ -1,51 +0,0 @@
1
- import yup from 'yup';
2
- import Base from '../../../modules/Base.js';
3
-
4
- class AbstractMiddleware extends Base {
5
- constructor(app, params) {
6
- super(app);
7
- this.params = params;
8
- }
9
-
10
- static get description() {
11
- return 'Middleware description. Please provide own';
12
- }
13
-
14
- static get usedAuthParameters() {
15
- return [];
16
- }
17
-
18
- // eslint-disable-next-line class-methods-use-this
19
- get relatedQueryParameters() {
20
- // For example yup.object().shape({page: yup.number().required(),limit: yup.number()})
21
- return yup.object().shape({});
22
- }
23
-
24
- // eslint-disable-next-line class-methods-use-this
25
- get relatedRequestParameters() {
26
- // For example yup.object().shape({page: yup.number().required(),limit: yup.number()})
27
- return yup.object().shape({});
28
- }
29
-
30
- get relatedReqParameters() {
31
- return {
32
- request: this.relatedRequestParameters,
33
- query: this.relatedQueryParameters,
34
- };
35
- }
36
-
37
- async middleware(req, res, next) {
38
- this.logger.warn('Middleware is not implemented');
39
- next();
40
- }
41
-
42
- getMiddleware() {
43
- return this.middleware.bind(this);
44
- }
45
-
46
- static get loggerGroup() {
47
- return 'middleware';
48
- }
49
- }
50
-
51
- export default AbstractMiddleware;
@@ -1,20 +0,0 @@
1
- import AbstractMiddleware from './AbstractMiddleware.js';
2
-
3
- class AuthMiddleware extends AbstractMiddleware {
4
- static get description() {
5
- return 'Allow to pass only if the user provided. Please use any middleware that provide user instance before';
6
- }
7
-
8
- async middleware(req, res, next) {
9
- if (!req.appInfo.user) {
10
- this.logger.info('User try to access resource without credentials');
11
- return res.status(401).json({
12
- error: 'AUTH001',
13
- message: 'Please login to application',
14
- });
15
- }
16
- return next();
17
- }
18
- }
19
-
20
- export default AuthMiddleware;
@@ -1,46 +0,0 @@
1
- import AbstractMiddleware from './AbstractMiddleware.js';
2
-
3
- class Cors extends AbstractMiddleware {
4
- constructor(app, params) {
5
- super(app);
6
- this.params = params;
7
- if (!Array.isArray(params?.origins) || !params.origins.length) {
8
- throw new Error('Cors inited without origin config');
9
- }
10
- }
11
-
12
- static get description() {
13
- return 'Add CORS headers to request';
14
- }
15
-
16
- async middleware(req, res, next) {
17
- for (const host of this.params.origins) {
18
- if (
19
- (typeof host === 'string' && req.headers.origin === host) ||
20
- (host instanceof RegExp && host.test(req.headers.origin))
21
- ) {
22
- res.set('Access-Control-Allow-Origin', req.headers.origin);
23
- res.set('Vary', 'Origin');
24
-
25
- if (req.method === 'OPTIONS') {
26
- res.set(
27
- 'Access-Control-Allow-Methods',
28
- 'GET,HEAD,PUT,PATCH,POST,DELETE',
29
- );
30
- res.set('Vary', 'Origin, Access-Control-Request-Headers');
31
-
32
- const allowedHeaders = req.headers['access-control-request-headers'];
33
- if (allowedHeaders) {
34
- res.set('Access-Control-Allow-Headers', allowedHeaders);
35
- }
36
- res.set('Content-Length', '0');
37
- res.status(204);
38
- return res.end();
39
- }
40
- }
41
- }
42
- return next();
43
- }
44
- }
45
-
46
- export default Cors;
@@ -1,47 +0,0 @@
1
- import AbstractMiddleware from './AbstractMiddleware.js';
2
-
3
- class GetUserByToken extends AbstractMiddleware {
4
- static get description() {
5
- return 'Grab a token and try to parse the user from it. It user exist will add req.appInfo.user variable';
6
- }
7
-
8
- // eslint-disable-next-line class-methods-use-this
9
- get usedAuthParameters() {
10
- return [
11
- {
12
- name: 'Authorization',
13
- type: 'apiKey',
14
- in: 'header',
15
- description: GetUserByToken.description,
16
- },
17
- ];
18
- }
19
-
20
- async middleware(req, res, next) {
21
- if (req.appInfo.user) {
22
- this.logger.warn('You call GetUserByToken more then once');
23
- return next();
24
- }
25
- let { token } = req.body || {};
26
- this.logger.verbose(
27
- `GetUserByToken token in BODY ${token}. Token in Authorization header ${req.get(
28
- 'Authorization',
29
- )}`,
30
- );
31
- if (!token) {
32
- token = req.get('Authorization');
33
- if (!token || token === 'null') {
34
- // is null express bug*
35
- return next();
36
- }
37
- }
38
- const User = this.app.getModel('User');
39
- const user = await User.getUserByToken(token);
40
- if (user) {
41
- req.appInfo.user = user;
42
- }
43
- return next();
44
- }
45
- }
46
-
47
- export default GetUserByToken;
@@ -1,117 +0,0 @@
1
- import i18next from 'i18next';
2
- import BackendFS from 'i18next-fs-backend';
3
- import AbstractMiddleware from './AbstractMiddleware.js';
4
-
5
- class I18n extends AbstractMiddleware {
6
- cache = {};
7
-
8
- enabled = true;
9
-
10
- lookupQuerystring = '';
11
-
12
- supportedLngs = [];
13
-
14
- fallbackLng = 'en';
15
-
16
- /** @type {i18next} */
17
- i18n = {
18
- // @ts-ignore
19
- t: (text) => text,
20
- language: 'en',
21
- };
22
-
23
- constructor(app, params) {
24
- super(app, params);
25
- const I18NConfig = this.app.getConfig('i18n');
26
-
27
- if (I18NConfig.enabled) {
28
- this.logger.info('Enabling i18n support');
29
- this.i18n = i18next;
30
- i18next.use(BackendFS).init({
31
- backend: {
32
- loadPath: `${this.app.foldersConfig.locales}/{{lng}}/{{ns}}.json`,
33
- addPath: `${this.app.foldersConfig.locales}/{{lng}}/{{ns}}.missing.json`,
34
- },
35
- fallbackLng: I18NConfig.fallbackLng,
36
- preload: I18NConfig.preload,
37
- saveMissing: I18NConfig.saveMissing,
38
- debug: I18NConfig.debug,
39
- });
40
- }
41
-
42
- this.enabled = I18NConfig.enabled;
43
- this.lookupQuerystring = I18NConfig.lookupQuerystring;
44
- this.supportedLngs = I18NConfig.supportedLngs;
45
- this.fallbackLng = I18NConfig.fallbackLng;
46
- }
47
-
48
- static get description() {
49
- return 'Provide language detection and translation';
50
- }
51
-
52
- async middleware(req, res, next) {
53
- let i18n;
54
-
55
- if (this.enabled) {
56
- let lang = this.detectLang(req);
57
- if (!lang || this.supportedLngs.indexOf(lang) === -1) {
58
- this.logger.verbose(
59
- `Language "${lang}" is not supported or not detected. Using fallback on ${this.fallbackLng}`,
60
- );
61
- lang = this.fallbackLng;
62
- }
63
-
64
- if (!this.cache[lang]) {
65
- this.cache[lang] = i18next.cloneInstance({
66
- initAsync: false,
67
- lng: lang,
68
- });
69
- }
70
- i18n = this.cache[lang];
71
- }
72
-
73
- if (!i18n) {
74
- i18n = this.i18n;
75
- }
76
-
77
- req.appInfo.i18n = i18n;
78
- req.i18n = new Proxy(req.appInfo.i18n, {
79
- get: (target, prop) => {
80
- this.logger.warn('Please not use "req.i18n" Use "req.appInfo.i18n"');
81
- return target[prop];
82
- },
83
- });
84
-
85
- return next();
86
- }
87
-
88
- detectors = {
89
- XLang: (req) => req.get('X-Lang'), // grab from header
90
- query: (req) => (req.query ? req.query[this.lookupQuerystring] : false), // grab from query
91
- user: (req) => req.appInfo?.user?.locale, // what if we have a user and user have a defined locale?
92
- };
93
-
94
- detectorOrder = ['XLang', 'query', 'user'];
95
-
96
- detectLang(req, isUseShortCode = true) {
97
- let lang = '';
98
- for (const detectorName of this.detectorOrder) {
99
- const lng = this.detectors[detectorName](req);
100
- if (!lng) {
101
- // eslint-disable-next-line no-continue
102
- continue;
103
- }
104
- if (i18next.services.languageUtils.isSupportedCode(lng)) {
105
- if (isUseShortCode) {
106
- lang = i18next.services.languageUtils.getLanguagePartFromCode(lng);
107
- } else {
108
- lang = lng;
109
- }
110
- break;
111
- }
112
- }
113
- return lang;
114
- }
115
- }
116
-
117
- export default I18n;