@adaptivestone/framework 5.0.0-beta.3 → 5.0.0-beta.30

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 (292) hide show
  1. package/CHANGELOG.md +1044 -526
  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 +23 -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 +120 -0
  133. package/dist/server.js +440 -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 +30 -0
  157. package/dist/services/http/middleware/I18n.js +96 -0
  158. package/dist/services/http/middleware/I18n.js.map +1 -0
  159. package/dist/services/http/middleware/IpDetector.d.ts +12 -0
  160. package/dist/services/http/middleware/IpDetector.js +51 -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 +18 -0
  169. package/dist/services/http/middleware/RateLimiter.js +106 -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/validate/ValidateService.d.ts +31 -0
  181. package/dist/services/validate/ValidateService.js +95 -0
  182. package/dist/services/validate/ValidateService.js.map +1 -0
  183. package/dist/services/validate/drivers/AbstractValidator.d.ts +14 -0
  184. package/dist/services/validate/drivers/AbstractValidator.js +29 -0
  185. package/dist/services/validate/drivers/AbstractValidator.js.map +1 -0
  186. package/dist/services/validate/drivers/CustomValidator.d.ts +14 -0
  187. package/dist/services/validate/drivers/CustomValidator.js +48 -0
  188. package/dist/services/validate/drivers/CustomValidator.js.map +1 -0
  189. package/dist/services/validate/drivers/YupValidator.d.ts +13 -0
  190. package/dist/services/validate/drivers/YupValidator.js +86 -0
  191. package/dist/services/validate/drivers/YupValidator.js.map +1 -0
  192. package/dist/tests/frameworkVitestSetup.d.ts +1 -0
  193. package/dist/tests/frameworkVitestSetup.js +9 -0
  194. package/dist/tests/frameworkVitestSetup.js.map +1 -0
  195. package/dist/tests/globalSetupVitest.d.ts +3 -0
  196. package/dist/tests/globalSetupVitest.js +29 -0
  197. package/dist/tests/globalSetupVitest.js.map +1 -0
  198. package/dist/tests/setupVitest.d.ts +1 -0
  199. package/dist/tests/setupVitest.js +91 -0
  200. package/dist/tests/setupVitest.js.map +1 -0
  201. package/dist/tests/testHelpers.d.ts +340 -0
  202. package/dist/tests/testHelpers.js +48 -0
  203. package/dist/tests/testHelpers.js.map +1 -0
  204. package/package.json +38 -35
  205. package/Cli.js +0 -22
  206. package/cluster.js +0 -27
  207. package/commands/CreateUser.js +0 -75
  208. package/commands/Documentation.js +0 -17
  209. package/commands/DropIndex.js +0 -29
  210. package/commands/GenerateRandomBytes.js +0 -21
  211. package/commands/GetOpenApiJson.js +0 -325
  212. package/commands/SyncIndexes.js +0 -39
  213. package/commands/migration/Create.js +0 -61
  214. package/commands/migration/Migrate.js +0 -55
  215. package/config/auth.js +0 -9
  216. package/config/http.js +0 -9
  217. package/config/i18n.js +0 -12
  218. package/config/ipDetector.js +0 -14
  219. package/config/log.js +0 -22
  220. package/config/mail.js +0 -29
  221. package/config/mongo.js +0 -3
  222. package/config/rateLimiter.js +0 -16
  223. package/config/redis.js +0 -4
  224. package/config/validate.js +0 -3
  225. package/controllers/Auth.js +0 -210
  226. package/controllers/Home.js +0 -28
  227. package/controllers/index.js +0 -60
  228. package/folderConfig.js +0 -14
  229. package/helpers/files.js +0 -79
  230. package/helpers/logger.js +0 -17
  231. package/helpers/redis/clearNamespace.js +0 -14
  232. package/helpers/yup.js +0 -24
  233. package/index.js +0 -8
  234. package/jsconfig.json +0 -9
  235. package/locales/en/translation.json +0 -27
  236. package/locales/ru/translation.json +0 -27
  237. package/migrations/.gitkeep +0 -0
  238. package/models/Migration.js +0 -15
  239. package/models/Sequence.js +0 -22
  240. package/models/User.js +0 -263
  241. package/modules/AbstractCommand.js +0 -43
  242. package/modules/AbstractConnector.js +0 -9
  243. package/modules/AbstractController.js +0 -413
  244. package/modules/AbstractModel.d.ts +0 -48
  245. package/modules/AbstractModel.js +0 -88
  246. package/modules/Base.d.ts +0 -37
  247. package/modules/Base.js +0 -63
  248. package/modules/BaseCli.js +0 -97
  249. package/server.d.ts +0 -98
  250. package/server.js +0 -429
  251. package/services/cache/Cache.d.ts +0 -35
  252. package/services/cache/Cache.js +0 -124
  253. package/services/documentation/DocumentationGenerator.js +0 -169
  254. package/services/http/HttpServer.js +0 -96
  255. package/services/http/middleware/AbstractMiddleware.js +0 -51
  256. package/services/http/middleware/Auth.js +0 -20
  257. package/services/http/middleware/Cors.js +0 -46
  258. package/services/http/middleware/GetUserByToken.js +0 -47
  259. package/services/http/middleware/I18n.js +0 -117
  260. package/services/http/middleware/IpDetector.js +0 -59
  261. package/services/http/middleware/Pagination.js +0 -57
  262. package/services/http/middleware/PrepareAppInfo.js +0 -18
  263. package/services/http/middleware/RateLimiter.js +0 -134
  264. package/services/http/middleware/RequestLogger.js +0 -22
  265. package/services/http/middleware/RequestParser.js +0 -40
  266. package/services/http/middleware/Role.js +0 -29
  267. package/services/messaging/email/index.js +0 -217
  268. package/services/messaging/email/resources/.gitkeep +0 -1
  269. package/services/messaging/email/templates/emptyTemplate/html.pug +0 -9
  270. package/services/messaging/email/templates/emptyTemplate/subject.pug +0 -1
  271. package/services/messaging/email/templates/emptyTemplate/text.pug +0 -1
  272. package/services/messaging/email/templates/recovery/html.pug +0 -8
  273. package/services/messaging/email/templates/recovery/subject.pug +0 -2
  274. package/services/messaging/email/templates/recovery/text.pug +0 -3
  275. package/services/messaging/email/templates/verification/html.pug +0 -10
  276. package/services/messaging/email/templates/verification/subject.pug +0 -1
  277. package/services/messaging/email/templates/verification/text.pug +0 -1
  278. package/services/messaging/index.js +0 -3
  279. package/services/validate/ValidateService.js +0 -157
  280. package/services/validate/drivers/AbstractValidator.js +0 -37
  281. package/services/validate/drivers/CustomValidator.js +0 -51
  282. package/services/validate/drivers/YupValidator.js +0 -103
  283. package/tests/globalSetupVitest.js +0 -35
  284. package/tests/setup.js +0 -118
  285. package/tests/setupVitest.js +0 -109
  286. package/types/Expand.d.ts +0 -11
  287. package/types/TFoldersConfig.d.ts +0 -17
  288. package/views/404.pug +0 -3
  289. package/views/home.pug +0 -3
  290. package/views/layouts/base.pug +0 -39
  291. package/vitest.config.js +0 -16
  292. /package/{commands → dist/migrations}/.gitkeep +0 -0
