@wabot-dev/framework 0.1.0-beta.6 → 0.1.0-beta.60

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 (183) hide show
  1. package/dist/src/addon/async/pg/PgJobRepository.js +26 -0
  2. package/dist/src/addon/auth/api-key/@apiKeyConnectionGuard.js +16 -0
  3. package/dist/src/addon/auth/api-key/@apiKeyGuard.js +17 -0
  4. package/dist/src/addon/auth/api-key/ApiKey.js +53 -0
  5. package/dist/src/addon/auth/api-key/ApiKeyConnectionGuardMiddleware.js +57 -0
  6. package/dist/src/addon/auth/api-key/ApiKeyGuardMiddleware.js +45 -0
  7. package/dist/src/addon/auth/api-key/ApiKeyRepository.js +35 -0
  8. package/dist/src/addon/auth/api-key/PgApiKeyRepository.js +28 -0
  9. package/dist/src/addon/auth/api-key/RemoteApiKeyRepository.js +42 -0
  10. package/dist/src/addon/auth/jwt/@jwtConnectionGuard.js +16 -0
  11. package/dist/src/addon/auth/jwt/@jwtGuard.js +17 -0
  12. package/dist/src/addon/auth/jwt/Jwt.js +53 -0
  13. package/dist/src/addon/auth/jwt/JwtAccessAndRefreshTokenDto.js +20 -0
  14. package/dist/src/addon/auth/jwt/JwtConfig.js +28 -0
  15. package/dist/src/addon/auth/jwt/JwtConnectionGuardMiddleware.js +57 -0
  16. package/dist/src/addon/auth/jwt/JwtGuardMiddleware.js +45 -0
  17. package/dist/src/addon/auth/jwt/JwtRefreshToken.js +56 -0
  18. package/dist/src/addon/auth/jwt/JwtRefreshTokenRepository.js +25 -0
  19. package/dist/src/addon/auth/jwt/JwtSigner.js +36 -0
  20. package/dist/src/addon/auth/jwt/JwtTokenDto.js +22 -0
  21. package/dist/src/addon/auth/jwt/PgJwtRefreshTokenRepository.js +21 -0
  22. package/dist/src/addon/chat-bot/anthropic/AnthropicChatAdapter.js +135 -0
  23. package/dist/src/addon/chat-bot/deepseek/DeepSeekChatAdapter.js +137 -0
  24. package/dist/src/addon/chat-bot/google/GoogleChatAdapter.js +128 -0
  25. package/dist/src/addon/chat-bot/openia/OpenaiChatAdapter.js +117 -0
  26. package/dist/src/{pre-made/repository/chat → addon/chat-bot}/pg/PgChatMemory.js +6 -4
  27. package/dist/src/{pre-made/repository/chat → addon/chat-bot}/pg/PgChatRepository.js +6 -5
  28. package/dist/src/{pre-made/repository/chat → addon/chat-bot}/ram/RamChatRepository.js +2 -2
  29. package/dist/src/addon/chat-bot/wabot/WabotChatAdapter.js +41 -0
  30. package/dist/src/addon/chat-controller/cmd/@cmd.js +23 -0
  31. package/dist/src/{channels → addon/chat-controller}/cmd/CmdChannel.js +4 -26
  32. package/dist/src/{channels → addon/chat-controller}/socket/@socket.js +9 -4
  33. package/dist/src/{channels → addon/chat-controller}/socket/SocketChannel.js +5 -23
  34. package/dist/src/{channels → addon/chat-controller}/socket/SocketChannelConfig.js +1 -1
  35. package/dist/src/{channels → addon/chat-controller}/telegram/@telegram.js +9 -4
  36. package/dist/src/{channels → addon/chat-controller}/telegram/TelegramChannel.js +4 -22
  37. package/dist/src/addon/chat-controller/whatsapp/@whatsApp.js +25 -0
  38. package/dist/src/{channels → addon/chat-controller}/whatsapp/EnvWhatsAppRepository.js +3 -3
  39. package/dist/src/{channels → addon/chat-controller}/whatsapp/PgWhatsAppRepository.js +2 -2
  40. package/dist/src/{channels → addon/chat-controller}/whatsapp/WhatsApp.js +2 -4
  41. package/dist/src/{channels → addon/chat-controller}/whatsapp/WhatsAppChannel.js +6 -18
  42. package/dist/src/addon/chat-controller/whatsapp/WhatsAppReceiver.js +10 -0
  43. package/dist/src/{channels → addon/chat-controller}/whatsapp/WhatsAppSender.js +20 -41
  44. package/dist/src/addon/chat-controller/whatsapp/cloud-api/WhatsAppReceiverByCloudApi.js +97 -0
  45. package/dist/src/{channels/whatsapp → addon/chat-controller/whatsapp/cloud-api}/WhatsAppSenderByCloudApi.js +26 -20
  46. package/dist/src/addon/chat-controller/whatsapp/proxy/WhatsAppProxyContracts.js +5 -0
  47. package/dist/src/addon/chat-controller/whatsapp/proxy/WhatsAppReceiverByWabotProxy.js +65 -0
  48. package/dist/src/addon/chat-controller/whatsapp/proxy/WhatsAppSenderByWabotProxy.js +60 -0
  49. package/dist/src/addon/chat-controller/whatsapp/proxy/WhatsAppWabotProxyConnection.js +45 -0
  50. package/dist/src/addon/mindset/html/HtmlModule.js +70 -0
  51. package/dist/src/core/auth/Auth.js +24 -0
  52. package/dist/src/core/{Persistent.js → entity/Entity.js} +24 -12
  53. package/dist/src/core/env/Env.js +39 -0
  54. package/dist/src/core/error/CustomError.js +15 -0
  55. package/dist/src/core/injection/index.js +4 -0
  56. package/dist/src/core/mapper/Mapper.js +42 -0
  57. package/dist/src/core/password/Password.js +30 -0
  58. package/dist/src/core/random/Random.js +65 -0
  59. package/dist/src/core/storable/Storable.js +8 -0
  60. package/dist/src/core/validation/core/validateArray.js +51 -0
  61. package/dist/src/core/validation/core/validateIsOptional.js +5 -0
  62. package/dist/src/core/validation/core/validateModel.js +36 -0
  63. package/dist/src/core/validation/metadata/@isArray.js +18 -0
  64. package/dist/src/core/validation/metadata/@isModel.js +18 -0
  65. package/dist/src/core/validation/metadata/@isOptional.js +17 -0
  66. package/dist/src/core/validation/metadata/ValidationMetadataStore.js +98 -0
  67. package/dist/src/core/validation/modelInfo.js +9 -0
  68. package/dist/src/core/validation/validate.js +11 -0
  69. package/dist/src/core/validation/validators/is-boolean/@isBoolean.js +17 -0
  70. package/dist/src/core/validation/validators/is-boolean/validateIsBoolean.js +12 -0
  71. package/dist/src/core/validation/validators/is-date/@isDate.js +17 -0
  72. package/dist/src/core/validation/validators/is-date/validateIsDate.js +16 -0
  73. package/dist/src/core/validation/validators/is-not-empty/@isNotEmpty.js +17 -0
  74. package/dist/src/core/validation/validators/is-not-empty/validateIsNotEmpty.js +12 -0
  75. package/dist/src/core/validation/validators/is-number/@isNumber.js +17 -0
  76. package/dist/src/core/validation/validators/is-number/validateIsNumber.js +12 -0
  77. package/dist/src/core/validation/validators/is-present/@isPresent.js +17 -0
  78. package/dist/src/core/validation/validators/is-present/validateIsPresent.js +12 -0
  79. package/dist/src/core/validation/validators/is-string/@isString.js +17 -0
  80. package/dist/src/core/validation/validators/is-string/validateIsString.js +12 -0
  81. package/dist/src/core/validation/validators/max/@max.js +18 -0
  82. package/dist/src/core/validation/validators/max/validateMax.js +17 -0
  83. package/dist/src/core/validation/validators/min/@min.js +18 -0
  84. package/dist/src/core/validation/validators/min/validateMin.js +17 -0
  85. package/dist/src/feature/async/@command.js +11 -0
  86. package/dist/src/feature/async/@commandHandler.js +12 -0
  87. package/dist/src/feature/async/Async.js +38 -0
  88. package/dist/src/feature/async/Command.js +9 -0
  89. package/dist/src/feature/async/CommandMetadataStore.js +38 -0
  90. package/dist/src/feature/async/Job.js +27 -0
  91. package/dist/src/feature/async/JobRepository.js +31 -0
  92. package/dist/src/feature/async/JobRunner.js +48 -0
  93. package/dist/src/feature/async/JobsEventsHub.js +36 -0
  94. package/dist/src/feature/async/runCommandHandlers.js +29 -0
  95. package/dist/src/{core/chat → feature/chat-bot}/Chat.js +2 -2
  96. package/dist/src/feature/chat-bot/ChatAdapter.js +7 -0
  97. package/dist/src/feature/chat-bot/ChatBot.js +73 -0
  98. package/dist/src/feature/chat-bot/ChatItem.js +24 -0
  99. package/dist/src/feature/chat-bot/ChatMemory.js +10 -0
  100. package/dist/src/{core/chat/repository/IChatRepository.js → feature/chat-bot/ChatRepository.js} +2 -8
  101. package/dist/src/feature/chat-bot/IChatItem.js +3 -0
  102. package/dist/src/{chatbot → feature/chat-bot}/metadata/@chatBot.js +1 -1
  103. package/dist/src/{chatbot → feature/chat-bot}/metadata/ChatBotMetadataStore.js +1 -1
  104. package/dist/src/{controller/channel → feature/chat-controller}/ChatResolver.js +6 -4
  105. package/dist/src/{controller → feature/chat-controller}/metadata/ControllerMetadataStore.js +1 -1
  106. package/dist/src/{controller → feature/chat-controller}/metadata/controller/@chatController.js +1 -1
  107. package/dist/src/feature/chat-controller/runChatControllers.js +69 -0
  108. package/dist/src/{channels → feature}/express/ExpressProvider.js +2 -4
  109. package/dist/src/{channels → feature}/http/HttpServerProvider.js +2 -2
  110. package/dist/src/{mindset → feature/mindset}/IMindset.js +3 -0
  111. package/dist/src/{mindset → feature/mindset}/MindsetOperator.js +69 -42
  112. package/dist/src/{mindset → feature/mindset}/metadata/MindsetMetadataStore.js +1 -1
  113. package/dist/src/{mindset → feature/mindset}/metadata/functions/@mindsetFunction.js +1 -1
  114. package/dist/src/{mindset → feature/mindset}/metadata/mindsets/@mindset.js +1 -1
  115. package/dist/src/{mindset → feature/mindset}/metadata/modules/@mindsetModule.js +1 -2
  116. package/dist/src/{mindset → feature/mindset}/metadata/params/@param.js +1 -1
  117. package/dist/src/feature/money/Money.js +61 -0
  118. package/dist/src/feature/money/MoneyDto.js +22 -0
  119. package/dist/src/{repository → feature}/pg/PgCrudRepository.js +30 -9
  120. package/dist/src/{repository → feature}/pg/PgRepositoryBase.js +2 -2
  121. package/dist/src/feature/rest-controller/injection-tokens.js +4 -0
  122. package/dist/src/feature/rest-controller/metadata/@middleware.js +16 -0
  123. package/dist/src/feature/rest-controller/metadata/@onDelete.js +7 -0
  124. package/dist/src/feature/rest-controller/metadata/@onGet.js +7 -0
  125. package/dist/src/feature/rest-controller/metadata/@onPost.js +7 -0
  126. package/dist/src/feature/rest-controller/metadata/@onPut.js +7 -0
  127. package/dist/src/feature/rest-controller/metadata/@restController.js +15 -0
  128. package/dist/src/feature/rest-controller/metadata/RestControllerMetadataStore.js +50 -0
  129. package/dist/src/feature/rest-controller/metadata/methodDecorator.js +19 -0
  130. package/dist/src/feature/rest-controller/runRestControllers.js +103 -0
  131. package/dist/src/{channels → feature}/socket/SocketServerProvider.js +2 -2
  132. package/dist/src/feature/socket-controller/metadata/@connectionMiddleware.js +16 -0
  133. package/dist/src/feature/socket-controller/metadata/@socketConnection.js +18 -0
  134. package/dist/src/feature/socket-controller/metadata/@socketController.js +15 -0
  135. package/dist/src/feature/socket-controller/metadata/@socketEvent.js +18 -0
  136. package/dist/src/feature/socket-controller/metadata/SocketControllerMetadataStore.js +65 -0
  137. package/dist/src/feature/socket-controller/runSocketControllers.js +99 -0
  138. package/dist/src/index.d.ts +1202 -575
  139. package/dist/src/index.js +145 -76
  140. package/package.json +10 -4
  141. package/dist/src/ai/deepseek/DeepSeekChatBotAdapter.js +0 -106
  142. package/dist/src/ai/openia/OpenaiChatBotAdapter.js +0 -88
  143. package/dist/src/channels/cmd/@cmd.js +0 -18
  144. package/dist/src/channels/wabot/WabotDevConnection.js +0 -57
  145. package/dist/src/channels/wabot/WabotDevSocketContracts.js +0 -10
  146. package/dist/src/channels/whatsapp/@whatsapp.js +0 -20
  147. package/dist/src/channels/whatsapp/WhatsAppReceiver.js +0 -59
  148. package/dist/src/channels/whatsapp/WhatsAppReceiverByDevConnection.js +0 -32
  149. package/dist/src/channels/whatsapp/WhatsAppReceiverByWebHook.js +0 -63
  150. package/dist/src/channels/whatsapp/WhatsAppSenderByDevConnection.js +0 -61
  151. package/dist/src/chatbot/ChatBot.js +0 -51
  152. package/dist/src/chatbot/ChatBotAdapter.js +0 -72
  153. package/dist/src/controller/channel/UserResolver.js +0 -21
  154. package/dist/src/core/IMessageContext.js +0 -12
  155. package/dist/src/core/chat/ChatItem.js +0 -15
  156. package/dist/src/core/chat/repository/IChatMemory.js +0 -10
  157. package/dist/src/core/user/IUserRepository.js +0 -19
  158. package/dist/src/core/user/User.js +0 -26
  159. package/dist/src/env/WabotEnv.js +0 -27
  160. package/dist/src/injection/index.js +0 -4
  161. package/dist/src/mindset/metadata/params/@isOptional.js +0 -21
  162. package/dist/src/pre-made/module/authentication/AuthenticationModule.js +0 -97
  163. package/dist/src/pre-made/module/authentication/requests/SendOneTimePasswordRequest.js +0 -25
  164. package/dist/src/pre-made/module/authentication/requests/ValidateOneTimePasswordRequest.js +0 -25
  165. package/dist/src/pre-made/module/register-user/RegisterUserModule.js +0 -56
  166. package/dist/src/pre-made/module/register-user/requests/RegisterUserWithEmailRequest.js +0 -25
  167. package/dist/src/pre-made/repository/user/pg/PgUserRepository.js +0 -33
  168. package/dist/src/pre-made/repository/user/ram/RamUserRepository.js +0 -27
  169. package/dist/src/pre-made/service/EmailService.js +0 -13
  170. package/dist/src/pre-made/service/OtpService.js +0 -14
  171. package/dist/src/server/prepareChatContainer.js +0 -43
  172. package/dist/src/server/runChannel.js +0 -27
  173. package/dist/src/server/runServer.js +0 -40
  174. /package/dist/src/{pre-made/repository/chat → addon/chat-bot}/ram/RamChatMemory.js +0 -0
  175. /package/dist/src/{channels → addon/chat-controller}/telegram/TelegramChannelConfig.js +0 -0
  176. /package/dist/src/{channels → addon/chat-controller}/whatsapp/WhatsAppChannelConfig.js +0 -0
  177. /package/dist/src/{channels → addon/chat-controller}/whatsapp/WhatsAppRepository.js +0 -0
  178. /package/dist/src/{injection → core/injection}/Container.js +0 -0
  179. /package/dist/src/{logger → core/logger}/Logger.js +0 -0
  180. /package/dist/src/{mindset → feature/mindset}/metadata/functions/decoratorNames.js +0 -0
  181. /package/dist/src/{mindset → feature/mindset}/metadata/mindsets/decoratorNames.js +0 -0
  182. /package/dist/src/{mindset → feature/mindset}/metadata/modules/decoratorNames.js +0 -0
  183. /package/dist/src/{mindset → feature/mindset}/metadata/params/decoratorNames.js +0 -0
