@zohoim/client-sdk 0.0.1
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.
- package/es/application/services/agents/AgentService.js +21 -0
- package/es/application/services/agents/index.js +2 -0
- package/es/application/services/bots/BotService.js +21 -0
- package/es/application/services/bots/index.js +2 -0
- package/es/application/services/channels/ChannelAgentService.js +21 -0
- package/es/application/services/channels/ChannelService.js +21 -0
- package/es/application/services/channels/index.js +3 -0
- package/es/application/services/contacts/ContactService.js +21 -0
- package/es/application/services/contacts/index.js +2 -0
- package/es/application/services/index.js +6 -0
- package/es/application/services/messages/MessageService.js +56 -0
- package/es/application/services/messages/index.js +2 -0
- package/es/application/services/sessions/SessionService.js +51 -0
- package/es/application/services/sessions/index.js +2 -0
- package/es/core/constants/ModuleNames.js +9 -0
- package/es/core/constants/ResponseTypes.js +6 -0
- package/es/core/constants/index.js +6 -0
- package/es/core/errors/AdapterError.js +7 -0
- package/es/core/errors/ValidationError.js +7 -0
- package/es/core/errors/index.js +3 -0
- package/es/core/utils/ResponseUtils.js +24 -0
- package/es/core/utils/index.js +3 -0
- package/es/core/utils/validateSchema.js +76 -0
- package/es/domain/dto/RequestBuilder.js +44 -0
- package/es/domain/dto/agents/getAgentsRequest.js +12 -0
- package/es/domain/dto/agents/index.js +1 -0
- package/es/domain/dto/bots/getBotsRequest.js +15 -0
- package/es/domain/dto/bots/index.js +1 -0
- package/es/domain/dto/channels/agents/getChannelAgentsRequest.js +13 -0
- package/es/domain/dto/channels/agents/index.js +1 -0
- package/es/domain/dto/channels/getChannelsRequest.js +23 -0
- package/es/domain/dto/channels/index.js +3 -0
- package/es/domain/dto/contacts/getContactsRequest.js +11 -0
- package/es/domain/dto/contacts/index.js +1 -0
- package/es/domain/dto/index.js +6 -0
- package/es/domain/dto/messages/deleteMessageRequest.js +14 -0
- package/es/domain/dto/messages/getFullContentRequest.js +14 -0
- package/es/domain/dto/messages/getMessagesRequest.js +20 -0
- package/es/domain/dto/messages/index.js +8 -0
- package/es/domain/dto/messages/initiateSessionRequest.js +21 -0
- package/es/domain/dto/messages/resendMessageRequest.js +14 -0
- package/es/domain/dto/messages/searchMessagesRequest.js +22 -0
- package/es/domain/dto/messages/sendAttachmentRequest.js +20 -0
- package/es/domain/dto/messages/sendMessageRequest.js +17 -0
- package/es/domain/dto/sessions/getSessionAttachmentsRequest.js +13 -0
- package/es/domain/dto/sessions/getSessionLastMessagesRequest.js +13 -0
- package/es/domain/dto/sessions/getSessionRequest.js +13 -0
- package/es/domain/dto/sessions/getSessionsRequest.js +26 -0
- package/es/domain/dto/sessions/index.js +7 -0
- package/es/domain/dto/sessions/markSessionAsReadRequest.js +13 -0
- package/es/domain/dto/sessions/updateSessionAssigneeRequest.js +12 -0
- package/es/domain/dto/sessions/updateSessionStatusRequest.js +17 -0
- package/es/domain/entities/Actor/Actor.js +28 -0
- package/es/domain/entities/Actor/index.js +2 -0
- package/es/domain/entities/Agent/Agent.js +26 -0
- package/es/domain/entities/Agent/index.js +2 -0
- package/es/domain/entities/Attachment/Attachment.js +22 -0
- package/es/domain/entities/Attachment/index.js +2 -0
- package/es/domain/entities/Bot/Bot.js +23 -0
- package/es/domain/entities/Bot/index.js +2 -0
- package/es/domain/entities/Channel/Channel.js +38 -0
- package/es/domain/entities/Channel/index.js +2 -0
- package/es/domain/entities/Contact/Contact.js +22 -0
- package/es/domain/entities/Contact/index.js +2 -0
- package/es/domain/entities/Message/Action.js +19 -0
- package/es/domain/entities/Message/ExternalInfo.js +17 -0
- package/es/domain/entities/Message/Info.js +21 -0
- package/es/domain/entities/Message/Location.js +18 -0
- package/es/domain/entities/Message/Message.js +45 -0
- package/es/domain/entities/Message/MessageWithSession.js +21 -0
- package/es/domain/entities/Message/index.js +6 -0
- package/es/domain/entities/Session/Session.js +35 -0
- package/es/domain/entities/Session/index.js +2 -0
- package/es/domain/entities/index.js +8 -0
- package/es/domain/enum/actor/ActorType.js +7 -0
- package/es/domain/enum/actor/index.js +2 -0
- package/es/domain/enum/bot/BotServiceType.js +7 -0
- package/es/domain/enum/bot/index.js +2 -0
- package/es/domain/enum/index.js +5 -0
- package/es/domain/enum/integrationServices/IntegrationServices.js +11 -0
- package/es/domain/enum/integrationServices/index.js +2 -0
- package/es/domain/enum/message/ActionSubType.js +6 -0
- package/es/domain/enum/message/ActionType.js +6 -0
- package/es/domain/enum/message/ExternalInfoAction.js +9 -0
- package/es/domain/enum/message/InfoAction.js +17 -0
- package/es/domain/enum/message/InfoSessionStatus.js +10 -0
- package/es/domain/enum/message/MessageContentType.js +6 -0
- package/es/domain/enum/message/MessageDirection.js +6 -0
- package/es/domain/enum/message/MessageStatus.js +11 -0
- package/es/domain/enum/message/MessageType.js +11 -0
- package/es/domain/enum/message/index.js +10 -0
- package/es/domain/enum/session/SessionReplyStatus.js +20 -0
- package/es/domain/enum/session/SessionStatus.js +9 -0
- package/es/domain/enum/session/index.js +3 -0
- package/es/domain/interfaces/IAdapter.js +6 -0
- package/es/domain/interfaces/index.js +3 -0
- package/es/domain/interfaces/repositories/agents/IAgentRepository.js +17 -0
- package/es/domain/interfaces/repositories/agents/index.js +2 -0
- package/es/domain/interfaces/repositories/bots/IBotRepository.js +17 -0
- package/es/domain/interfaces/repositories/bots/index.js +2 -0
- package/es/domain/interfaces/repositories/channels/IChannelAgentRepository.js +17 -0
- package/es/domain/interfaces/repositories/channels/IChannelRepository.js +17 -0
- package/es/domain/interfaces/repositories/channels/index.js +3 -0
- package/es/domain/interfaces/repositories/contacts/IContactRepository.js +17 -0
- package/es/domain/interfaces/repositories/contacts/index.js +2 -0
- package/es/domain/interfaces/repositories/index.js +6 -0
- package/es/domain/interfaces/repositories/messages/IMessageRepository.js +52 -0
- package/es/domain/interfaces/repositories/messages/index.js +2 -0
- package/es/domain/interfaces/repositories/sessions/ISessionRepository.js +47 -0
- package/es/domain/interfaces/repositories/sessions/index.js +2 -0
- package/es/domain/schema/actor/ActorSchema.js +33 -0
- package/es/domain/schema/actor/AgentSchema.js +45 -0
- package/es/domain/schema/actor/index.js +3 -0
- package/es/domain/schema/attachment/AttachmentSchema.js +27 -0
- package/es/domain/schema/attachment/index.js +2 -0
- package/es/domain/schema/bot/BotSchema.js +33 -0
- package/es/domain/schema/bot/index.js +2 -0
- package/es/domain/schema/channel/ChannelSchema.js +49 -0
- package/es/domain/schema/channel/index.js +2 -0
- package/es/domain/schema/contact/ContactSchema.js +27 -0
- package/es/domain/schema/contact/index.js +2 -0
- package/es/domain/schema/index.js +8 -0
- package/es/domain/schema/integrationService/IntegrationServiceSchema.js +31 -0
- package/es/domain/schema/integrationService/index.js +2 -0
- package/es/domain/schema/message/ActionSchema.js +18 -0
- package/es/domain/schema/message/ExternalInfoSchema.js +9 -0
- package/es/domain/schema/message/InfoSchema.js +24 -0
- package/es/domain/schema/message/LocationSchema.js +11 -0
- package/es/domain/schema/message/MessageSchema.js +112 -0
- package/es/domain/schema/message/MessageWithSessionSchema.js +10 -0
- package/es/domain/schema/message/index.js +7 -0
- package/es/domain/schema/session/SessionSchema.js +82 -0
- package/es/domain/schema/session/index.js +2 -0
- package/es/frameworks/managers/ModuleFactory.js +58 -0
- package/es/frameworks/managers/ModuleManager.js +44 -0
- package/es/frameworks/managers/index.js +2 -0
- package/es/frameworks/sdk/IMSDK.js +62 -0
- package/es/frameworks/sdk/agents/AgentSDK.js +30 -0
- package/es/frameworks/sdk/agents/index.js +2 -0
- package/es/frameworks/sdk/bots/BotSDK.js +30 -0
- package/es/frameworks/sdk/bots/index.js +2 -0
- package/es/frameworks/sdk/channels/ChannelSDK.js +37 -0
- package/es/frameworks/sdk/channels/index.js +2 -0
- package/es/frameworks/sdk/contacts/ContactSDK.js +30 -0
- package/es/frameworks/sdk/contacts/index.js +2 -0
- package/es/frameworks/sdk/index.js +2 -0
- package/es/frameworks/sdk/messages/MessageSDK.js +32 -0
- package/es/frameworks/sdk/messages/index.js +2 -0
- package/es/frameworks/sdk/sessions/SessionSDK.js +34 -0
- package/es/frameworks/sdk/sessions/index.js +2 -0
- package/es/index.html +25 -0
- package/es/index.js +12 -0
- package/es/infrastructure/adapters/agents/AgentAdapter.js +28 -0
- package/es/infrastructure/adapters/agents/index.js +2 -0
- package/es/infrastructure/adapters/attachments/AttachmentAdapter.js +24 -0
- package/es/infrastructure/adapters/attachments/index.js +2 -0
- package/es/infrastructure/adapters/bots/BotAdapter.js +25 -0
- package/es/infrastructure/adapters/bots/index.js +2 -0
- package/es/infrastructure/adapters/channels/ChannelAdapter.js +29 -0
- package/es/infrastructure/adapters/channels/ChannelAgentAdapter.js +49 -0
- package/es/infrastructure/adapters/channels/index.js +3 -0
- package/es/infrastructure/adapters/contacts/ContactAdapter.js +24 -0
- package/es/infrastructure/adapters/contacts/index.js +2 -0
- package/es/infrastructure/adapters/index.js +7 -0
- package/es/infrastructure/adapters/messages/MessageAdapter.js +41 -0
- package/es/infrastructure/adapters/messages/MessageWithSessionAdapter.js +23 -0
- package/es/infrastructure/adapters/messages/index.js +2 -0
- package/es/infrastructure/adapters/sessions/SessionAdapter.js +36 -0
- package/es/infrastructure/adapters/sessions/index.js +2 -0
- package/es/infrastructure/api/BaseAPI.js +147 -0
- package/es/infrastructure/api/agents/AgentAPI.js +14 -0
- package/es/infrastructure/api/agents/index.js +2 -0
- package/es/infrastructure/api/bots/BotAPI.js +14 -0
- package/es/infrastructure/api/bots/index.js +2 -0
- package/es/infrastructure/api/channels/ChannelAPI.js +14 -0
- package/es/infrastructure/api/channels/ChannelAgentAPI.js +22 -0
- package/es/infrastructure/api/channels/index.js +3 -0
- package/es/infrastructure/api/contacts/ContactAPI.js +14 -0
- package/es/infrastructure/api/contacts/index.js +2 -0
- package/es/infrastructure/api/index.js +6 -0
- package/es/infrastructure/api/messages/MessageAPI.js +84 -0
- package/es/infrastructure/api/messages/index.js +2 -0
- package/es/infrastructure/api/registry/agents/agentAPIRegistry.js +12 -0
- package/es/infrastructure/api/registry/agents/constructAgentEndPoint.js +10 -0
- package/es/infrastructure/api/registry/agents/index.js +2 -0
- package/es/infrastructure/api/registry/bots/botAPIRegistry.js +12 -0
- package/es/infrastructure/api/registry/bots/constructBotEndPoint.js +10 -0
- package/es/infrastructure/api/registry/bots/index.js +2 -0
- package/es/infrastructure/api/registry/channels/channelAPIRegistry.js +16 -0
- package/es/infrastructure/api/registry/channels/channelAgentAPIRegistry.js +12 -0
- package/es/infrastructure/api/registry/channels/constructChannelEndPoint.js +10 -0
- package/es/infrastructure/api/registry/channels/index.js +2 -0
- package/es/infrastructure/api/registry/contacts/constructContactEndPoint.js +10 -0
- package/es/infrastructure/api/registry/contacts/contactAPIRegistry.js +12 -0
- package/es/infrastructure/api/registry/contacts/index.js +2 -0
- package/es/infrastructure/api/registry/createAPIRegistry.js +7 -0
- package/es/infrastructure/api/registry/createBaseUrl.js +3 -0
- package/es/infrastructure/api/registry/getRegistryConfig.js +26 -0
- package/es/infrastructure/api/registry/index.js +2 -0
- package/es/infrastructure/api/registry/messages/constructMessageEndPoint.js +4 -0
- package/es/infrastructure/api/registry/messages/index.js +2 -0
- package/es/infrastructure/api/registry/messages/messageAPIRegistry.js +57 -0
- package/es/infrastructure/api/registry/sessions/constructSessionEndPoint.js +10 -0
- package/es/infrastructure/api/registry/sessions/index.js +2 -0
- package/es/infrastructure/api/registry/sessions/sessionAPIRegistry.js +46 -0
- package/es/infrastructure/api/sessions/SessionAPI.js +74 -0
- package/es/infrastructure/api/sessions/index.js +2 -0
- package/es/infrastructure/config/configRegistry.js +27 -0
- package/es/infrastructure/config/index.js +2 -0
- package/es/infrastructure/repositories/agents/AgentRepository.js +49 -0
- package/es/infrastructure/repositories/agents/index.js +2 -0
- package/es/infrastructure/repositories/bots/BotRepository.js +49 -0
- package/es/infrastructure/repositories/bots/index.js +2 -0
- package/es/infrastructure/repositories/channels/ChannelAgentRepository.js +49 -0
- package/es/infrastructure/repositories/channels/ChannelRepository.js +49 -0
- package/es/infrastructure/repositories/channels/index.js +3 -0
- package/es/infrastructure/repositories/contacts/ContactRepository.js +49 -0
- package/es/infrastructure/repositories/contacts/index.js +2 -0
- package/es/infrastructure/repositories/index.js +6 -0
- package/es/infrastructure/repositories/messages/MessageRepository.js +111 -0
- package/es/infrastructure/repositories/messages/index.js +2 -0
- package/es/infrastructure/repositories/sessions/SessionRepository.js +105 -0
- package/es/infrastructure/repositories/sessions/index.js +2 -0
- package/package.json +36 -0
package/es/index.html
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en" dir="{{--dir}}">
|
|
3
|
+
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8" />
|
|
6
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
7
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
8
|
+
<link rel="stylesheet" href="https://webfonts.zoho.com/css?family=Poppins:400,600,700" />
|
|
9
|
+
<link rel="stylesheet"
|
|
10
|
+
href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.3.1/styles/github-dark.min.css" />
|
|
11
|
+
<title>Demo Docs</title>
|
|
12
|
+
<script src="https://kit.fontawesome.com/6812a5e4e0.js" crossorigin="anonymous"></script>
|
|
13
|
+
<style>
|
|
14
|
+
#root {
|
|
15
|
+
height: 100%;
|
|
16
|
+
width: 100%;
|
|
17
|
+
}
|
|
18
|
+
</style>
|
|
19
|
+
</head>
|
|
20
|
+
|
|
21
|
+
<body>
|
|
22
|
+
<div id="root" data-mode="light" data-theme="blue" class="zd-contrast"></div>
|
|
23
|
+
</body>
|
|
24
|
+
|
|
25
|
+
</html>
|
package/es/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// domain
|
|
2
|
+
export * from "./domain/dto";
|
|
3
|
+
export * from "./domain/entities";
|
|
4
|
+
export * from "./domain/enum";
|
|
5
|
+
export * from "./domain/interfaces"; // infrastructure
|
|
6
|
+
|
|
7
|
+
export * from "./infrastructure/api"; // frameworks
|
|
8
|
+
|
|
9
|
+
export * from "./frameworks/sdk"; // core
|
|
10
|
+
|
|
11
|
+
export * from "./core/constants";
|
|
12
|
+
export { ResponseUtils } from "./core/utils";
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { AdapterError } from "../../../core/errors";
|
|
2
|
+
import { Agent } from "../../../domain/entities";
|
|
3
|
+
import { ActorType } from "../../../domain/enum";
|
|
4
|
+
import { IAdapter } from "../../../domain/interfaces";
|
|
5
|
+
export default class AgentAdapter extends IAdapter {
|
|
6
|
+
adapt(agentData) {
|
|
7
|
+
if (!agentData) {
|
|
8
|
+
throw new AdapterError('Agent data is required');
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
try {
|
|
12
|
+
return new Agent({
|
|
13
|
+
id: agentData.id,
|
|
14
|
+
firstName: agentData.firstName,
|
|
15
|
+
lastName: agentData.lastName,
|
|
16
|
+
email: agentData.email,
|
|
17
|
+
zuid: agentData.zuid,
|
|
18
|
+
status: agentData.status,
|
|
19
|
+
role: agentData.role,
|
|
20
|
+
photoURL: agentData.photoURL,
|
|
21
|
+
type: [ActorType.AGENT]
|
|
22
|
+
}).toJSON();
|
|
23
|
+
} catch (error) {
|
|
24
|
+
throw new AdapterError(`Failed to adapt Agent: ${error.message}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { AdapterError } from "../../../core/errors";
|
|
2
|
+
import { Attachment } from "../../../domain/entities";
|
|
3
|
+
import { IAdapter } from "../../../domain/interfaces";
|
|
4
|
+
export default class AttachmentAdapter extends IAdapter {
|
|
5
|
+
adapt(attachmentData) {
|
|
6
|
+
if (!attachmentData) {
|
|
7
|
+
throw new AdapterError('Attachment data is required');
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
return new Attachment({
|
|
12
|
+
id: attachmentData.id,
|
|
13
|
+
name: attachmentData.name,
|
|
14
|
+
type: attachmentData.type,
|
|
15
|
+
createdTime: attachmentData.createdTime,
|
|
16
|
+
size: attachmentData.size,
|
|
17
|
+
url: attachmentData.url
|
|
18
|
+
}).toJSON();
|
|
19
|
+
} catch (error) {
|
|
20
|
+
throw new AdapterError(`Failed to adapt attachment: ${error.message}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { AdapterError } from "../../../core/errors";
|
|
2
|
+
import { Bot } from "../../../domain/entities";
|
|
3
|
+
import { IAdapter } from "../../../domain/interfaces";
|
|
4
|
+
export default class BotAdapter extends IAdapter {
|
|
5
|
+
adapt(botData) {
|
|
6
|
+
if (!botData) {
|
|
7
|
+
throw new AdapterError('Bot data is required');
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
return new Bot({
|
|
12
|
+
id: botData.id,
|
|
13
|
+
botServiceType: botData.botService.id,
|
|
14
|
+
name: botData.name,
|
|
15
|
+
isActive: botData.isActive,
|
|
16
|
+
createdTime: botData.createdTime,
|
|
17
|
+
photoURL: botData.logoURL,
|
|
18
|
+
createdBy: botData.createdBy
|
|
19
|
+
}).toJSON();
|
|
20
|
+
} catch (error) {
|
|
21
|
+
throw new AdapterError(`Failed to adapt bot: ${error.message}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { AdapterError } from "../../../core/errors";
|
|
2
|
+
import { Channel } from "../../../domain/entities";
|
|
3
|
+
import { IAdapter } from "../../../domain/interfaces";
|
|
4
|
+
export default class ChannelAdapter extends IAdapter {
|
|
5
|
+
adapt(rawChannel) {
|
|
6
|
+
if (!rawChannel) {
|
|
7
|
+
throw new AdapterError('Channel data is required');
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
return new Channel({
|
|
12
|
+
id: rawChannel.id,
|
|
13
|
+
integrationService: rawChannel.integrationService,
|
|
14
|
+
name: rawChannel.name,
|
|
15
|
+
defaultBotId: rawChannel.defaultBotId,
|
|
16
|
+
isActive: rawChannel.isActive,
|
|
17
|
+
createdTime: rawChannel.createdTime,
|
|
18
|
+
accountName: rawChannel.accountName,
|
|
19
|
+
isSubscribed: rawChannel.isSubscribed,
|
|
20
|
+
createdBy: rawChannel.createdBy,
|
|
21
|
+
isOwner: rawChannel.isOwner,
|
|
22
|
+
photoURL: rawChannel.logoURL
|
|
23
|
+
}).toJSON();
|
|
24
|
+
} catch (error) {
|
|
25
|
+
throw new AdapterError(`Failed to adapt channel: ${error.message}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { AdapterError } from "../../../core/errors";
|
|
2
|
+
import { Agent } from "../../../domain/entities";
|
|
3
|
+
import { IAdapter } from "../../../domain/interfaces";
|
|
4
|
+
export default class ChannelAgentAdapter extends IAdapter {
|
|
5
|
+
/**
|
|
6
|
+
* Adapts channel agent data to Agent entity
|
|
7
|
+
* @param {Object} channelAgent - Channel agent data to adapt
|
|
8
|
+
* @returns {Object} Adapted agent data
|
|
9
|
+
* @throws {AdapterError} When adaptation fails
|
|
10
|
+
*/
|
|
11
|
+
adapt(channelAgent) {
|
|
12
|
+
if (!channelAgent) {
|
|
13
|
+
throw new AdapterError('Channel agent data is required');
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
const {
|
|
18
|
+
id,
|
|
19
|
+
name,
|
|
20
|
+
email,
|
|
21
|
+
photoURL,
|
|
22
|
+
zuid,
|
|
23
|
+
type
|
|
24
|
+
} = new Agent({
|
|
25
|
+
id: channelAgent.id,
|
|
26
|
+
name: channelAgent.name,
|
|
27
|
+
email: channelAgent.email,
|
|
28
|
+
photoURL: channelAgent.photoURL,
|
|
29
|
+
zuid: channelAgent.zuid,
|
|
30
|
+
type: channelAgent.type,
|
|
31
|
+
firstName: null,
|
|
32
|
+
lastName: null,
|
|
33
|
+
status: null,
|
|
34
|
+
role: null
|
|
35
|
+
}).toJSON();
|
|
36
|
+
return {
|
|
37
|
+
id,
|
|
38
|
+
name,
|
|
39
|
+
email,
|
|
40
|
+
photoURL,
|
|
41
|
+
zuid,
|
|
42
|
+
type
|
|
43
|
+
};
|
|
44
|
+
} catch (error) {
|
|
45
|
+
throw new AdapterError(`Failed to adapt channel agent: ${error.message}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { AdapterError } from "../../../core/errors";
|
|
2
|
+
import { Contact } from "../../../domain/entities";
|
|
3
|
+
import { IAdapter } from "../../../domain/interfaces";
|
|
4
|
+
export default class ContactAdapter extends IAdapter {
|
|
5
|
+
adapt(contactData) {
|
|
6
|
+
if (!contactData) {
|
|
7
|
+
throw new AdapterError('Contact data is required');
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
return new Contact({
|
|
12
|
+
id: contactData.id,
|
|
13
|
+
name: contactData.name,
|
|
14
|
+
photoURL: contactData.photoURL,
|
|
15
|
+
email: contactData.email,
|
|
16
|
+
mobile: contactData.mobile,
|
|
17
|
+
phone: contactData.phone
|
|
18
|
+
}).toJSON();
|
|
19
|
+
} catch (error) {
|
|
20
|
+
throw new AdapterError(`Failed to adapt Contact: ${error.message}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { AdapterError } from "../../../core/errors";
|
|
2
|
+
import { Message } from "../../../domain/entities";
|
|
3
|
+
import { IAdapter } from "../../../domain/interfaces";
|
|
4
|
+
export default class MessageAdapter extends IAdapter {
|
|
5
|
+
adapt(messageData) {
|
|
6
|
+
if (!messageData) {
|
|
7
|
+
throw new AdapterError('Message data is required');
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
return new Message({
|
|
12
|
+
id: messageData.id,
|
|
13
|
+
sessionId: messageData.sessionId,
|
|
14
|
+
displayMessage: messageData.displayMessage,
|
|
15
|
+
statusUpdatedTime: messageData.statusUpdatedTime,
|
|
16
|
+
actor: messageData.actor,
|
|
17
|
+
direction: messageData.direction,
|
|
18
|
+
createdTime: messageData.createdTime,
|
|
19
|
+
index: messageData.index,
|
|
20
|
+
replyToMessage: messageData.replyToMessage,
|
|
21
|
+
status: messageData.status,
|
|
22
|
+
info: messageData.info,
|
|
23
|
+
location: messageData.location,
|
|
24
|
+
externalInfo: messageData.externalInfo,
|
|
25
|
+
layout: messageData.layout,
|
|
26
|
+
action: messageData.action,
|
|
27
|
+
meta: messageData.meta,
|
|
28
|
+
contentType: messageData.contentType,
|
|
29
|
+
fullContentURL: messageData.fullContentURL,
|
|
30
|
+
attachment: messageData.attachment,
|
|
31
|
+
template: messageData.template,
|
|
32
|
+
type: messageData.type,
|
|
33
|
+
isRead: messageData.isRead,
|
|
34
|
+
article: messageData.article
|
|
35
|
+
}).toJSON();
|
|
36
|
+
} catch (error) {
|
|
37
|
+
throw new AdapterError(`Failed to adapt message: ${error.message}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { AdapterError } from "../../../core/errors";
|
|
2
|
+
import { MessageWithSession } from "../../../domain/entities";
|
|
3
|
+
import { IAdapter } from "../../../domain/interfaces";
|
|
4
|
+
import { MessageAdapter, SessionAdapter } from "../index";
|
|
5
|
+
export default class MessageWithSessionAdapter extends IAdapter {
|
|
6
|
+
adapt(messageData) {
|
|
7
|
+
if (!messageData) {
|
|
8
|
+
throw new AdapterError('Message With Session data is required');
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const message = new MessageAdapter().adapt(messageData);
|
|
12
|
+
const session = new SessionAdapter().adapt(messageData.session);
|
|
13
|
+
|
|
14
|
+
try {
|
|
15
|
+
return new MessageWithSession({ ...message,
|
|
16
|
+
session
|
|
17
|
+
}).toJSON();
|
|
18
|
+
} catch (error) {
|
|
19
|
+
throw new Error(`Failed to adapt message with session: ${error.message}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { AdapterError } from "../../../core/errors";
|
|
2
|
+
import { Session } from "../../../domain/entities";
|
|
3
|
+
import { IAdapter } from "../../../domain/interfaces";
|
|
4
|
+
export default class SessionAdapter extends IAdapter {
|
|
5
|
+
adapt(sessionData) {
|
|
6
|
+
if (!sessionData) {
|
|
7
|
+
throw new AdapterError('Session data is required');
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
return new Session({
|
|
12
|
+
id: sessionData.id,
|
|
13
|
+
channelId: sessionData.channelId,
|
|
14
|
+
status: sessionData.status,
|
|
15
|
+
createdTime: sessionData.createdTime,
|
|
16
|
+
agentId: sessionData.agentId,
|
|
17
|
+
botId: sessionData.botId,
|
|
18
|
+
actor: sessionData.actor,
|
|
19
|
+
subject: sessionData.subject,
|
|
20
|
+
messagesCount: sessionData.messagesCount,
|
|
21
|
+
agentLastActiveTime: sessionData.agentLastActiveTime,
|
|
22
|
+
contactLastActiveTime: sessionData.contactLastActiveTime,
|
|
23
|
+
lastActiveTime: sessionData.lastActiveTime,
|
|
24
|
+
unreadMessagesCount: sessionData.unreadMessagesCount,
|
|
25
|
+
integrationServiceId: sessionData.integrationServiceId,
|
|
26
|
+
replyStatus: sessionData.replyStatus,
|
|
27
|
+
contactId: sessionData.contactId,
|
|
28
|
+
meta: sessionData.meta,
|
|
29
|
+
assignee: sessionData.assignee
|
|
30
|
+
}).toJSON();
|
|
31
|
+
} catch (error) {
|
|
32
|
+
throw new AdapterError(`Failed to adapt session: ${error.message}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { ResponseTypes } from "../../core/constants";
|
|
2
|
+
import { ResponseUtils } from "../../core/utils";
|
|
3
|
+
import configRegistry from "../config/configRegistry";
|
|
4
|
+
import { getRegistryConfig } from "./registry";
|
|
5
|
+
export default class BaseAPI {
|
|
6
|
+
constructor() {
|
|
7
|
+
let {
|
|
8
|
+
module,
|
|
9
|
+
configProvider = configRegistry,
|
|
10
|
+
registryProvider = {
|
|
11
|
+
getRegistryConfig
|
|
12
|
+
}
|
|
13
|
+
} = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
14
|
+
this.configProvider = configProvider;
|
|
15
|
+
this.registryProvider = registryProvider;
|
|
16
|
+
this.httpClient = this.configProvider.getHttpClient();
|
|
17
|
+
this.baseURL = this.configProvider.getBaseURL();
|
|
18
|
+
this.module = module;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
replacePathParams(url, params) {
|
|
22
|
+
let _url = url;
|
|
23
|
+
Object.entries(params).forEach(_ref => {
|
|
24
|
+
let [key, value] = _ref;
|
|
25
|
+
_url = url.replace(`:${key}`, value);
|
|
26
|
+
});
|
|
27
|
+
return _url;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
buildUrl(_ref2) {
|
|
31
|
+
let {
|
|
32
|
+
url,
|
|
33
|
+
params,
|
|
34
|
+
query
|
|
35
|
+
} = _ref2;
|
|
36
|
+
|
|
37
|
+
const _params = params || {};
|
|
38
|
+
|
|
39
|
+
const _query = query || {};
|
|
40
|
+
|
|
41
|
+
let _url = this.replacePathParams(url, _params);
|
|
42
|
+
|
|
43
|
+
if (this.baseURL) {
|
|
44
|
+
_url = `${this.baseURL}${_url}`;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const queryString = this.buildQuery(_query);
|
|
48
|
+
|
|
49
|
+
if (queryString) {
|
|
50
|
+
return `${_url}?${queryString}`;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return _url;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
buildQuery(query) {
|
|
57
|
+
const filteredQuery = Object.entries(query).filter(_ref3 => {
|
|
58
|
+
let [, value] = _ref3;
|
|
59
|
+
return value !== undefined && value !== null && value !== '';
|
|
60
|
+
}).reduce((acc, _ref4) => {
|
|
61
|
+
let [key, value] = _ref4;
|
|
62
|
+
acc[key] = value;
|
|
63
|
+
return acc;
|
|
64
|
+
}, {});
|
|
65
|
+
return Object.entries(filteredQuery).map(_ref5 => {
|
|
66
|
+
let [key, value] = _ref5;
|
|
67
|
+
return `${key}=${value}`;
|
|
68
|
+
}).join('&');
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async request(_ref6) {
|
|
72
|
+
let {
|
|
73
|
+
request,
|
|
74
|
+
operation,
|
|
75
|
+
header
|
|
76
|
+
} = _ref6;
|
|
77
|
+
const config = this.registryProvider.getRegistryConfig(this.module, operation);
|
|
78
|
+
|
|
79
|
+
if (!config) {
|
|
80
|
+
throw new Error(`Operation "${operation}" not found in registry for module "${this.module}"`);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const url = this.buildUrl({
|
|
84
|
+
url: config.endpoint,
|
|
85
|
+
params: request.params || {},
|
|
86
|
+
query: request.query || {}
|
|
87
|
+
});
|
|
88
|
+
const httpRequest = await this.httpClient.request({
|
|
89
|
+
url,
|
|
90
|
+
method: config.method,
|
|
91
|
+
header,
|
|
92
|
+
payload: request.body || {}
|
|
93
|
+
});
|
|
94
|
+
return httpRequest;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
createAPIProxy(customAPI, defaultAPI) {
|
|
98
|
+
// If no custom API provided, just use default
|
|
99
|
+
if (!customAPI) {
|
|
100
|
+
return defaultAPI;
|
|
101
|
+
} // Create a proxy for method delegation
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
return new Proxy({}, {
|
|
105
|
+
get: (target, prop) => {
|
|
106
|
+
// For methods, check if custom implementation exists
|
|
107
|
+
if (typeof prop === 'string' && typeof customAPI[prop] === 'function' && this.isMethodOverridden(customAPI, prop)) {
|
|
108
|
+
// Use custom implementation if available
|
|
109
|
+
return customAPI[prop].bind(customAPI);
|
|
110
|
+
} // Fall back to default implementation
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
return defaultAPI[prop].bind(defaultAPI);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
isMethodOverridden(customAPI, methodName) {
|
|
119
|
+
const customPrototype = Object.getPrototypeOf(customAPI);
|
|
120
|
+
return typeof customAPI[methodName] === 'function' && // Method is defined directly on custom prototype
|
|
121
|
+
Object.prototype.hasOwnProperty.call(customPrototype, methodName);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
async executeAPICall(_ref7) {
|
|
125
|
+
let {
|
|
126
|
+
operation,
|
|
127
|
+
request,
|
|
128
|
+
apiProxy,
|
|
129
|
+
customAPI,
|
|
130
|
+
adapter,
|
|
131
|
+
responseType = ResponseTypes.SINGLE
|
|
132
|
+
} = _ref7;
|
|
133
|
+
const response = await apiProxy[operation](request);
|
|
134
|
+
const isOverridden = this.isMethodOverridden(customAPI, operation);
|
|
135
|
+
|
|
136
|
+
if (isOverridden) {
|
|
137
|
+
return response;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (responseType === ResponseTypes.NONE || !adapter) {
|
|
141
|
+
return response;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return responseType === ResponseTypes.LIST ? ResponseUtils.adaptListResponse(response, adapter.adapt) : ResponseUtils.adaptSingleResponse(response, adapter.adapt);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { getAgentsRequest } from "../../../domain/dto";
|
|
2
|
+
import { IAgentRepository } from "../../../domain/interfaces/repositories";
|
|
3
|
+
export default class AgentAPI extends IAgentRepository {
|
|
4
|
+
async getAgents() {
|
|
5
|
+
let request = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getAgentsRequest();
|
|
6
|
+
const operation = 'getAgents';
|
|
7
|
+
const httpRequest = await this.request({
|
|
8
|
+
request,
|
|
9
|
+
operation
|
|
10
|
+
});
|
|
11
|
+
return httpRequest;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { getBotsRequest } from "../../../domain/dto";
|
|
2
|
+
import { IBotRepository } from "../../../domain/interfaces/repositories";
|
|
3
|
+
export default class BotAPI extends IBotRepository {
|
|
4
|
+
async getBots() {
|
|
5
|
+
let request = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getBotsRequest();
|
|
6
|
+
const operation = 'getBots';
|
|
7
|
+
const httpRequest = await this.request({
|
|
8
|
+
request,
|
|
9
|
+
operation
|
|
10
|
+
});
|
|
11
|
+
return httpRequest;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { getChannelsRequest } from "../../../domain/dto";
|
|
2
|
+
import { IChannelRepository } from "../../../domain/interfaces/repositories";
|
|
3
|
+
export default class ChannelAPI extends IChannelRepository {
|
|
4
|
+
async getChannels() {
|
|
5
|
+
let request = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getChannelsRequest();
|
|
6
|
+
const operation = 'getChannels';
|
|
7
|
+
const httpRequest = await this.request({
|
|
8
|
+
request,
|
|
9
|
+
operation
|
|
10
|
+
});
|
|
11
|
+
return httpRequest;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { getChannelAgentsRequest } from "../../../domain/dto";
|
|
2
|
+
import { IChannelAgentRepository } from "../../../domain/interfaces/repositories";
|
|
3
|
+
export default class ChannelAgentAPI extends IChannelAgentRepository {
|
|
4
|
+
async getAgents() {
|
|
5
|
+
let request = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getChannelAgentsRequest();
|
|
6
|
+
const {
|
|
7
|
+
searchStr
|
|
8
|
+
} = request.query;
|
|
9
|
+
|
|
10
|
+
if (searchStr) {
|
|
11
|
+
request.query.searchStr = `*${encodeURIComponent(searchStr)}*`;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const operation = 'getAgents';
|
|
15
|
+
const httpRequest = await this.request({
|
|
16
|
+
request,
|
|
17
|
+
operation
|
|
18
|
+
});
|
|
19
|
+
return httpRequest;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { getContactsRequest } from "../../../domain/dto";
|
|
2
|
+
import { IContactRepository } from "../../../domain/interfaces/repositories";
|
|
3
|
+
export default class ContactAPI extends IContactRepository {
|
|
4
|
+
async getContacts() {
|
|
5
|
+
let request = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getContactsRequest();
|
|
6
|
+
const operation = 'getContacts';
|
|
7
|
+
const httpRequest = await this.request({
|
|
8
|
+
request,
|
|
9
|
+
operation
|
|
10
|
+
});
|
|
11
|
+
return httpRequest;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
}
|