@adaptivestone/framework 3.4.3 → 4.0.0

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 (52) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/LICENCE +21 -0
  3. package/cluster.js +3 -3
  4. package/commands/CreateUser.js +27 -0
  5. package/commands/Documentation.js +1 -1
  6. package/commands/GetOpenApiJson.js +53 -23
  7. package/commands/migration/Create.js +2 -2
  8. package/config/auth.js +1 -1
  9. package/config/i18n.js +4 -3
  10. package/config/mail.js +5 -1
  11. package/controllers/Home.js +2 -2
  12. package/controllers/Home.test.js +11 -0
  13. package/controllers/index.js +15 -15
  14. package/folderConfig.js +1 -1
  15. package/helpers/yup.js +24 -0
  16. package/index.js +8 -0
  17. package/models/User.js +38 -27
  18. package/models/User.test.js +68 -18
  19. package/modules/AbstractController.js +144 -208
  20. package/modules/AbstractModel.js +2 -1
  21. package/modules/Base.js +3 -2
  22. package/modules/BaseCli.js +6 -2
  23. package/package.json +18 -14
  24. package/server.d.ts +1 -1
  25. package/server.js +25 -8
  26. package/services/cache/Cache.d.ts +3 -3
  27. package/services/cache/Cache.js +17 -3
  28. package/services/documentation/DocumentationGenerator.js +171 -0
  29. package/services/http/HttpServer.js +16 -96
  30. package/services/http/middleware/AbstractMiddleware.js +20 -0
  31. package/services/http/middleware/GetUserByToken.js +4 -0
  32. package/services/http/middleware/I18n.js +119 -0
  33. package/services/http/middleware/I18n.test.js +77 -0
  34. package/services/http/middleware/Pagination.js +56 -0
  35. package/services/http/middleware/PrepareAppInfo.test.js +22 -0
  36. package/services/http/middleware/{Middlewares.test.js → RateLimiter.test.js} +1 -1
  37. package/services/http/middleware/RequestLogger.js +22 -0
  38. package/services/http/middleware/RequestParser.js +36 -0
  39. package/services/messaging/email/index.js +141 -41
  40. package/services/messaging/email/resources/.gitkeep +1 -0
  41. package/services/validate/ValidateService.js +161 -0
  42. package/services/validate/ValidateService.test.js +105 -0
  43. package/services/validate/drivers/AbstractValidator.js +37 -0
  44. package/services/validate/drivers/CustomValidator.js +52 -0
  45. package/services/validate/drivers/YupValidator.js +103 -0
  46. package/tests/setup.js +2 -0
  47. package/services/messaging/email/templates/emptyTemplate/style.less +0 -0
  48. package/services/messaging/email/templates/password/html.handlebars +0 -13
  49. package/services/messaging/email/templates/password/style.less +0 -0
  50. package/services/messaging/email/templates/password/subject.handlebars +0 -1
  51. package/services/messaging/email/templates/password/text.handlebars +0 -1
  52. package/services/messaging/email/templates/verification/style.less +0 -0
@@ -0,0 +1,103 @@
1
+ const yup = require('yup');
2
+ const AbstractValidator = require('./AbstractValidator');
3
+
4
+ class YupValidator extends AbstractValidator {
5
+ get fieldsInJsonFormat() {
6
+ return this.constructor.convertFieldsToJson(this.body);
7
+ }
8
+
9
+ static convertFieldsToJson(fields) {
10
+ const convertedFields = {};
11
+ const entries = Object.entries(fields.describe().fields);
12
+
13
+ if (!entries?.length) {
14
+ return convertedFields;
15
+ }
16
+ const requiredFields = [];
17
+
18
+ for (const [field, fieldProp] of entries) {
19
+ const isRequired = fieldProp?.tests?.find(
20
+ (prop) => prop.name === 'required',
21
+ );
22
+ if (isRequired) {
23
+ requiredFields.push(field);
24
+ }
25
+ }
26
+
27
+ entries.forEach(([key, value]) => {
28
+ if (!convertedFields[key]) {
29
+ convertedFields[key] = {};
30
+ }
31
+
32
+ convertedFields[key] = {
33
+ type: value.type,
34
+ required: requiredFields?.includes(key),
35
+ };
36
+ });
37
+
38
+ return convertedFields;
39
+ }
40
+
41
+ async validateFields(data, { query, body, appInfo }) {
42
+ const yupSchema = this.body;
43
+ const { controllerValidationAbortEarly } = this.app.getConfig('validate');
44
+ if (yupSchema) {
45
+ if (typeof yupSchema.validate !== 'function') {
46
+ this.logger.error('request.validate should be a function');
47
+ }
48
+ }
49
+
50
+ try {
51
+ await yupSchema.validate(data, {
52
+ abortEarly: controllerValidationAbortEarly,
53
+ req: { query, body },
54
+ });
55
+ } catch (e) {
56
+ let { errors } = e;
57
+ // translate it
58
+ if (appInfo.i18n && errors) {
59
+ errors = errors.map((err) => appInfo.i18n.t(err, err));
60
+ }
61
+ this.logger.error(
62
+ `Request validation failed with message: ${e.message}. errors: ${errors}`,
63
+ );
64
+
65
+ const errorAnswer = {};
66
+ if (!e.inner || !e.inner.length) {
67
+ errorAnswer[e.path] = errors;
68
+ } else {
69
+ e.inner.forEach((err) => {
70
+ errorAnswer[err.path] = err.errors;
71
+ if (appInfo.i18n && err.errors) {
72
+ errorAnswer[err.path] = err.errors.map((err1) =>
73
+ appInfo.i18n.t(err1, err1, err.params),
74
+ );
75
+ }
76
+ });
77
+ }
78
+
79
+ throw new yup.ValidationError({
80
+ ...errorAnswer,
81
+ });
82
+ }
83
+ }
84
+
85
+ async castFields(data, { query, body }) {
86
+ const yupSchema = this.body;
87
+ if (yupSchema) {
88
+ if (typeof yupSchema.cast !== 'function') {
89
+ this.logger.error('request.cast should be a function');
90
+ }
91
+ }
92
+
93
+ return yupSchema.cast(data, {
94
+ stripUnknown: true,
95
+ req: { query, body },
96
+ });
97
+ }
98
+
99
+ static get loggerGroup() {
100
+ return 'YupValidator_';
101
+ }
102
+ }
103
+ module.exports = YupValidator;
package/tests/setup.js CHANGED
@@ -56,7 +56,9 @@ beforeAll(async () => {
56
56
  nick: 'testUserNickName',
57
57
  },
58
58
  }).catch((e) => {
59
+ // eslint-disable-next-line no-console
59
60
  console.error(e);
61
+ // eslint-disable-next-line no-console
60
62
  console.info(
61
63
  'That error can happens in case you have custom user model. Please use global.testSetup.disableUserCreate flag to skip user creating',
62
64
  );
@@ -1,13 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <title>{{t('email.newPassword')}}</title>
6
- </head>
7
- <body>
8
- <h1>{{t('email.greeating')}} {{username}}</h1>
9
- <p>Ваш новый пароль <b>{{password}}</b> <br>
10
- не забудьте его поменять в личном кабинете. <br>
11
- <a href="http://{{realm}}.localhost:3000/#/login">Войти на сайт</a></p>
12
- </body>
13
- </html>
@@ -1 +0,0 @@
1
- Новый пароль
@@ -1 +0,0 @@
1
- Добрый день {{username}}Для создание нового пароля перейдите по ссылке {{link}}