@wabot-dev/framework 0.1.0-beta.3 → 0.1.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 (149) hide show
  1. package/dist/src/addon/async/pg/PgJobRepository.js +26 -0
  2. package/dist/src/addon/chat-bot/claude/ClaudeChatBotAdapter.js +107 -0
  3. package/dist/src/addon/chat-bot/deepseek/DeepSeekChatBotAdapter.js +103 -0
  4. package/dist/src/addon/chat-bot/openia/OpenaiChatAdapter.js +101 -0
  5. package/dist/src/{pre-made/repository/chat → addon/chat-bot}/pg/PgChatMemory.js +5 -4
  6. package/dist/src/{pre-made/repository/chat → addon/chat-bot}/pg/PgChatRepository.js +5 -5
  7. package/dist/src/{pre-made/repository/chat → addon/chat-bot}/ram/RamChatRepository.js +2 -2
  8. package/dist/src/addon/chat-controller/cmd/@cmd.js +22 -0
  9. package/dist/src/{channels → addon/chat-controller}/cmd/CmdChannel.js +4 -26
  10. package/dist/src/{channels → addon/chat-controller}/socket/@socket.js +8 -4
  11. package/dist/src/{channels → addon/chat-controller}/socket/SocketChannel.js +5 -23
  12. package/dist/src/{channels → addon/chat-controller}/socket/SocketChannelConfig.js +1 -1
  13. package/dist/src/{channels → addon/chat-controller}/telegram/@telegram.js +8 -4
  14. package/dist/src/{channels → addon/chat-controller}/telegram/TelegramChannel.js +4 -22
  15. package/dist/src/{channels → addon/chat-controller}/whatsapp/@whatsapp.js +8 -4
  16. package/dist/src/addon/chat-controller/whatsapp/EnvWhatsAppRepository.js +49 -0
  17. package/dist/src/{channels/whatsapp/WhatsAppRepository.js → addon/chat-controller/whatsapp/PgWhatsAppRepository.js} +5 -5
  18. package/dist/src/{channels/wabot → addon/chat-controller/whatsapp}/WabotDevConnection.js +2 -2
  19. package/dist/src/{channels → addon/chat-controller}/whatsapp/WhatsApp.js +5 -4
  20. package/dist/src/{channels → addon/chat-controller}/whatsapp/WhatsAppChannel.js +6 -18
  21. package/dist/src/{channels → addon/chat-controller}/whatsapp/WhatsAppReceiver.js +4 -7
  22. package/dist/src/{channels → addon/chat-controller}/whatsapp/WhatsAppReceiverByDevConnection.js +3 -9
  23. package/dist/src/{channels → addon/chat-controller}/whatsapp/WhatsAppReceiverByWebHook.js +2 -9
  24. package/dist/src/{core/chat/repository/IChatMemory.js → addon/chat-controller/whatsapp/WhatsAppRepository.js} +4 -4
  25. package/dist/src/{channels → addon/chat-controller}/whatsapp/WhatsAppSender.js +39 -10
  26. package/dist/src/{channels → addon/chat-controller}/whatsapp/WhatsAppSenderByCloudApi.js +10 -13
  27. package/dist/src/{channels → addon/chat-controller}/whatsapp/WhatsAppSenderByDevConnection.js +13 -15
  28. package/dist/src/addon/mindset/html/HtmlModule.js +70 -0
  29. package/dist/src/{repository → addon/repository}/pg/PgCrudRepository.js +23 -2
  30. package/dist/src/{repository → addon/repository}/pg/PgRepositoryBase.js +2 -2
  31. package/dist/src/addon/rest-controller/jwt/@jwtGuard.js +17 -0
  32. package/dist/src/addon/rest-controller/jwt/Jwt.js +36 -0
  33. package/dist/src/addon/rest-controller/jwt/JwtAccessAndRefreshTokenDto.js +20 -0
  34. package/dist/src/addon/rest-controller/jwt/JwtConfig.js +28 -0
  35. package/dist/src/addon/rest-controller/jwt/JwtGuardMiddleware.js +50 -0
  36. package/dist/src/addon/rest-controller/jwt/JwtRefreshToken.js +9 -0
  37. package/dist/src/addon/rest-controller/jwt/JwtRefreshTokenRepository.js +21 -0
  38. package/dist/src/addon/rest-controller/jwt/JwtSigner.js +48 -0
  39. package/dist/src/addon/rest-controller/jwt/JwtTokenDto.js +22 -0
  40. package/dist/src/addon/validation/is-boolean/@isBoolean.js +17 -0
  41. package/dist/src/addon/validation/is-boolean/validateIsBoolean.js +12 -0
  42. package/dist/src/addon/validation/is-date/@isDate.js +17 -0
  43. package/dist/src/addon/validation/is-date/validateIsDate.js +16 -0
  44. package/dist/src/addon/validation/is-not-empty/@isNotEmpty.js +17 -0
  45. package/dist/src/addon/validation/is-not-empty/validateIsNotEmpty.js +12 -0
  46. package/dist/src/addon/validation/is-number/@isNumber.js +17 -0
  47. package/dist/src/addon/validation/is-number/validateIsNumber.js +12 -0
  48. package/dist/src/addon/validation/is-present/@isPresent.js +17 -0
  49. package/dist/src/addon/validation/is-present/validateIsPresent.js +12 -0
  50. package/dist/src/addon/validation/is-string/@isString.js +17 -0
  51. package/dist/src/addon/validation/is-string/validateIsString.js +12 -0
  52. package/dist/src/addon/validation/max/@max.js +18 -0
  53. package/dist/src/addon/validation/max/validateMax.js +17 -0
  54. package/dist/src/addon/validation/min/@min.js +18 -0
  55. package/dist/src/addon/validation/min/validateMin.js +17 -0
  56. package/dist/src/core/{Persistent.js → entity/Entity.js} +24 -9
  57. package/dist/src/core/env/Env.js +39 -0
  58. package/dist/src/core/error/CustomError.js +15 -0
  59. package/dist/src/core/injection/index.js +4 -0
  60. package/dist/src/core/mapper/Mapper.js +42 -0
  61. package/dist/src/core/random/Random.js +37 -0
  62. package/dist/src/core/storable/Storable.js +8 -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/validateArray.js +41 -0
  70. package/dist/src/core/validation/validators/validateIsOptional.js +5 -0
  71. package/dist/src/core/validation/validators/validateModel.js +34 -0
  72. package/dist/src/feature/async/@command.js +11 -0
  73. package/dist/src/feature/async/@commandHandler.js +12 -0
  74. package/dist/src/feature/async/Async.js +38 -0
  75. package/dist/src/feature/async/Command.js +9 -0
  76. package/dist/src/feature/async/CommandMetadataStore.js +38 -0
  77. package/dist/src/feature/async/Job.js +24 -0
  78. package/dist/src/feature/async/JobRepository.js +31 -0
  79. package/dist/src/feature/async/JobRunner.js +45 -0
  80. package/dist/src/feature/async/JobsEventsHub.js +24 -0
  81. package/dist/src/feature/async/runCommandHandlers.js +29 -0
  82. package/dist/src/{core/chat → feature/chat-bot}/Chat.js +2 -2
  83. package/dist/src/feature/chat-bot/ChatAdapter.js +7 -0
  84. package/dist/src/feature/chat-bot/ChatBot.js +50 -0
  85. package/dist/src/feature/chat-bot/ChatItem.js +24 -0
  86. package/dist/src/feature/chat-bot/ChatMemory.js +10 -0
  87. package/dist/src/{core/chat/repository/IChatRepository.js → feature/chat-bot/ChatRepository.js} +2 -8
  88. package/dist/src/feature/chat-bot/IChatItem.js +3 -0
  89. package/dist/src/{chatbot → feature/chat-bot}/metadata/@chatBot.js +1 -1
  90. package/dist/src/{chatbot → feature/chat-bot}/metadata/ChatBotMetadataStore.js +1 -1
  91. package/dist/src/{controller/channel → feature/chat-controller}/ChatResolver.js +5 -4
  92. package/dist/src/{controller → feature/chat-controller}/metadata/ControllerMetadataStore.js +1 -1
  93. package/dist/src/{controller → feature/chat-controller}/metadata/controller/@chatController.js +1 -1
  94. package/dist/src/feature/chat-controller/runChatControllers.js +69 -0
  95. package/dist/src/{channels → feature}/express/ExpressProvider.js +1 -1
  96. package/dist/src/{channels → feature}/http/HttpServerProvider.js +1 -1
  97. package/dist/src/{mindset → feature/mindset}/MindsetOperator.js +66 -42
  98. package/dist/src/{mindset → feature/mindset}/metadata/MindsetMetadataStore.js +1 -1
  99. package/dist/src/{mindset → feature/mindset}/metadata/functions/@mindsetFunction.js +1 -1
  100. package/dist/src/{mindset → feature/mindset}/metadata/mindsets/@mindset.js +1 -1
  101. package/dist/src/{mindset → feature/mindset}/metadata/modules/@mindsetModule.js +1 -2
  102. package/dist/src/{mindset → feature/mindset}/metadata/params/@param.js +1 -1
  103. package/dist/src/feature/rest-controller/auth/Auth.js +24 -0
  104. package/dist/src/feature/rest-controller/metadata/@get.js +19 -0
  105. package/dist/src/feature/rest-controller/metadata/@middleware.js +16 -0
  106. package/dist/src/feature/rest-controller/metadata/@post.js +19 -0
  107. package/dist/src/feature/rest-controller/metadata/@restController.js +15 -0
  108. package/dist/src/feature/rest-controller/metadata/RestControllerMetadataStore.js +50 -0
  109. package/dist/src/feature/rest-controller/runRestControllers.js +75 -0
  110. package/dist/src/{channels → feature}/socket/SocketServerProvider.js +1 -1
  111. package/dist/src/index.d.ts +785 -475
  112. package/dist/src/index.js +118 -74
  113. package/package.json +6 -3
  114. package/dist/src/ai/deepseek/DeepSeekChatBotAdapter.js +0 -106
  115. package/dist/src/ai/openia/OpenaiChatBotAdapter.js +0 -84
  116. package/dist/src/channels/cmd/@cmd.js +0 -18
  117. package/dist/src/chatbot/ChatBot.js +0 -51
  118. package/dist/src/chatbot/ChatBotAdapter.js +0 -72
  119. package/dist/src/controller/channel/UserResolver.js +0 -21
  120. package/dist/src/core/IMessageContext.js +0 -12
  121. package/dist/src/core/chat/ChatItem.js +0 -15
  122. package/dist/src/core/user/IUserRepository.js +0 -19
  123. package/dist/src/core/user/User.js +0 -26
  124. package/dist/src/env/WabotEnv.js +0 -21
  125. package/dist/src/injection/index.js +0 -4
  126. package/dist/src/mindset/metadata/params/@isOptional.js +0 -21
  127. package/dist/src/pre-made/module/authentication/AuthenticationModule.js +0 -97
  128. package/dist/src/pre-made/module/authentication/requests/SendOneTimePasswordRequest.js +0 -25
  129. package/dist/src/pre-made/module/authentication/requests/ValidateOneTimePasswordRequest.js +0 -25
  130. package/dist/src/pre-made/module/register-user/RegisterUserModule.js +0 -56
  131. package/dist/src/pre-made/module/register-user/requests/RegisterUserWithEmailRequest.js +0 -25
  132. package/dist/src/pre-made/repository/user/pg/PgUserRepository.js +0 -33
  133. package/dist/src/pre-made/repository/user/ram/RamUserRepository.js +0 -27
  134. package/dist/src/pre-made/service/EmailService.js +0 -13
  135. package/dist/src/pre-made/service/OtpService.js +0 -14
  136. package/dist/src/server/prepareChatContainer.js +0 -43
  137. package/dist/src/server/runChannel.js +0 -27
  138. package/dist/src/server/runServer.js +0 -40
  139. /package/dist/src/{pre-made/repository/chat → addon/chat-bot}/ram/RamChatMemory.js +0 -0
  140. /package/dist/src/{channels → addon/chat-controller}/telegram/TelegramChannelConfig.js +0 -0
  141. /package/dist/src/{channels/wabot → addon/chat-controller/whatsapp}/WabotDevSocketContracts.js +0 -0
  142. /package/dist/src/{channels → addon/chat-controller}/whatsapp/WhatsAppChannelConfig.js +0 -0
  143. /package/dist/src/{injection → core/injection}/Container.js +0 -0
  144. /package/dist/src/{logger → core/logger}/Logger.js +0 -0
  145. /package/dist/src/{mindset → feature/mindset}/IMindset.js +0 -0
  146. /package/dist/src/{mindset → feature/mindset}/metadata/functions/decoratorNames.js +0 -0
  147. /package/dist/src/{mindset → feature/mindset}/metadata/mindsets/decoratorNames.js +0 -0
  148. /package/dist/src/{mindset → feature/mindset}/metadata/modules/decoratorNames.js +0 -0
  149. /package/dist/src/{mindset → feature/mindset}/metadata/params/decoratorNames.js +0 -0