@@ -1,39 +0,0 @@
1
- import path from 'node:path';
2
- import * as url from 'node:url';
3
- import AbstractCommand from '../modules/AbstractCommand.js';
4
-
5
- class SyncIndexes extends AbstractCommand {
6
- async run() {
7
- const dirname = url.fileURLToPath(new URL('.', import.meta.url));
8
- const files = await this.getFilesPathWithInheritance(
9
- path.join(dirname, '/../models'),
10
- this.app.foldersConfig.models,
11
- );
12
- let models = [];
13
-
14
- for (const file of files) {
15
- models.push(path.basename(file.file, path.extname(file.file)));
16
- }
17
- models = models.sort();
18
- this.logger.info(`Total found ${models.length} models`);
19
-
20
- for (const modelName of models) {
21
- const Model = this.app.getModel(modelName);
22
- // eslint-disable-next-line no-await-in-loop
23
- const removedIndexes = await Model.syncIndexes(); // await in loop not a bug. Lets do one by one
24
- if (removedIndexes.length) {
25
- this.logger.info(
26
- `Model - ${modelName} removed indexes: ${removedIndexes}`,
27
- );
28
- } else {
29
- this.logger.info(`Model - ${modelName} NO removed indexes`);
30
- }
31
- }
32
- }
33
-
34
- static get description() {
35
- return 'Synchronize indexes defined in models with a real one indexed on the database. Command will remove all indexes from the database that do not exist on model OR have different parameters. Then it will create a new indexes ';
36
- }
37
- }
38
-
39
- export default SyncIndexes;
@@ -1,61 +0,0 @@
1
- import path from 'node:path';
2
- import { promises as fs } from 'node:fs';
3
- import AbstractCommand from '../../modules/AbstractCommand.js';
4
-
5
- class CreateMigration extends AbstractCommand {
6
- static get description() {
7
- return 'Create new migration';
8
- }
9
-
10
- async run() {
11
- if (!this.args.name) {
12
- return this.logger.error(
13
- 'Please provide migration name with key "--name={someName}"',
14
- );
15
- }
16
- if (this.args.name.match(/^\d/)) {
17
- return this.logger.error('Command cant start from nubmer');
18
- }
19
- const fileName = `${Date.now()}_${this.constructor.camelSentence(
20
- this.args.name,
21
- )}.js`;
22
-
23
- const fileContent = this.constructor.getTemplate(
24
- this.constructor.camelSentence(this.args.name),
25
- );
26
-
27
- await fs.writeFile(
28
- path.join(this.app.foldersConfig.migrations, fileName),
29
- fileContent,
30
- );
31
- return this.logger.info(`Migration created ${fileName}`);
32
- }
33
-
34
- static camelSentence(str) {
35
- return ` ${str}`
36
- .toLowerCase()
37
- .replace(/[^a-zA-Z0-9]+(.)/g, (match, chr) => chr.toUpperCase());
38
- }
39
-
40
- static getTemplate(name) {
41
- return `/* eslint-disable class-methods-use-this */
42
-
43
- import Base from '@adaptivestone/framework/modules/Base.js';
44
-
45
- class ${name} extends Base {
46
- async up() {
47
- // put here your mirgation up logic
48
- // const YourModel = this.app.getModel('ModelName');
49
- }
50
-
51
- async down() {
52
- // put here your mirgation down logic
53
- }
54
- }
55
-
56
- export default ${name};
57
- `;
58
- }
59
- }
60
-
61
- export default CreateMigration;
@@ -1,55 +0,0 @@
1
- import * as url from 'node:url';
2
- import path from 'node:path';
3
- import AbstractCommand from '../../modules/AbstractCommand.js';
4
-
5
- class Migrate extends AbstractCommand {
6
- static get description() {
7
- return 'Run all pending migrations';
8
- }
9
-
10
- async run() {
11
- const dirname = url.fileURLToPath(new URL('.', import.meta.url));
12
-
13
- const files = await this.getFilesPathWithInheritance(
14
- path.join(dirname, '/../../migrations'),
15
- this.app.foldersConfig.migrations,
16
- );
17
- files.sort(
18
- (a, b) => Number(a.file.split('_')[0]) - Number(b.file.split('_')[0]),
19
- );
20
- const MigrationModel = this.app.getModel('Migration');
21
- const lastMigration = await MigrationModel.findOne({})
22
- .sort({ createdAt: -1 })
23
- .exec();
24
-
25
- let migrations = files;
26
-
27
- if (lastMigration) {
28
- const lastMigrationTime = Number(
29
- lastMigration.migrationFile.split('_')[0],
30
- );
31
- migrations = files.filter(
32
- (val) => Number(val.file.split('_')[0]) > lastMigrationTime,
33
- );
34
- }
35
-
36
- for (const migration of migrations) {
37
- this.logger.info(`=== Start migration ${migration.file} ===`);
38
- // eslint-disable-next-line no-await-in-loop
39
- const { default: MigrationCommand } = await import(migration.path);
40
- const migrationCommand = new MigrationCommand(this.app);
41
- // eslint-disable-next-line no-await-in-loop
42
- await migrationCommand.up();
43
- // eslint-disable-next-line no-await-in-loop
44
- await MigrationModel.create({
45
- migrationFile: migration.file,
46
- });
47
- }
48
-
49
- this.logger.info(
50
- `=== Migration Finished. Migrated ${migrations.length} files ===`,
51
- );
52
- }
53
- }
54
-
55
- export default Migrate;
package/config/auth.js DELETED
@@ -1,9 +0,0 @@
1
- export default {
2
- hashRounds: 64,
3
- saltSecret:
4
- process.env.AUTH_SALT ||
5
- console.error(
6
- 'AUTH_SALT is not defined. You can "npm run cli generateRandomBytes" and use it',
7
- ),
8
- isAuthWithVefificationFlow: true,
9
- };
package/config/http.js DELETED
@@ -1,9 +0,0 @@
1
- export default {
2
- port: process.env.HTTP_PORT || 3300,
3
- hostname: process.env.HTTP_HOST || '0.0.0.0',
4
- // if you want to use 'all' domains please copy this file to your app
5
- // and set "corsDomains: [/./]
6
- corsDomains: ['http://localhost:3000'],
7
- myDomain: process.env.HTTP_DOMAIN || 'http://localhost:3300',
8
- siteDomain: process.env.FRONT_DOMAIN || 'http://localhost:3000',
9
- };
package/config/i18n.js DELETED
@@ -1,12 +0,0 @@
1
- /**
2
- * You can use any options from https://www.i18next.com/overview/configuration-options
3
- */
4
- export default {
5
- enabled: true,
6
- preload: ['en', 'ru'],
7
- supportedLngs: ['en', 'ru'], // should be at least one supported
8
- fallbackLng: 'en',
9
- saveMissing: false,
10
- debug: false,
11
- lookupQuerystring: 'lng', // string to detect language on query
12
- };
@@ -1,14 +0,0 @@
1
- export default {
2
- headers: ['X-Forwarded-For'],
3
- trustedProxy: [
4
- // list of trusted proxies.
5
- '169.254.0.0/16', // linklocal
6
- 'fe80::/10', // linklocal
7
- '127.0.0.1/8', // loopback
8
- '::1/128', // loopback
9
- '10.0.0.0/8', // uniquelocal
10
- '172.16.0.0/12', // uniquelocal
11
- '192.168.0.0/16', // uniquelocal
12
- 'fc00::/7', // uniquelocal
13
- ],
14
- };
package/config/log.js DELETED
@@ -1,22 +0,0 @@
1
- export default {
2
- transports: [
3
- {
4
- transport: 'winston-transport-sentry-node',
5
- transportOptions: {
6
- sentry: {
7
- dsn: process.env.LOGGER_SENTRY_DSN || process.env.SENTRY_DSN,
8
- },
9
- level: process.env.LOGGER_SENTRY_LEVEL || 'info',
10
- },
11
- enable: process.env.LOGGER_SENTRY_ENABLE || false,
12
- },
13
- {
14
- transport: 'console',
15
- transportOptions: {
16
- level: process.env.LOGGER_CONSOLE_LEVEL || 'silly',
17
- timestamp: true,
18
- },
19
- enable: process.env.LOGGER_CONSOLE_ENABLE || true,
20
- },
21
- ],
22
- };
package/config/mail.js DELETED
@@ -1,29 +0,0 @@
1
- import path from 'node:path';
2
-
3
- export default {
4
- from: 'Localhost <info@localhost>',
5
- transports: {
6
- sendMail: {
7
- // path: "path to the sendmail command (defaults to 'sendmail')"
8
- // args: 'an array of extra command line options to pass to the sendmail command (ie. ["-f", "foo@blurdybloop.com"]).'
9
- },
10
- stub: {},
11
- smtp: {
12
- // https://github.com/nodemailer/nodemailer#set-up-smtp
13
- host: process.env.EMAIL_HOST || 'smtp.mailtrap.io',
14
- port: process.env.EMAIL_PORT || 2525,
15
- auth: {
16
- user: process.env.EMAIL_USER,
17
- pass: process.env.EMAIL_PASSWORD,
18
- },
19
- connectionTimeout: 10000, // timeout to 10 seconds
20
- },
21
- },
22
- transport: process.env.EMAIL_TRANSPORT || 'smtp',
23
- webResources: {
24
- // https://github.com/jrit/web-resource-inliner path to find resources
25
- relativeTo: path.resolve('src/services/messaging/email/resources'),
26
- images: false,
27
- },
28
- globalVariablesToTemplates: {},
29
- };
package/config/mongo.js DELETED
@@ -1,3 +0,0 @@
1
- export default {
2
- connectionString: process.env.MONGO_DSN,
3
- };
@@ -1,16 +0,0 @@
1
- export default {
2
- limiterOptions: {
3
- // https://github.com/animir/node-rate-limiter-flexible
4
- // https://github.com/animir/node-rate-limiter-flexible/wiki/Options
5
- points: 10, // 10 points
6
- duration: 60, // Per 60 seconds
7
- },
8
- driver: 'memory', // can be 'mongo', 'redis'
9
- consumePoints: 1,
10
- consumeKeyComponents: {
11
- ip: true, // include ip to key generation
12
- route: true, // include route to key generation
13
- user: true, // include user id to key generation (if user exits)
14
- request: [], // what should be included from request (req.appInfo.request) if it presented
15
- },
16
- };
package/config/redis.js DELETED
@@ -1,4 +0,0 @@
1
- export default {
2
- url: process.env.REDIS_URI || 'redis://localhost',
3
- namespace: process.env.REDIS_NAMESPACE || 'main',
4
- };
@@ -1,3 +0,0 @@
1
- export default {
2
- controllerValidationAbortEarly: true, // abort validation on first error and return first error
3
- };
@@ -1,210 +0,0 @@
1
- import yup from 'yup';
2
- import AbstractController from '../modules/AbstractController.js';
3
- import GetUserByToken from '../services/http/middleware/GetUserByToken.js';
4
- import RateLimiter from '../services/http/middleware/RateLimiter.js';
5
-
6
- class Auth extends AbstractController {
7
- get routes() {
8
- return {
9
- post: {
10
- '/login': {
11
- handler: this.postLogin,
12
- request: yup.object().shape({
13
- email: yup.string().email().required('auth.emailProvided'), // if not provided then error will be generated
14
- password: yup.string().required('auth.passwordProvided'), // possible to provide values from translation
15
- }),
16
- },
17
- '/register': {
18
- handler: this.postRegister,
19
- request: yup.object().shape({
20
- email: yup
21
- .string()
22
- .email('auth.emailValid')
23
- .required('auth.emailProvided'),
24
- password: yup
25
- .string()
26
- .matches(
27
- /^[a-zA-Z0-9!@#$%ˆ^&*()_+\-{}[\]<>]+$/,
28
- 'auth.passwordValid',
29
- )
30
- .required('auth.passwordProvided'),
31
- nickName: yup
32
- .string()
33
- .matches(/^[a-zA-Z0-9_\-.]+$/, 'auth.nickNameValid'),
34
- firstName: yup.string(),
35
- lastName: yup.string(),
36
- }),
37
- },
38
- '/logout': this.postLogout,
39
- '/verify': this.verifyUser,
40
- '/send-recovery-email': {
41
- handler: this.sendPasswordRecoveryEmail,
42
- request: yup
43
- .object()
44
- .shape({ email: yup.string().email().required() }),
45
- },
46
- '/recover-password': {
47
- handler: this.recoverPassword,
48
- request: yup.object().shape({
49
- password: yup
50
- .string()
51
- .matches(
52
- /^[a-zA-Z0-9!@#$%ˆ^&*()_+\-{}[\]<>]+$/,
53
- 'auth.passwordValid',
54
- )
55
- .required(),
56
- passwordRecoveryToken: yup.string().required(),
57
- }),
58
- },
59
- '/send-verification': {
60
- handler: this.sendVerification,
61
- request: yup
62
- .object()
63
- .shape({ email: yup.string().email().required() }),
64
- },
65
- },
66
- };
67
- }
68
-
69
- async postLogin(req, res) {
70
- const User = this.app.getModel('User');
71
- const user = await User.getUserByEmailAndPassword(
72
- req.appInfo.request.email, // we do a request casting
73
- req.appInfo.request.password, // we do a request casting
74
- );
75
- if (!user) {
76
- return res.status(400).json({ message: req.i18n.t('auth.errorUPValid') });
77
- }
78
- const { isAuthWithVefificationFlow } = this.app.getConfig('auth');
79
- if (isAuthWithVefificationFlow && !user.isVerified) {
80
- return res
81
- .status(400)
82
- .json({ message: req.i18n.t('email.notVerified'), notVerified: true });
83
- }
84
- const token = await user.generateToken();
85
-
86
- return res.status(200).json({ data: { token, user: user.getPublic() } });
87
- }
88
-
89
- async postRegister(req, res) {
90
- const User = req.appInfo.app.getModel('User');
91
- let user = await User.getUserByEmail(req.appInfo.request.email);
92
- if (user) {
93
- return res.status(400).json({ message: req.i18n.t('email.registered') });
94
- }
95
- if (req.appInfo.request.nickName) {
96
- user = await User.findOne({ 'name.nick': req.appInfo.request.nickName });
97
- if (user) {
98
- return res
99
- .status(400)
100
- .json({ message: req.i18n.t('auth.nicknameExists') });
101
- }
102
- }
103
-
104
- user = await User.create({
105
- email: req.appInfo.request.email,
106
- password: req.appInfo.request.password,
107
- name: {
108
- first: req.appInfo.request.firstName,
109
- last: req.appInfo.request.lastName,
110
- nick: req.appInfo.request.nickName,
111
- },
112
- });
113
-
114
- const { isAuthWithVefificationFlow } = this.app.getConfig('auth');
115
- if (isAuthWithVefificationFlow) {
116
- const answer = await user.sendVerificationEmail(req.i18n).catch((e) => {
117
- this.logger.error(e);
118
- });
119
- if (!answer) {
120
- return res.status(500).json();
121
- }
122
- }
123
- return res.status(201).json();
124
- }
125
-
126
- // eslint-disable-next-line class-methods-use-this
127
- async postLogout(req, res) {
128
- // todo remove token
129
- return res.status(200).json();
130
- }
131
-
132
- async verifyUser(req, res) {
133
- const User = req.appInfo.app.getModel('User');
134
- let user;
135
- try {
136
- user = await User.getUserByVerificationToken(
137
- req.query.verification_token,
138
- );
139
- } catch (e) {
140
- return res.status(400).json({
141
- message: req.i18n.t('email.alreadyVerifiedOrWrongToken'),
142
- });
143
- }
144
- this.logger.debug(`Verify user user is :${user}`);
145
- if (!user) {
146
- return res.status(400).json({
147
- message: req.i18n.t('email.alreadyVerifiedOrWrongToken'),
148
- });
149
- }
150
-
151
- user.isVerified = true;
152
- await user.save();
153
- return res.status(200).json();
154
- }
155
-
156
- async sendPasswordRecoveryEmail(req, res) {
157
- const User = req.appInfo.app.getModel('User');
158
- try {
159
- const user = await User.getUserByEmail(req.appInfo.request.email);
160
- if (!user) {
161
- return res
162
- .status(400)
163
- .json({ message: req.i18n.t('auth.errorUExist') });
164
- }
165
- await user.sendPasswordRecoveryEmail(req.i18n);
166
- return res.status(200).json();
167
- } catch (e) {
168
- this.logger.error(e);
169
- return res.status(400).json({ message: req.i18n.t('auth.errorUExist') });
170
- }
171
- }
172
-
173
- async recoverPassword(req, res) {
174
- const User = this.app.getModel('User');
175
- const user = await User.getUserByPasswordRecoveryToken(
176
- req.appInfo.request.passwordRecoveryToken,
177
- ).catch((e) => {
178
- this.logger.error(e);
179
- });
180
-
181
- if (!user) {
182
- return res
183
- .status(400)
184
- .json({ message: req.i18n.t('password.wrongToken') });
185
- }
186
-
187
- this.logger.debug(`Password recovery user is :${user}`);
188
-
189
- user.password = req.appInfo.request.password;
190
- user.isVerified = true;
191
- await user.save();
192
- return res.status(200).json();
193
- }
194
-
195
- async sendVerification(req, res) {
196
- const User = this.app.getModel('User');
197
- const user = await User.getUserByEmail(req.appInfo.request.email);
198
- if (!user) {
199
- return res.status(400).json({ message: req.i18n.t('auth.errorUExist') });
200
- }
201
- await user.sendVerificationEmail(req.i18n);
202
- return res.status(200).json();
203
- }
204
-
205
- static get middleware() {
206
- return new Map([['/{*splat}', [GetUserByToken, RateLimiter]]]);
207
- }
208
- }
209
-
210
- export default Auth;
@@ -1,28 +0,0 @@
1
- import AbstractController from '../modules/AbstractController.js';
2
- import GetUserByToken from '../services/http/middleware/GetUserByToken.js';
3
-
4
- class Home extends AbstractController {
5
- get routes() {
6
- return {
7
- get: {
8
- '/': this.home,
9
- },
10
- };
11
- }
12
-
13
- // eslint-disable-next-line class-methods-use-this
14
- async home(req, res) {
15
- return res.json({ message: 'Home' });
16
- }
17
-
18
- // eslint-disable-next-line class-methods-use-this
19
- getHttpPath() {
20
- return '/';
21
- }
22
-
23
- static get middleware() {
24
- return new Map([['/{*splat}', [GetUserByToken]]]);
25
- }
26
- }
27
-
28
- export default Home;
@@ -1,60 +0,0 @@
1
- import path from 'node:path';
2
- import * as url from 'node:url';
3
- import Base from '../modules/Base.js';
4
-
5
- /**
6
- * Class do autoloading a http controllers
7
- */
8
- class ControllerManager extends Base {
9
- constructor(app) {
10
- super(app);
11
- this.controllers = {};
12
- }
13
-
14
- /**
15
- * Load controllers
16
- */
17
- async initControllers() {
18
- const dirname = url.fileURLToPath(new URL('.', import.meta.url));
19
- const controllersToLoad = await this.getFilesPathWithInheritance(
20
- dirname,
21
- this.app.foldersConfig.controllers,
22
- );
23
-
24
- controllersToLoad.sort((a, b) => {
25
- if (a.file.toLowerCase().endsWith('index.js')) {
26
- if (b.file.toLowerCase().endsWith('index.js')) {
27
- return 0;
28
- }
29
- return -1;
30
- }
31
- return 0;
32
- });
33
- const controllers = [];
34
- for (const controller of controllersToLoad) {
35
- controllers.push(
36
- import(controller.path).then(({ default: ControllerModule }) => {
37
- const contollerName = ControllerModule.name.toLowerCase();
38
- let prefix = path.dirname(controller.file);
39
- if (prefix === '.') {
40
- prefix = '';
41
- }
42
- const controllePath = prefix
43
- ? `${prefix}/${contollerName}`
44
- : contollerName;
45
- this.controllers[controllePath] = new ControllerModule(
46
- this.app,
47
- prefix,
48
- );
49
- }),
50
- );
51
- }
52
- await Promise.all(controllers);
53
- }
54
-
55
- static get loggerGroup() {
56
- return 'controller';
57
- }
58
- }
59
-
60
- export default ControllerManager;
package/folderConfig.js DELETED
@@ -1,14 +0,0 @@
1
- import path from 'node:path';
2
-
3
- export default {
4
- folders: {
5
- config: path.resolve('./config'),
6
- models: path.resolve('./models'),
7
- controllers: path.resolve('./controllers'),
8
- views: path.resolve('./views'),
9
- locales: path.resolve('./locales'),
10
- emails: path.resolve('./services/messaging/email/templates'),
11
- commands: path.resolve('./commands'),
12
- migrations: path.resolve('./migrations'),
13
- },
14
- };
package/helpers/files.js DELETED
@@ -1,79 +0,0 @@
1
- import { promises as fs } from 'node:fs';
2
- import { join } from 'node:path';
3
-
4
- const getFilesPathWithInheritance = async ({
5
- internalFolder,
6
- externalFolder,
7
- logger,
8
- loggerFileType = '',
9
- filter: { startWithCapital = true, notTests = true, notHidden = true } = {},
10
- }) => {
11
- const [internalFiles, externalFiles] = await Promise.all([
12
- fs.readdir(internalFolder, { recursive: true, withFileTypes: true }),
13
- fs.readdir(externalFolder, { recursive: true, withFileTypes: true }),
14
- ]);
15
-
16
- const filterIndexFile = (fileDirent) => {
17
- if (!fileDirent.isFile()) {
18
- return false;
19
- }
20
- const fileArray = fileDirent.name.split('/');
21
- const file = fileArray[fileArray.length - 1];
22
- if (startWithCapital && file[0] !== file[0].toUpperCase()) {
23
- // not start with capital
24
- return false;
25
- }
26
- if (notTests && file.endsWith('.test.js')) {
27
- return false;
28
- }
29
- if (notHidden && file[0] === '.') {
30
- // not start with dot
31
- return false;
32
- }
33
- return true;
34
- };
35
-
36
- const internalFilesString = internalFiles
37
- .filter(filterIndexFile)
38
- .map((fileDirent) =>
39
- join(fileDirent.parentPath, fileDirent.name)
40
- .replace(`${internalFolder}/`, '')
41
- .replace(`${internalFolder}`, ''),
42
- );
43
- const externalFilesString = externalFiles
44
- .filter(filterIndexFile)
45
- .map((fileDirent) =>
46
- join(fileDirent.parentPath, fileDirent.name)
47
- .replace(`${externalFolder}/`, '')
48
- .replace(`${externalFolder}`, ''),
49
- );
50
-
51
- const filesToLoad = [];
52
- for (const file of internalFilesString) {
53
- if (externalFilesString.includes(file)) {
54
- logger(
55
- `Skipping register INTERNAL file '${file}' ${
56
- loggerFileType ? `of type ${loggerFileType}` : ''
57
- } as it override by EXTERNAL ONE`,
58
- );
59
- } else {
60
- filesToLoad.push({
61
- path: join(internalFolder, file),
62
- file,
63
- });
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
-
76
- export {
77
- // eslint-disable-next-line import/prefer-default-export
78
- getFilesPathWithInheritance,
79
- };