@app-connect/core 1.7.24 → 1.7.26
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/.env.test +5 -5
- package/README.md +441 -441
- package/connector/developerPortal.js +31 -42
- package/connector/mock.js +84 -77
- package/connector/proxy/engine.js +164 -163
- package/connector/proxy/index.js +500 -500
- package/connector/registry.js +252 -252
- package/docs/README.md +50 -50
- package/docs/architecture.md +93 -93
- package/docs/connectors.md +116 -117
- package/docs/handlers.md +125 -125
- package/docs/libraries.md +101 -101
- package/docs/models.md +144 -144
- package/docs/routes.md +115 -115
- package/docs/tests.md +73 -73
- package/handlers/admin.js +523 -523
- package/handlers/appointment.js +193 -0
- package/handlers/auth.js +296 -296
- package/handlers/calldown.js +99 -99
- package/handlers/contact.js +280 -280
- package/handlers/disposition.js +82 -80
- package/handlers/log.js +984 -973
- package/handlers/managedAuth.js +446 -446
- package/handlers/plugin.js +208 -208
- package/handlers/user.js +142 -142
- package/index.js +3140 -2652
- package/jest.config.js +56 -56
- package/lib/analytics.js +54 -54
- package/lib/authSession.js +109 -109
- package/lib/cacheCleanup.js +21 -0
- package/lib/callLogComposer.js +898 -898
- package/lib/callLogLookup.js +34 -0
- package/lib/constants.js +8 -8
- package/lib/debugTracer.js +177 -177
- package/lib/encode.js +30 -30
- package/lib/errorHandler.js +218 -206
- package/lib/generalErrorMessage.js +41 -41
- package/lib/jwt.js +18 -18
- package/lib/logger.js +190 -190
- package/lib/migrateCallLogsSchema.js +116 -0
- package/lib/ringcentral.js +266 -266
- package/lib/s3ErrorLogReport.js +65 -65
- package/lib/sharedSMSComposer.js +471 -471
- package/lib/util.js +67 -67
- package/mcp/README.md +412 -395
- package/mcp/lib/validator.js +91 -91
- package/mcp/mcpHandler.js +425 -425
- package/mcp/tools/cancelAppointment.js +101 -0
- package/mcp/tools/checkAuthStatus.js +105 -105
- package/mcp/tools/confirmAppointment.js +101 -0
- package/mcp/tools/createAppointment.js +157 -0
- package/mcp/tools/createCallLog.js +327 -316
- package/mcp/tools/createContact.js +117 -117
- package/mcp/tools/createMessageLog.js +287 -287
- package/mcp/tools/doAuth.js +60 -60
- package/mcp/tools/findContactByName.js +93 -93
- package/mcp/tools/findContactByPhone.js +101 -101
- package/mcp/tools/getCallLog.js +111 -102
- package/mcp/tools/getGoogleFilePicker.js +99 -99
- package/mcp/tools/getHelp.js +43 -43
- package/mcp/tools/getPublicConnectors.js +94 -94
- package/mcp/tools/getSessionInfo.js +90 -90
- package/mcp/tools/index.js +51 -41
- package/mcp/tools/listAppointments.js +163 -0
- package/mcp/tools/logout.js +96 -96
- package/mcp/tools/rcGetCallLogs.js +65 -65
- package/mcp/tools/updateAppointment.js +154 -0
- package/mcp/tools/updateCallLog.js +130 -126
- package/mcp/ui/App/App.tsx +358 -358
- package/mcp/ui/App/components/AuthInfoForm.tsx +113 -113
- package/mcp/ui/App/components/AuthSuccess.tsx +22 -22
- package/mcp/ui/App/components/ConnectorList.tsx +82 -82
- package/mcp/ui/App/components/DebugPanel.tsx +43 -43
- package/mcp/ui/App/components/OAuthConnect.tsx +270 -270
- package/mcp/ui/App/lib/callTool.ts +130 -130
- package/mcp/ui/App/lib/debugLog.ts +41 -41
- package/mcp/ui/App/lib/developerPortal.ts +111 -111
- package/mcp/ui/App/main.css +5 -5
- package/mcp/ui/App/root.tsx +13 -13
- package/mcp/ui/index.html +13 -13
- package/mcp/ui/package-lock.json +6356 -6356
- package/mcp/ui/package.json +25 -25
- package/mcp/ui/tsconfig.json +26 -26
- package/mcp/ui/vite.config.ts +16 -16
- package/models/accountDataModel.js +33 -33
- package/models/adminConfigModel.js +35 -35
- package/models/cacheModel.js +30 -26
- package/models/callDownListModel.js +34 -34
- package/models/callLogModel.js +33 -27
- package/models/dynamo/connectorSchema.js +146 -146
- package/models/dynamo/lockSchema.js +24 -24
- package/models/dynamo/noteCacheSchema.js +29 -29
- package/models/llmSessionModel.js +17 -17
- package/models/messageLogModel.js +25 -25
- package/models/sequelize.js +16 -16
- package/models/userModel.js +45 -45
- package/package.json +72 -72
- package/releaseNotes.json +1093 -1073
- package/test/connector/proxy/engine.test.js +126 -93
- package/test/connector/proxy/index.test.js +279 -279
- package/test/connector/proxy/sample.json +161 -161
- package/test/connector/registry.test.js +415 -415
- package/test/handlers/admin.test.js +616 -616
- package/test/handlers/auth.test.js +1018 -1015
- package/test/handlers/contact.test.js +1014 -1014
- package/test/handlers/log.test.js +1298 -1160
- package/test/handlers/managedAuth.test.js +458 -458
- package/test/handlers/plugin.test.js +380 -380
- package/test/index.test.js +105 -105
- package/test/lib/cacheCleanup.test.js +42 -0
- package/test/lib/callLogComposer.test.js +1231 -1231
- package/test/lib/debugTracer.test.js +328 -328
- package/test/lib/jwt.test.js +176 -176
- package/test/lib/logger.test.js +206 -206
- package/test/lib/oauth.test.js +359 -359
- package/test/lib/ringcentral.test.js +467 -467
- package/test/lib/sharedSMSComposer.test.js +1084 -1084
- package/test/lib/util.test.js +329 -329
- package/test/mcp/tools/checkAuthStatus.test.js +83 -82
- package/test/mcp/tools/createCallLog.test.js +436 -436
- package/test/mcp/tools/createContact.test.js +58 -58
- package/test/mcp/tools/createMessageLog.test.js +595 -595
- package/test/mcp/tools/doAuth.test.js +113 -113
- package/test/mcp/tools/findContactByName.test.js +275 -275
- package/test/mcp/tools/findContactByPhone.test.js +296 -296
- package/test/mcp/tools/getCallLog.test.js +298 -298
- package/test/mcp/tools/getGoogleFilePicker.test.js +281 -281
- package/test/mcp/tools/getPublicConnectors.test.js +107 -107
- package/test/mcp/tools/getSessionInfo.test.js +127 -127
- package/test/mcp/tools/logout.test.js +233 -233
- package/test/mcp/tools/rcGetCallLogs.test.js +56 -56
- package/test/mcp/tools/updateCallLog.test.js +360 -360
- package/test/models/accountDataModel.test.js +98 -98
- package/test/models/dynamo/connectorSchema.test.js +189 -189
- package/test/models/models.test.js +568 -539
- package/test/routes/managedAuthRoutes.test.js +104 -129
- package/test/setup.js +178 -178
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
const { UserModel } = require('../models/userModel');
|
|
2
|
+
const oauth = require('../lib/oauth');
|
|
3
|
+
const connectorRegistry = require('../connector/registry');
|
|
4
|
+
const { Connector } = require('../models/dynamo/connectorSchema');
|
|
5
|
+
const { handleApiError, handleDatabaseError } = require('../lib/errorHandler');
|
|
6
|
+
|
|
7
|
+
async function resolveAuth({ platform, userId }) {
|
|
8
|
+
let user = null;
|
|
9
|
+
try {
|
|
10
|
+
user = await UserModel.findByPk(userId);
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
return handleDatabaseError(error, 'Error finding user');
|
|
14
|
+
}
|
|
15
|
+
if (!user || !user.accessToken) {
|
|
16
|
+
return {
|
|
17
|
+
successful: false,
|
|
18
|
+
returnMessage: {
|
|
19
|
+
message: 'User not found',
|
|
20
|
+
messageType: 'warning',
|
|
21
|
+
ttl: 5000
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const platformModule = connectorRegistry.getConnector(platform);
|
|
27
|
+
const proxyId = user.platformAdditionalInfo?.proxyId;
|
|
28
|
+
let proxyConfig = null;
|
|
29
|
+
if (proxyId) {
|
|
30
|
+
proxyConfig = await Connector.getProxyConfig(proxyId);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const authType = await platformModule.getAuthType({ proxyId, proxyConfig });
|
|
34
|
+
let authHeader = '';
|
|
35
|
+
switch (authType) {
|
|
36
|
+
case 'oauth': {
|
|
37
|
+
const oauthApp = oauth.getOAuthApp((await platformModule.getOauthInfo({
|
|
38
|
+
tokenUrl: user?.platformAdditionalInfo?.tokenUrl,
|
|
39
|
+
hostname: user?.hostname,
|
|
40
|
+
proxyId,
|
|
41
|
+
proxyConfig
|
|
42
|
+
})));
|
|
43
|
+
user = await oauth.checkAndRefreshAccessToken(oauthApp, user);
|
|
44
|
+
if (!user) {
|
|
45
|
+
return {
|
|
46
|
+
successful: false,
|
|
47
|
+
returnMessage: {
|
|
48
|
+
message: 'User session expired. Please connect again.',
|
|
49
|
+
messageType: 'warning',
|
|
50
|
+
ttl: 5000
|
|
51
|
+
},
|
|
52
|
+
isRevokeUserSession: true
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
authHeader = `Bearer ${user.accessToken}`;
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
case 'apiKey': {
|
|
59
|
+
const basicAuth = platformModule.getBasicAuth({ apiKey: user.accessToken });
|
|
60
|
+
authHeader = `Basic ${basicAuth}`;
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
default:
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
successful: true,
|
|
69
|
+
user,
|
|
70
|
+
platformModule,
|
|
71
|
+
authHeader,
|
|
72
|
+
proxyConfig
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async function listAppointments({ platform, userId, range, mineOnly, forceSync }) {
|
|
77
|
+
try {
|
|
78
|
+
const authResult = await resolveAuth({ platform, userId });
|
|
79
|
+
if (!authResult.successful) return authResult;
|
|
80
|
+
|
|
81
|
+
const result = await authResult.platformModule.listAppointments({
|
|
82
|
+
user: authResult.user,
|
|
83
|
+
authHeader: authResult.authHeader,
|
|
84
|
+
range,
|
|
85
|
+
mineOnly,
|
|
86
|
+
forceSync,
|
|
87
|
+
proxyConfig: authResult.proxyConfig
|
|
88
|
+
});
|
|
89
|
+
return { successful: true, ...result };
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
return handleApiError(e, platform, 'listAppointments', { userId });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async function createAppointment({ platform, userId, payload }) {
|
|
97
|
+
try {
|
|
98
|
+
const authResult = await resolveAuth({ platform, userId });
|
|
99
|
+
if (!authResult.successful) return authResult;
|
|
100
|
+
|
|
101
|
+
const result = await authResult.platformModule.createAppointment({
|
|
102
|
+
user: authResult.user,
|
|
103
|
+
authHeader: authResult.authHeader,
|
|
104
|
+
payload,
|
|
105
|
+
proxyConfig: authResult.proxyConfig
|
|
106
|
+
});
|
|
107
|
+
return { successful: true, ...result };
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
return handleApiError(e, platform, 'createAppointment', { userId });
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async function updateAppointment({ platform, userId, appointmentId, patchBody }) {
|
|
115
|
+
try {
|
|
116
|
+
const authResult = await resolveAuth({ platform, userId });
|
|
117
|
+
if (!authResult.successful) return authResult;
|
|
118
|
+
|
|
119
|
+
const result = await authResult.platformModule.updateAppointment({
|
|
120
|
+
user: authResult.user,
|
|
121
|
+
authHeader: authResult.authHeader,
|
|
122
|
+
appointmentId,
|
|
123
|
+
patchBody,
|
|
124
|
+
proxyConfig: authResult.proxyConfig
|
|
125
|
+
});
|
|
126
|
+
return { successful: true, ...result };
|
|
127
|
+
}
|
|
128
|
+
catch (e) {
|
|
129
|
+
return handleApiError(e, platform, 'updateAppointment', { userId, appointmentId });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
async function refreshAppointment({ platform, userId, appointmentId }) {
|
|
134
|
+
try {
|
|
135
|
+
const authResult = await resolveAuth({ platform, userId });
|
|
136
|
+
if (!authResult.successful) return authResult;
|
|
137
|
+
|
|
138
|
+
const result = await authResult.platformModule.refreshAppointment({
|
|
139
|
+
user: authResult.user,
|
|
140
|
+
authHeader: authResult.authHeader,
|
|
141
|
+
appointmentId,
|
|
142
|
+
proxyConfig: authResult.proxyConfig
|
|
143
|
+
});
|
|
144
|
+
return { successful: true, ...result };
|
|
145
|
+
}
|
|
146
|
+
catch (e) {
|
|
147
|
+
return handleApiError(e, platform, 'refreshAppointment', { userId, appointmentId });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
async function confirmAppointment({ platform, userId, appointmentId }) {
|
|
152
|
+
try {
|
|
153
|
+
const authResult = await resolveAuth({ platform, userId });
|
|
154
|
+
if (!authResult.successful) return authResult;
|
|
155
|
+
|
|
156
|
+
const result = await authResult.platformModule.confirmAppointment({
|
|
157
|
+
user: authResult.user,
|
|
158
|
+
authHeader: authResult.authHeader,
|
|
159
|
+
appointmentId,
|
|
160
|
+
proxyConfig: authResult.proxyConfig
|
|
161
|
+
});
|
|
162
|
+
return { successful: true, ...result };
|
|
163
|
+
}
|
|
164
|
+
catch (e) {
|
|
165
|
+
return handleApiError(e, platform, 'confirmAppointment', { userId, appointmentId });
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
async function cancelAppointment({ platform, userId, appointmentId }) {
|
|
170
|
+
try {
|
|
171
|
+
const authResult = await resolveAuth({ platform, userId });
|
|
172
|
+
if (!authResult.successful) return authResult;
|
|
173
|
+
|
|
174
|
+
const result = await authResult.platformModule.cancelAppointment({
|
|
175
|
+
user: authResult.user,
|
|
176
|
+
authHeader: authResult.authHeader,
|
|
177
|
+
appointmentId,
|
|
178
|
+
proxyConfig: authResult.proxyConfig
|
|
179
|
+
});
|
|
180
|
+
return { successful: true, ...result };
|
|
181
|
+
}
|
|
182
|
+
catch (e) {
|
|
183
|
+
return handleApiError(e, platform, 'cancelAppointment', { userId, appointmentId });
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
exports.listAppointments = listAppointments;
|
|
188
|
+
exports.createAppointment = createAppointment;
|
|
189
|
+
exports.updateAppointment = updateAppointment;
|
|
190
|
+
exports.refreshAppointment = refreshAppointment;
|
|
191
|
+
exports.confirmAppointment = confirmAppointment;
|
|
192
|
+
exports.cancelAppointment = cancelAppointment;
|
|
193
|
+
|