@@ -1,5 +1,4 @@
1
- import 'reflect-metadata';
2
- import { container, injectable } from '../../../injection/index.js';
1
+ import { container, injectable } from '../../../../core/injection/index.js';
3
2
  import { MindsetMetadataStore } from '../MindsetMetadataStore.js';
4
3
  import { MINDSET_MODULE_DECORATION_MODULE } from './decoratorNames.js';
5
4
 
@@ -1,6 +1,6 @@
1
1
  import 'reflect-metadata';
2
2
  import { MindsetMetadataStore } from '../MindsetMetadataStore.js';
3
- import { container } from '../../../injection/index.js';
3
+ import { container } from '../../../../core/injection/index.js';
4
4
  import { PARAM_DECORATION_PARAM } from './decoratorNames.js';
5
5
 
6
6
  function param(config) {
@@ -0,0 +1,61 @@
1
+ import { Storable } from '../../core/storable/Storable.js';
2
+ import { Big } from 'big.js';
3
+
4
+ Big.strict = true;
5
+ class Money extends Storable {
6
+ getData() {
7
+ return { ...this.data };
8
+ }
9
+ get amount() {
10
+ return Big(this.data.amount);
11
+ }
12
+ get currency() {
13
+ return this.data.currency;
14
+ }
15
+ plus(money) {
16
+ this.validateEqualCurrencies(this.data.currency, money.data.currency);
17
+ return new Money({
18
+ amount: this.amount.plus(money.amount).toFixed(6),
19
+ currency: this.currency,
20
+ });
21
+ }
22
+ minus(money) {
23
+ this.validateEqualCurrencies(this.data.currency, money.data.currency);
24
+ return new Money({
25
+ amount: this.amount.minus(money.amount).toFixed(6),
26
+ currency: this.currency,
27
+ });
28
+ }
29
+ times(value) {
30
+ return new Money({
31
+ amount: this.amount.times(new Big(String(value))).toFixed(6),
32
+ currency: this.currency,
33
+ });
34
+ }
35
+ div(value) {
36
+ return new Money({
37
+ amount: this.amount.div(new Big(String(value))).toFixed(6),
38
+ currency: this.currency,
39
+ });
40
+ }
41
+ negative() {
42
+ return new Money({
43
+ amount: new Big('0').minus(this.amount).toFixed(6),
44
+ currency: this.currency,
45
+ });
46
+ }
47
+ isGretterThan(money) {
48
+ this.validateEqualCurrencies(this.data.currency, money.data.currency);
49
+ return this.amount.gt(money.amount);
50
+ }
51
+ validateEqualCurrencies(left, right) {
52
+ if (left !== right) {
53
+ throw new Error(`Is not posible operate with diferent currencies: '${left}' and '${right}'`);
54
+ }
55
+ }
56
+ static zero(currency) {
57
+ return new Money({ currency, amount: '0' });
58
+ }
59
+ }
60
+
61
+ export { Money };
@@ -0,0 +1,22 @@
1
+ import { __decorate, __metadata } from 'tslib';
2
+ import '../../core/injection/index.js';
3
+ import '../../core/validation/metadata/ValidationMetadataStore.js';
4
+ import { isNotEmpty } from '../../core/validation/validators/is-not-empty/@isNotEmpty.js';
5
+ import { isString } from '../../core/validation/validators/is-string/@isString.js';
6
+
7
+ class MoneyDto {
8
+ amount = '';
9
+ currency = '';
10
+ }
11
+ __decorate([
12
+ isString(),
13
+ isNotEmpty(),
14
+ __metadata("design:type", String)
15
+ ], MoneyDto.prototype, "amount", void 0);
16
+ __decorate([
17
+ isString(),
18
+ isNotEmpty(),
19
+ __metadata("design:type", String)
20
+ ], MoneyDto.prototype, "currency", void 0);
21
+
22
+ export { MoneyDto };
@@ -1,5 +1,6 @@
1
1
  import * as shortUUID from 'short-uuid';
2
2
  import { PgRepositoryBase } from './PgRepositoryBase.js';
3
+ import { CustomError } from '../../core/error/CustomError.js';
3
4
 
4
5
  class PgCrudRepository extends PgRepositoryBase {
5
6
  config;
@@ -17,6 +18,28 @@ class PgCrudRepository extends PgRepositoryBase {
17
18
  const items = await this.query(sql, [id]);
18
19
  return items.at(0) ?? null;
19
20
  }
21
+ async findByIds(ids) {
22
+ if (ids.length === 0) {
23
+ return [];
24
+ }
25
+ const sql = `
26
+ SELECT ${this.columns}
27
+ FROM ${this.table}
28
+ WHERE id IN (${ids.map((_, i) => '$' + (i + 1)).join(',')})
29
+ `;
30
+ const items = await this.query(sql, ids);
31
+ return items;
32
+ }
33
+ async findOrThrow(id) {
34
+ const item = await this.find(id);
35
+ if (!item) {
36
+ throw new CustomError({
37
+ message: `Not found ${this.config.constructor.name} with id = '${id}'`,
38
+ httpCode: 404,
39
+ });
40
+ }
41
+ return item;
42
+ }
20
43
  async findAll() {
21
44
  const sql = `
22
45
  SELECT ${this.columns}
@@ -46,16 +69,14 @@ class PgCrudRepository extends PgRepositoryBase {
46
69
  SET ${this.updates}
47
70
  WHERE id = $${this.columnsList.length + 1}
48
71
  `;
49
- await this.exec(sql, [...this.values(item), item.getId()]);
72
+ await this.exec(sql, [...this.values(item), item.id]);
50
73
  }
51
- async discard(item) {
52
- const _item = await this.find(item.getId());
53
- if (!_item) {
54
- throw new Error('Not found');
55
- }
56
- item.discard();
57
- _item.discard();
58
- await this.update(_item);
74
+ async delete(item) {
75
+ const sql = `
76
+ DELETE FROM ${this.table}
77
+ WHERE id = $1
78
+ `;
79
+ await this.exec(sql, [item.id]);
59
80
  }
60
81
  }
61
82
 
@@ -32,8 +32,8 @@ class PgRepositoryBase {
32
32
  }
33
33
  values(item) {
34
34
  return [
35
- item.getId(),
36
- item.getCreatedAt(),
35
+ item.id,
36
+ item.createdAt,
37
37
  JSON.stringify(item['data']),
38
38
  ...this.columnsList.slice(3).map((x) => this.addColumns[x].value(item)),
39
39
  ];
@@ -0,0 +1,4 @@
1
+ const EXPRESS_REQ = 'EXPRESS_REQ';
2
+ const EXPRESS_RES = 'EXPRESS_RES';
3
+
4
+ export { EXPRESS_REQ, EXPRESS_RES };
@@ -0,0 +1,16 @@
1
+ import { container } from '../../../core/injection/index.js';
2
+ import { RestControllerMetadataStore } from './RestControllerMetadataStore.js';
3
+
4
+ function middleware(middlewareConstructor) {
5
+ return function (target, propertyKey) {
6
+ const functionName = propertyKey.toString();
7
+ const store = container.resolve(RestControllerMetadataStore);
8
+ store.saveMiddlewareMetadata({
9
+ controllerConstructor: target.constructor,
10
+ functionName,
11
+ middlewareConstructor: middlewareConstructor,
12
+ });
13
+ };
14
+ }
15
+
16
+ export { middleware };
@@ -0,0 +1,7 @@
1
+ import { methodDecorator } from './methodDecorator.js';
2
+
3
+ function onDelete(config) {
4
+ return methodDecorator('delete', config);
5
+ }
6
+
7
+ export { onDelete };
@@ -0,0 +1,7 @@
1
+ import { methodDecorator } from './methodDecorator.js';
2
+
3
+ function onGet(config) {
4
+ return methodDecorator('get', config);
5
+ }
6
+
7
+ export { onGet };
@@ -0,0 +1,7 @@
1
+ import { methodDecorator } from './methodDecorator.js';
2
+
3
+ function onPost(config) {
4
+ return methodDecorator('post', config);
5
+ }
6
+
7
+ export { onPost };
@@ -0,0 +1,7 @@
1
+ import { methodDecorator } from './methodDecorator.js';
2
+
3
+ function onPut(config) {
4
+ return methodDecorator('put', config);
5
+ }
6
+
7
+ export { onPut };
@@ -0,0 +1,15 @@
1
+ import { container, injectable } from '../../../core/injection/index.js';
2
+ import { RestControllerMetadataStore } from './RestControllerMetadataStore.js';
3
+
4
+ function restController(config) {
5
+ return function (target) {
6
+ const metaDataStore = container.resolve(RestControllerMetadataStore);
7
+ metaDataStore.saveControllerMetadata({
8
+ controllerConstructor: target,
9
+ path: typeof config === 'string' ? config : config.path,
10
+ });
11
+ injectable()(target);
12
+ };
13
+ }
14
+
15
+ export { restController };
@@ -0,0 +1,50 @@
1
+ import { __decorate } from 'tslib';
2
+ import { singleton } from '../../../core/injection/index.js';
3
+
4
+ let RestControllerMetadataStore = class RestControllerMetadataStore {
5
+ endPoints = new Map();
6
+ middlewares = new Map();
7
+ restControllers = new Map();
8
+ saveControllerMetadata(controllerMetadata) {
9
+ this.restControllers.set(controllerMetadata.controllerConstructor, controllerMetadata);
10
+ }
11
+ saveEndPointMetadata(endPointMetadata) {
12
+ let controllerEndPoints = this.endPoints.get(endPointMetadata.controllerConstructor);
13
+ if (!controllerEndPoints) {
14
+ this.endPoints.set(endPointMetadata.controllerConstructor, (controllerEndPoints = new Map()));
15
+ }
16
+ controllerEndPoints.set(endPointMetadata.functionName, endPointMetadata);
17
+ }
18
+ saveMiddlewareMetadata(middlewareMetadata) {
19
+ let controllerMiddlewares = this.middlewares.get(middlewareMetadata.controllerConstructor);
20
+ if (!controllerMiddlewares) {
21
+ this.middlewares.set(middlewareMetadata.controllerConstructor, (controllerMiddlewares = new Map()));
22
+ }
23
+ let methodMiddlewares = controllerMiddlewares.get(middlewareMetadata.functionName);
24
+ if (!methodMiddlewares) {
25
+ controllerMiddlewares.set(middlewareMetadata.functionName, (methodMiddlewares = []));
26
+ }
27
+ methodMiddlewares.unshift(middlewareMetadata);
28
+ }
29
+ getControllerEndPointsInfo(controllerConstructor) {
30
+ const controller = this.restControllers.get(controllerConstructor);
31
+ if (!controller) {
32
+ throw new Error(`${controllerConstructor.name} should be decorated with @restController`);
33
+ }
34
+ const endPoints = this.endPoints.get(controllerConstructor);
35
+ if (!endPoints?.size) {
36
+ // TODO: Warning
37
+ return [];
38
+ }
39
+ return [...endPoints.values()].map((endPoint) => ({
40
+ ...endPoint,
41
+ middlewares: this.middlewares.get(endPoint.controllerConstructor)?.get(endPoint.functionName) ?? [],
42
+ controller: this.restControllers.get(endPoint.controllerConstructor),
43
+ }));
44
+ }
45
+ };
46
+ RestControllerMetadataStore = __decorate([
47
+ singleton()
48
+ ], RestControllerMetadataStore);
49
+
50
+ export { RestControllerMetadataStore };
@@ -0,0 +1,19 @@
1
+ import { container } from '../../../core/injection/index.js';
2
+ import { RestControllerMetadataStore } from './RestControllerMetadataStore.js';
3
+
4
+ function methodDecorator(method, config) {
5
+ return function (target, propertyKey) {
6
+ const functionName = propertyKey.toString();
7
+ const paramsTypes = Reflect.getMetadata('design:paramtypes', target, functionName);
8
+ const store = container.resolve(RestControllerMetadataStore);
9
+ store.saveEndPointMetadata({
10
+ controllerConstructor: target.constructor,
11
+ method,
12
+ config: typeof config === 'string' ? { path: config } : config,
13
+ functionName,
14
+ paramsTypes,
15
+ });
16
+ };
17
+ }
18
+
19
+ export { methodDecorator };
@@ -0,0 +1,103 @@
1
+ import { CustomError } from '../../core/error/CustomError.js';
2
+ import { container } from '../../core/injection/index.js';
3
+ import { Logger } from '../../core/logger/Logger.js';
4
+ import '../../core/validation/metadata/ValidationMetadataStore.js';
5
+ import { validate } from '../../core/validation/validate.js';
6
+ import { ExpressProvider } from '../express/ExpressProvider.js';
7
+ import { json, urlencoded } from 'express';
8
+ import path from 'path';
9
+ import { EXPRESS_REQ, EXPRESS_RES } from './injection-tokens.js';
10
+ import { RestControllerMetadataStore } from './metadata/RestControllerMetadataStore.js';
11
+
12
+ function buildRequest(req) {
13
+ return Object.assign({}, req.body, req.query, req.params);
14
+ }
15
+ function runRestControllers(controllers) {
16
+ const logger = new Logger('wabot:rest');
17
+ const metadataStore = container.resolve(RestControllerMetadataStore);
18
+ const expressProvider = container.resolve(ExpressProvider);
19
+ const expressApp = expressProvider.getExpress();
20
+ controllers.forEach((controller) => {
21
+ const endPoints = metadataStore.getControllerEndPointsInfo(controller);
22
+ endPoints.forEach((endPoint) => {
23
+ const method = endPoint.method;
24
+ const route = path
25
+ .join(endPoint.controller.path, endPoint.config?.path ?? '')
26
+ .replaceAll('\\', '/');
27
+ logger.info(`config ${endPoint.method.toUpperCase()} ${route}`);
28
+ const rawMiddlewares = [];
29
+ if (!endPoint.config?.disableJsonParser) {
30
+ rawMiddlewares.push(json());
31
+ }
32
+ if (!endPoint.config?.disableUrlEncodedParser) {
33
+ rawMiddlewares.push(urlencoded({ extended: true }));
34
+ }
35
+ expressApp[method](route, ...rawMiddlewares, async (req, res) => {
36
+ const requestContainer = container.createChildContainer();
37
+ requestContainer.register(EXPRESS_REQ, { useValue: req });
38
+ requestContainer.register(EXPRESS_RES, { useValue: req });
39
+ try {
40
+ const middlewares = endPoint.middlewares.map((x) => requestContainer.resolve(x.middlewareConstructor));
41
+ for (const middleware of middlewares) {
42
+ await middleware.handle(req, res, requestContainer);
43
+ }
44
+ const controllerInstance = requestContainer.resolve(endPoint.controllerConstructor);
45
+ const endPointArgs = [];
46
+ let defaultArgFound = false;
47
+ for (let paramIndex = 0; paramIndex < endPoint.paramsTypes.length; paramIndex++) {
48
+ const paramType = endPoint.paramsTypes[paramIndex];
49
+ if (defaultArgFound) {
50
+ throw new Error(`Cant determine de parameter ${paramIndex} value`);
51
+ }
52
+ defaultArgFound = true;
53
+ if (typeof paramType === 'function') {
54
+ const { value, error } = validate(buildRequest(req), paramType);
55
+ if (error) {
56
+ throw new CustomError({ httpCode: 400, message: error.description, info: error });
57
+ }
58
+ endPointArgs.push(value);
59
+ }
60
+ }
61
+ const response = await controllerInstance[endPoint.functionName].apply(controllerInstance, endPointArgs);
62
+ res.status(200).json(response);
63
+ }
64
+ catch (err) {
65
+ logger.error(err);
66
+ if (err instanceof Error) {
67
+ const keys = Object.keys(err).filter((key) => !['message', 'stack'].includes(key));
68
+ const { httpCode, ...info } = keys.reduce((acc, key) => {
69
+ acc[key] = err[key];
70
+ return acc;
71
+ }, {});
72
+ res
73
+ .status(httpCode ?? 500)
74
+ .json(removeCircular({ error: { message: err.message, stack: err.stack, ...info } }));
75
+ }
76
+ else {
77
+ res.status(500).json({ error: { message: 'Unknown error' } });
78
+ }
79
+ }
80
+ finally {
81
+ requestContainer.dispose();
82
+ }
83
+ });
84
+ });
85
+ });
86
+ expressProvider.listen();
87
+ }
88
+ function removeCircular(obj, seen = new WeakSet()) {
89
+ if (obj && typeof obj === 'object') {
90
+ if (seen.has(obj)) {
91
+ return undefined; // remove circular ref
92
+ }
93
+ seen.add(obj);
94
+ const clone = Array.isArray(obj) ? [] : {};
95
+ for (const key in obj) {
96
+ clone[key] = removeCircular(obj[key], seen);
97
+ }
98
+ return clone;
99
+ }
100
+ return obj;
101
+ }
102
+
103
+ export { runRestControllers };
@@ -1,8 +1,8 @@
1
1
  import { __decorate, __metadata } from 'tslib';
2
- import { Logger } from '../../logger/Logger.js';
2
+ import { singleton } from '../../core/injection/index.js';
3
+ import { Logger } from '../../core/logger/Logger.js';
3
4
  import { HttpServerProvider } from '../http/HttpServerProvider.js';
4
5
  import { Server } from 'socket.io';
5
- import { singleton } from 'tsyringe';
6
6
 
7
7
  let SocketServerProvider = class SocketServerProvider {
8
8
  httpServerProvider;
@@ -0,0 +1,16 @@
1
+ import { SocketControllerMetadataStore } from './SocketControllerMetadataStore.js';
2
+ import { container } from '../../../core/injection/index.js';
3
+
4
+ function connectionMiddleware(middlewareConstructor) {
5
+ return function (target, propertyKey) {
6
+ const functionName = propertyKey.toString();
7
+ const store = container.resolve(SocketControllerMetadataStore);
8
+ store.saveConnectionMiddlewareMetadata({
9
+ controllerConstructor: target.constructor,
10
+ functionName,
11
+ middlewareConstructor: middlewareConstructor,
12
+ });
13
+ };
14
+ }
15
+
16
+ export { connectionMiddleware };
@@ -0,0 +1,18 @@
1
+ import { container } from '../../../core/injection/index.js';
2
+ import { SocketControllerMetadataStore } from './SocketControllerMetadataStore.js';
3
+
4
+ function socketConnection(config) {
5
+ return function (target, propertyKey) {
6
+ const functionName = propertyKey.toString();
7
+ const paramsTypes = Reflect.getMetadata('design:paramtypes', target, functionName);
8
+ const store = container.resolve(SocketControllerMetadataStore);
9
+ store.saveSocketConnectionMetadata({
10
+ controllerConstructor: target.constructor,
11
+ config: typeof config === 'string' ? { namespace: config } : config,
12
+ functionName,
13
+ paramsTypes,
14
+ });
15
+ };
16
+ }
17
+
18
+ export { socketConnection };
@@ -0,0 +1,15 @@
1
+ import { SocketControllerMetadataStore } from './SocketControllerMetadataStore.js';
2
+ import { container, injectable } from '../../../core/injection/index.js';
3
+
4
+ function socketController(config) {
5
+ return function (target) {
6
+ const metaDataStore = container.resolve(SocketControllerMetadataStore);
7
+ metaDataStore.saveControllerMetadata({
8
+ controllerConstructor: target,
9
+ config: typeof config === 'string' ? { namespace: config } : config,
10
+ });
11
+ injectable()(target);
12
+ };
13
+ }
14
+
15
+ export { socketController };
@@ -0,0 +1,18 @@
1
+ import { container } from '../../../core/injection/index.js';
2
+ import { SocketControllerMetadataStore } from './SocketControllerMetadataStore.js';
3
+
4
+ function socketEvent(config) {
5
+ return function (target, propertyKey) {
6
+ const functionName = propertyKey.toString();
7
+ const paramsTypes = Reflect.getMetadata('design:paramtypes', target, functionName);
8
+ const store = container.resolve(SocketControllerMetadataStore);
9
+ store.saveSocketEventMetadata({
10
+ controllerConstructor: target.constructor,
11
+ config: typeof config === 'string' ? { event: config } : config,
12
+ functionName,
13
+ paramsTypes,
14
+ });
15
+ };
16
+ }
17
+
18
+ export { socketEvent };
@@ -0,0 +1,65 @@
1
+ import { __decorate } from 'tslib';
2
+ import { singleton } from '../../../core/injection/index.js';
3
+
4
+ let SocketControllerMetadataStore = class SocketControllerMetadataStore {
5
+ socketControllers = new Map();
6
+ socketConnections = new Map();
7
+ socketEvents = new Map();
8
+ connectionMiddlewares = new Map();
9
+ saveControllerMetadata(controllerMetadata) {
10
+ this.socketControllers.set(controllerMetadata.controllerConstructor, controllerMetadata);
11
+ }
12
+ saveSocketConnectionMetadata(socketConnectionMetadata) {
13
+ let controllerConnections = this.socketConnections.get(socketConnectionMetadata.controllerConstructor);
14
+ if (!controllerConnections) {
15
+ this.socketConnections.set(socketConnectionMetadata.controllerConstructor, (controllerConnections = new Map()));
16
+ }
17
+ controllerConnections.set(socketConnectionMetadata.functionName, socketConnectionMetadata);
18
+ }
19
+ saveSocketEventMetadata(socketEventMetadata) {
20
+ let controllerEvents = this.socketEvents.get(socketEventMetadata.controllerConstructor);
21
+ if (!controllerEvents) {
22
+ this.socketEvents.set(socketEventMetadata.controllerConstructor, (controllerEvents = new Map()));
23
+ }
24
+ controllerEvents.set(socketEventMetadata.functionName, socketEventMetadata);
25
+ }
26
+ saveConnectionMiddlewareMetadata(middlewareMetadata) {
27
+ let controllerMiddlewares = this.connectionMiddlewares.get(middlewareMetadata.controllerConstructor);
28
+ if (!controllerMiddlewares) {
29
+ this.connectionMiddlewares.set(middlewareMetadata.controllerConstructor, (controllerMiddlewares = new Map()));
30
+ }
31
+ let methodMiddlewares = controllerMiddlewares.get(middlewareMetadata.functionName);
32
+ if (!methodMiddlewares) {
33
+ controllerMiddlewares.set(middlewareMetadata.functionName, (methodMiddlewares = []));
34
+ }
35
+ methodMiddlewares.unshift(middlewareMetadata);
36
+ }
37
+ getControllerSockerConnectionsInfo(controllerConstructor) {
38
+ const controller = this.socketControllers.get(controllerConstructor);
39
+ if (!controller) {
40
+ throw new Error(`${controllerConstructor.name} should be decorated with @socketController`);
41
+ }
42
+ const connections = this.socketConnections.get(controllerConstructor);
43
+ const events = this.socketEvents.get(controllerConstructor) ?? new Map();
44
+ if (!connections?.size) {
45
+ // TODO: Warning
46
+ return [];
47
+ }
48
+ return [...connections.values()].map((connection) => ({
49
+ ...connection,
50
+ events: (() => {
51
+ const connectionNamespace = connection.config?.namespace;
52
+ return [...events.values()].filter((x) => x.config?.namespace === connectionNamespace);
53
+ })(),
54
+ connectionMiddlewares: this.connectionMiddlewares
55
+ .get(connection.controllerConstructor)
56
+ ?.get(connection.functionName) ?? [],
57
+ controller: this.socketControllers.get(connection.controllerConstructor),
58
+ }));
59
+ }
60
+ };
61
+ SocketControllerMetadataStore = __decorate([
62
+ singleton()
63
+ ], SocketControllerMetadataStore);
64
+
65
+ export { SocketControllerMetadataStore };