@@ -1,8 +1,9 @@
1
1
  import { __decorate, __metadata } from 'tslib';
2
- import { ChatRepository } from '../../core/chat/repository/IChatRepository.js';
3
- import { Chat } from '../../core/chat/Chat.js';
4
- import '../../core/user/IUserRepository.js';
5
- import { injectable } from '../../injection/index.js';
2
+ import { Chat } from '../chat-bot/Chat.js';
3
+ import { ChatRepository } from '../chat-bot/ChatRepository.js';
4
+ import { injectable } from '../../core/injection/index.js';
5
+ import 'uuid';
6
+ import '../chat-bot/metadata/ChatBotMetadataStore.js';
6
7
 
7
8
  let ChatResolver = class ChatResolver {
8
9
  chatRepository;
@@ -1,5 +1,5 @@
1
1
  import { __decorate } from 'tslib';
2
- import { singleton } from '../../injection/index.js';
2
+ import { singleton } from '../../../core/injection/index.js';
3
3
 
4
4
  let ControllerMetadataStore = class ControllerMetadataStore {
5
5
  channels = new Map();
@@ -1,4 +1,4 @@
1
- import { container, injectable } from '../../../injection/index.js';
1
+ import { container, injectable } from '../../../../core/injection/index.js';
2
2
  import { ControllerMetadataStore } from '../ControllerMetadataStore.js';
3
3
 
4
4
  function chatController(config) {
@@ -0,0 +1,69 @@
1
+ import { container } from '../../core/injection/index.js';
2
+ import { Chat } from '../chat-bot/Chat.js';
3
+ import { ChatBot } from '../chat-bot/ChatBot.js';
4
+ import { ChatMemory } from '../chat-bot/ChatMemory.js';
5
+ import { ChatRepository } from '../chat-bot/ChatRepository.js';
6
+ import 'uuid';
7
+ import { ChatBotMetadataStore } from '../chat-bot/metadata/ChatBotMetadataStore.js';
8
+ import 'reflect-metadata';
9
+ import '../mindset/metadata/MindsetMetadataStore.js';
10
+ import { Mindset } from '../mindset/IMindset.js';
11
+ import '../mindset/MindsetOperator.js';
12
+ import { ChatResolver } from './ChatResolver.js';
13
+ import { ControllerMetadataStore } from './metadata/ControllerMetadataStore.js';
14
+ import { Container } from '../../core/injection/Container.js';
15
+
16
+ async function prepareChatContainer(container, messageContext, mindsetCtor) {
17
+ const chatContainer = container.createChildContainer();
18
+ chatContainer.register(Container, { useValue: chatContainer });
19
+ chatContainer.registerInstance(Chat, messageContext.chat);
20
+ const chatRepository = container.resolve(ChatRepository);
21
+ const chatMemory = await chatRepository.findMemory(messageContext.chat.id);
22
+ if (!chatMemory) {
23
+ throw new Error('Not found Chat Memory for Chat with Id=' + messageContext.chat.id);
24
+ }
25
+ chatContainer.registerInstance(ChatMemory, chatMemory);
26
+ const chatBotMetadataStore = container.resolve(ChatBotMetadataStore);
27
+ const chatBots = chatBotMetadataStore.getChatBotsMetadata();
28
+ for (const chatBotMetadata of chatBots) {
29
+ chatContainer.beforeResolution(chatBotMetadata.constructor, (a, b) => {
30
+ const subContainer = chatContainer.createChildContainer();
31
+ subContainer.register(Mindset, { useClass: chatBotMetadata.mindsetConstructor });
32
+ const chatBot = subContainer.resolve(ChatBot);
33
+ chatContainer.register(chatBotMetadata.injectionToken, { useValue: chatBot });
34
+ });
35
+ }
36
+ return chatContainer;
37
+ }
38
+ function runChatControllers(controllers) {
39
+ const metadataStore = container.resolve(ControllerMetadataStore);
40
+ const chatResolver = container.resolve(ChatResolver);
41
+ for (const controllerCtor of controllers) {
42
+ const chatControllerMetadata = metadataStore.getChatControllerMetadata(controllerCtor);
43
+ if (!chatControllerMetadata) {
44
+ continue;
45
+ }
46
+ for (const channelMetadata of chatControllerMetadata.channels) {
47
+ const channelContainer = container.createChildContainer();
48
+ if (channelMetadata.channelConfig) {
49
+ channelContainer.register(channelMetadata.channelConfig.constructor, {
50
+ useValue: channelMetadata.channelConfig,
51
+ });
52
+ }
53
+ const channel = channelContainer.resolve(channelMetadata.channelConstructor);
54
+ channel.listen(async (channelMessage) => {
55
+ const chat = await chatResolver.resolve(channelMessage.chatConnection);
56
+ const chatContainer = await prepareChatContainer(channelContainer, {
57
+ chat,
58
+ message: channelMessage.message,
59
+ reply: channelMessage.reply,
60
+ });
61
+ const chatController = chatContainer.resolve(channelMetadata.controllerConstructor);
62
+ chatController[channelMetadata.functionName](channelMessage);
63
+ });
64
+ channel.connect();
65
+ }
66
+ }
67
+ }
68
+
69
+ export { runChatControllers };
@@ -3,7 +3,7 @@ import { HttpServerProvider } from '../http/HttpServerProvider.js';
3
3
  import express from 'express';
4
4
  import { singleton } from 'tsyringe';
5
5
  import bodyParser from 'body-parser';
6
- import { Logger } from '../../logger/Logger.js';
6
+ import { Logger } from '../../core/logger/Logger.js';
7
7
 
8
8
  let ExpressProvider = class ExpressProvider {
9
9
  httpServerProvider;
@@ -1,5 +1,5 @@
1
1
  import { __decorate } from 'tslib';
2
- import { Logger } from '../../logger/Logger.js';
2
+ import { Logger } from '../../core/logger/Logger.js';
3
3
  import { Server } from 'http';
4
4
  import { singleton } from 'tsyringe';
5
5
 
@@ -1,8 +1,8 @@
1
1
  import { __decorate, __metadata } from 'tslib';
2
- import { injectable } from '../injection/index.js';
2
+ import { injectable } from '../../core/injection/index.js';
3
3
  import { Mindset } from './IMindset.js';
4
4
  import { MindsetMetadataStore } from './metadata/MindsetMetadataStore.js';
5
- import { Container } from '../injection/Container.js';
5
+ import { Container } from '../../core/injection/Container.js';
6
6
 
7
7
  let MindsetOperator = class MindsetOperator {
8
8
  mindset;
@@ -22,64 +22,66 @@ let MindsetOperator = class MindsetOperator {
22
22
  limits() {
23
23
  return this.mindset.limits();
24
24
  }
25
- async callFunction(name, params) {
26
- const fnMetadata = this.metadata.modules
27
- .map((module) => module.functions)
28
- .flat()
29
- .find((fn) => fn.name === name);
30
- if (!fnMetadata) {
31
- throw new Error(`Function ${name} not found`);
32
- }
33
- const paramsObj = JSON.parse(params);
34
- const module = this.container.resolve(fnMetadata.moduleConstructor);
35
- try {
36
- const response = await module[name](paramsObj);
37
- if (!response) {
38
- return 'success';
39
- }
40
- return response.toString();
41
- }
42
- catch (error) {
43
- return `Error: ${error}`;
44
- }
25
+ async systemPrompt() {
26
+ let [identity, skills, limits] = await Promise.all([
27
+ this.identity(),
28
+ this.skills(),
29
+ this.limits(),
30
+ ]);
31
+ const language = identity.language.replaceAll('#', ' ');
32
+ const name = identity.name.replaceAll('#', ' ');
33
+ const age = identity.age ? identity.age.toString().replaceAll('#', ' ') : null;
34
+ const personality = identity.personality ? identity.personality.replaceAll('#', ' ') : null;
35
+ skills = skills.replaceAll('#', ' ');
36
+ limits = limits.replaceAll('#', ' ');
37
+ const systemPrompt = `
38
+ # System Instructions
39
+ you should act as a assistant.
40
+ your main language is ${language}.
41
+ your name is ${name}.
42
+ ${age ? 'you are ' + age + ' years old.' : ''}
43
+
44
+ ${personality ? '## Personality (in your main language) \n' + personality : ''}
45
+
46
+ ## Skills (in your main language)
47
+ ${skills}
48
+
49
+ ## System limitations (in your main language)
50
+ ${limits}
51
+
52
+ ## Chat memory
53
+ Next you will receive a chat history,
54
+ you should use this information to answer the user.
55
+ `;
56
+ return systemPrompt;
45
57
  }
46
- async allFunctionsDescriptors() {
58
+ tools() {
47
59
  return this.metadata.modules
48
- .map((module) => module.functions.map((fn) => this.functionDescriptor(fn)))
60
+ .map((module) => module.functions.map((fn) => this.tool(fn, module)))
49
61
  .flat();
50
62
  }
51
- functionDescriptor(fn) {
63
+ tool(fn, module) {
52
64
  const description = fn.config.description.replaceAll('#', ' ');
53
65
  return {
54
- type: 'function',
66
+ language: module.config.language ?? 'english',
55
67
  name: fn.name,
56
68
  description,
57
- parameters: {
58
- type: 'object',
59
- properties: fn.params.reduce((prev, param) => ({
60
- ...prev,
61
- [param.name]: this.toolParam(param),
62
- }), {}),
63
- required: fn.params.filter((param) => !param.config.optional).map((param) => param.name)
64
- },
69
+ parameters: fn.params.map((param) => this.toolParameter(param)),
65
70
  };
66
71
  }
67
- toolParam(param) {
68
- const addons = {
69
- description: `
72
+ toolParameter(param) {
73
+ let description = `
70
74
  ### description (in your main language)
71
75
  ${param.config.description.replaceAll('#', ' ')}
72
- `,
73
- };
76
+ `;
74
77
  const type = (() => {
75
78
  if (param.type === Number)
76
79
  return 'number';
77
80
  if (param.type === String)
78
81
  return 'string';
79
82
  if (param.type === Date) {
80
- addons.description = `${addons.description}
83
+ description = `${description}
81
84
  ### format: ISO 8681 - YYYY-MM-DDTHH:mm:ssZ
82
- ${addons.description}
83
85
  `;
84
86
  return 'string';
85
87
  }
@@ -87,9 +89,31 @@ let MindsetOperator = class MindsetOperator {
87
89
  })();
88
90
  return {
89
91
  type,
90
- ...addons,
92
+ name: param.name,
93
+ description,
91
94
  };
92
95
  }
96
+ async callFunction(name, params) {
97
+ const fnMetadata = this.metadata.modules
98
+ .map((module) => module.functions)
99
+ .flat()
100
+ .find((fn) => fn.name === name);
101
+ if (!fnMetadata) {
102
+ throw new Error(`Function ${name} not found`);
103
+ }
104
+ const paramsObj = JSON.parse(params);
105
+ const module = this.container.resolve(fnMetadata.moduleConstructor);
106
+ try {
107
+ const response = await module[name](paramsObj);
108
+ if (!response) {
109
+ return 'success';
110
+ }
111
+ return response.toString();
112
+ }
113
+ catch (error) {
114
+ return `Error: ${error}`;
115
+ }
116
+ }
93
117
  };
94
118
  MindsetOperator = __decorate([
95
119
  injectable(),
@@ -1,5 +1,5 @@
1
1
  import { __decorate } from 'tslib';
2
- import { singleton } from '../../injection/index.js';
2
+ import { singleton } from '../../../core/injection/index.js';
3
3
  import { MINDSET_FUNCTION_DECORATION_FUNCTION } from './functions/decoratorNames.js';
4
4
  import { MINDSET_DECORATION_MINDSET } from './mindsets/decoratorNames.js';
5
5
  import { MINDSET_MODULE_DECORATION_MODULE } from './modules/decoratorNames.js';
@@ -1,5 +1,5 @@
1
1
  import 'reflect-metadata';
2
- import { container } from '../../../injection/index.js';
2
+ import { container } from '../../../../core/injection/index.js';
3
3
  import { MindsetMetadataStore } from '../MindsetMetadataStore.js';
4
4
  import { MINDSET_FUNCTION_DECORATION_FUNCTION } from './decoratorNames.js';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import 'reflect-metadata';
2
- import { container, injectable } from '../../../injection/index.js';
2
+ import { container, injectable } from '../../../../core/injection/index.js';
3
3
  import { MindsetMetadataStore } from '../MindsetMetadataStore.js';
4
4
  import { MINDSET_DECORATION_MINDSET } from './decoratorNames.js';
5
5
 
@@ -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,24 @@
1
+ import { __decorate } from 'tslib';
2
+ import { CustomError } from '../../../core/error/CustomError.js';
3
+ import { scoped, Lifecycle } from '../../../core/injection/index.js';
4
+
5
+ let Auth = class Auth {
6
+ authInfo = null;
7
+ require() {
8
+ if (!this.authInfo) {
9
+ throw new CustomError({ message: 'Unauthorized', httpCode: 401 });
10
+ }
11
+ return this.authInfo;
12
+ }
13
+ assign(authInfo) {
14
+ if (this.authInfo) {
15
+ throw new CustomError({ message: 'Authorization info already assigned', httpCode: 401 });
16
+ }
17
+ this.authInfo = authInfo;
18
+ }
19
+ };
20
+ Auth = __decorate([
21
+ scoped(Lifecycle.ContainerScoped)
22
+ ], Auth);
23
+
24
+ export { Auth };
@@ -0,0 +1,19 @@
1
+ import { container } from '../../../core/injection/index.js';
2
+ import { RestControllerMetadataStore } from './RestControllerMetadataStore.js';
3
+
4
+ function get(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
+ functionName,
12
+ method: 'get',
13
+ path: typeof config === 'string' ? config : config?.path,
14
+ paramsTypes,
15
+ });
16
+ };
17
+ }
18
+
19
+ export { get };
@@ -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,19 @@
1
+ import { container } from '../../../core/injection/index.js';
2
+ import { RestControllerMetadataStore } from './RestControllerMetadataStore.js';
3
+
4
+ function post(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
+ functionName,
12
+ method: 'post',
13
+ path: typeof config === 'string' ? config : config?.path,
14
+ paramsTypes,
15
+ });
16
+ };
17
+ }
18
+
19
+ export { post };
@@ -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,75 @@
1
+ import path from 'path';
2
+ import { container } from '../../core/injection/index.js';
3
+ import { RestControllerMetadataStore } from './metadata/RestControllerMetadataStore.js';
4
+ import { Logger } from '../../core/logger/Logger.js';
5
+ import { ExpressProvider } from '../express/ExpressProvider.js';
6
+ import '../../core/validation/metadata/ValidationMetadataStore.js';
7
+ import { validate } from '../../core/validation/validate.js';
8
+ import { CustomError } from '../../core/error/CustomError.js';
9
+
10
+ function buildRequest(req) {
11
+ return Object.assign({}, req.body, req.query, req.params);
12
+ }
13
+ function runRestControllers(controllers) {
14
+ const logger = new Logger('wabot:rest');
15
+ const metadataStore = container.resolve(RestControllerMetadataStore);
16
+ const expressProvider = container.resolve(ExpressProvider);
17
+ const expressApp = expressProvider.getExpress();
18
+ controllers.forEach((controller) => {
19
+ const endPoints = metadataStore.getControllerEndPointsInfo(controller);
20
+ endPoints.forEach((endPoint) => {
21
+ const method = endPoint.method;
22
+ const route = path.join(endPoint.controller.path, endPoint.path ?? '');
23
+ logger.info(`config ${endPoint.method.toUpperCase()} ${route}`);
24
+ expressApp[method](route, async (req, res) => {
25
+ const requestContainer = container.createChildContainer();
26
+ try {
27
+ const middlewares = endPoint.middlewares.map((x) => requestContainer.resolve(x.middlewareConstructor));
28
+ for (const middleware of middlewares) {
29
+ await middleware.handle(req, res, requestContainer);
30
+ }
31
+ const controllerInstance = requestContainer.resolve(endPoint.controllerConstructor);
32
+ const endPointArgs = [];
33
+ let defaultArgFound = false;
34
+ for (let paramIndex = 0; paramIndex < endPoint.paramsTypes.length; paramIndex++) {
35
+ const paramType = endPoint.paramsTypes[paramIndex];
36
+ if (defaultArgFound) {
37
+ throw new Error(`Cant determine de parameter ${paramIndex} value`);
38
+ }
39
+ defaultArgFound = true;
40
+ if (typeof paramType === 'function') {
41
+ const { value, error } = validate(buildRequest(req), paramType);
42
+ if (error) {
43
+ throw new CustomError({ httpCode: 400, message: error.description, info: error });
44
+ }
45
+ endPointArgs.push(value);
46
+ }
47
+ }
48
+ const response = await controllerInstance[endPoint.functionName].apply(controllerInstance, endPointArgs);
49
+ res.status(200).json(response);
50
+ }
51
+ catch (err) {
52
+ if (err instanceof Error) {
53
+ const keys = Object.keys(err).filter((key) => !['message', 'stack'].includes(key));
54
+ const { httpCode, ...info } = keys.reduce((acc, key) => {
55
+ acc[key] = err[key];
56
+ return acc;
57
+ }, {});
58
+ res
59
+ .status(httpCode ?? 500)
60
+ .json({ error: { message: err.message, stack: err.stack, ...info } });
61
+ }
62
+ else {
63
+ res.status(500).json({ error: { message: 'Unknown error' } });
64
+ }
65
+ }
66
+ finally {
67
+ requestContainer.dispose();
68
+ }
69
+ });
70
+ });
71
+ });
72
+ expressProvider.listen();
73
+ }
74
+
75
+ export { runRestControllers };
@@ -1,5 +1,5 @@
1
1
  import { __decorate, __metadata } from 'tslib';
2
- import { Logger } from '../../logger/Logger.js';
2
+ import { Logger } from '../../core/logger/Logger.js';
3
3
  import { HttpServerProvider } from '../http/HttpServerProvider.js';
4
4
  import { Server } from 'socket.io';
5
5
  import { singleton } from 'tsyringe';