@app-connect/core 1.7.25 → 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 -31
- package/connector/mock.js +84 -77
- package/connector/proxy/engine.js +164 -164
- 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 -116
- 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 +1 -1
- package/releaseNotes.json +1093 -1081
- package/test/connector/proxy/engine.test.js +126 -126
- 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 -1018
- package/test/handlers/contact.test.js +1014 -1014
- package/test/handlers/log.test.js +1298 -1160
- package/test/handlers/managedAuth.test.js +457 -457
- 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 -83
- 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 -104
- package/test/setup.js +178 -178
|
@@ -1,146 +1,146 @@
|
|
|
1
|
-
const dynamoose = require('dynamoose');
|
|
2
|
-
const crypto = require('crypto');
|
|
3
|
-
|
|
4
|
-
const CONNECTOR_STATUS = {
|
|
5
|
-
PRIVATE: 'private',
|
|
6
|
-
UNDER_REVIEW: 'under_review',
|
|
7
|
-
APPROVED: 'approved',
|
|
8
|
-
REJECTED: 'rejected',
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
const connectorSchema = new dynamoose.Schema({
|
|
12
|
-
accountId: {
|
|
13
|
-
type: String,
|
|
14
|
-
hashKey: true,
|
|
15
|
-
},
|
|
16
|
-
id: {
|
|
17
|
-
type: String,
|
|
18
|
-
rangeKey: true,
|
|
19
|
-
},
|
|
20
|
-
// Reference to original connector (for partition records)
|
|
21
|
-
originalAccountId: {
|
|
22
|
-
type: String,
|
|
23
|
-
required: false, // Only set for partition records (under_review, approved)
|
|
24
|
-
},
|
|
25
|
-
// Basic Information
|
|
26
|
-
name: {
|
|
27
|
-
type: String,
|
|
28
|
-
required: true,
|
|
29
|
-
},
|
|
30
|
-
displayName: String,
|
|
31
|
-
description: String,
|
|
32
|
-
iconUrl: String,
|
|
33
|
-
// Status and Workflow
|
|
34
|
-
status: {
|
|
35
|
-
type: String,
|
|
36
|
-
required: true,
|
|
37
|
-
enum: Object.values(CONNECTOR_STATUS),
|
|
38
|
-
default: CONNECTOR_STATUS.PRIVATE,
|
|
39
|
-
index: {
|
|
40
|
-
name: 'statusIdIndex',
|
|
41
|
-
global: true,
|
|
42
|
-
rangeKey: 'id',
|
|
43
|
-
project: ['accountId', 'name', 'displayName', 'developer', 'originalAccountId'],
|
|
44
|
-
},
|
|
45
|
-
},
|
|
46
|
-
creatorId: String,
|
|
47
|
-
// Developer Information
|
|
48
|
-
developer: {
|
|
49
|
-
type: Object,
|
|
50
|
-
schema: {
|
|
51
|
-
name: String,
|
|
52
|
-
websiteUrl: String,
|
|
53
|
-
supportUrl: String,
|
|
54
|
-
},
|
|
55
|
-
},
|
|
56
|
-
// Manifest Management
|
|
57
|
-
manifest: {
|
|
58
|
-
type: Object,
|
|
59
|
-
required: true,
|
|
60
|
-
},
|
|
61
|
-
proxyConfig: {
|
|
62
|
-
type: Object,
|
|
63
|
-
required: false,
|
|
64
|
-
},
|
|
65
|
-
proxyId: {
|
|
66
|
-
type: String,
|
|
67
|
-
index: {
|
|
68
|
-
name: 'proxyIdIndex',
|
|
69
|
-
global: true,
|
|
70
|
-
project: ['id', 'accountId', 'creatorId', 'name', 'displayName', 'status', 'developer', 'originalAccountId', 'proxyConfig'],
|
|
71
|
-
}
|
|
72
|
-
},
|
|
73
|
-
// Review and Approval
|
|
74
|
-
submittedAt: Number,
|
|
75
|
-
reviewedBy: String,
|
|
76
|
-
reviewedAt: Number,
|
|
77
|
-
reviewNotes: String,
|
|
78
|
-
rejectionReason: String,
|
|
79
|
-
demoAccounts: String,
|
|
80
|
-
// Usage and Analytics
|
|
81
|
-
usageCount: {
|
|
82
|
-
type: Number,
|
|
83
|
-
default: 0,
|
|
84
|
-
},
|
|
85
|
-
lastUsedAt: Number,
|
|
86
|
-
allowedAccounts: {
|
|
87
|
-
type: Array,
|
|
88
|
-
schema: [String],
|
|
89
|
-
},
|
|
90
|
-
encodedSecretKey: String,
|
|
91
|
-
}, {
|
|
92
|
-
saveUnknown: ['manifest.**', 'proxyConfig.**'],
|
|
93
|
-
timestamps: true,
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
const tableOptions = {
|
|
97
|
-
prefix: process.env.DEVELOPER_DYNAMODB_TABLE_PREFIX,
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
if (process.env.NODE_ENV === 'production') {
|
|
101
|
-
tableOptions.create = false;
|
|
102
|
-
tableOptions.waitForActive = false;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
const Connector = dynamoose.model('connectors', connectorSchema, tableOptions);
|
|
106
|
-
|
|
107
|
-
function getDeveloperCipherKey() {
|
|
108
|
-
if (!process.env.DEVELOPER_APP_SERVER_SECRET_KEY) {
|
|
109
|
-
throw new Error('DEVELOPER_APP_SERVER_SECRET_KEY is not defined');
|
|
110
|
-
}
|
|
111
|
-
if (process.env.DEVELOPER_APP_SERVER_SECRET_KEY.length < 32) {
|
|
112
|
-
// pad secret key with spaces if it is less than 32 bytes
|
|
113
|
-
return process.env.DEVELOPER_APP_SERVER_SECRET_KEY.padEnd(32, ' ');
|
|
114
|
-
}
|
|
115
|
-
if (process.env.DEVELOPER_APP_SERVER_SECRET_KEY.length > 32) {
|
|
116
|
-
// truncate secret key if it is more than 32 bytes
|
|
117
|
-
return process.env.DEVELOPER_APP_SERVER_SECRET_KEY.slice(0, 32);
|
|
118
|
-
}
|
|
119
|
-
return process.env.DEVELOPER_APP_SERVER_SECRET_KEY;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
function decode(encryptedData) {
|
|
123
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', getDeveloperCipherKey(), Buffer.alloc(16, 0));
|
|
124
|
-
return decipher.update(encryptedData, 'hex', 'utf8') + decipher.final('utf8');
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// ADD static method to get connector by proxyId
|
|
128
|
-
Connector.getProxyConfig = async (proxyId) => {
|
|
129
|
-
const connectors = await Connector
|
|
130
|
-
.query('proxyId')
|
|
131
|
-
.eq(proxyId)
|
|
132
|
-
.using('proxyIdIndex')
|
|
133
|
-
.exec();
|
|
134
|
-
if (connectors.length > 0) {
|
|
135
|
-
const proxyConfig = connectors[0].proxyConfig;
|
|
136
|
-
const encodedSecretKey = connectors[0].encodedSecretKey;
|
|
137
|
-
const secretKey = encodedSecretKey ? decode(encodedSecretKey) : null;
|
|
138
|
-
if (secretKey) {
|
|
139
|
-
proxyConfig.secretKey = secretKey;
|
|
140
|
-
}
|
|
141
|
-
return proxyConfig;
|
|
142
|
-
}
|
|
143
|
-
return null;
|
|
144
|
-
};
|
|
145
|
-
|
|
146
|
-
exports.Connector = Connector;
|
|
1
|
+
const dynamoose = require('dynamoose');
|
|
2
|
+
const crypto = require('crypto');
|
|
3
|
+
|
|
4
|
+
const CONNECTOR_STATUS = {
|
|
5
|
+
PRIVATE: 'private',
|
|
6
|
+
UNDER_REVIEW: 'under_review',
|
|
7
|
+
APPROVED: 'approved',
|
|
8
|
+
REJECTED: 'rejected',
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
const connectorSchema = new dynamoose.Schema({
|
|
12
|
+
accountId: {
|
|
13
|
+
type: String,
|
|
14
|
+
hashKey: true,
|
|
15
|
+
},
|
|
16
|
+
id: {
|
|
17
|
+
type: String,
|
|
18
|
+
rangeKey: true,
|
|
19
|
+
},
|
|
20
|
+
// Reference to original connector (for partition records)
|
|
21
|
+
originalAccountId: {
|
|
22
|
+
type: String,
|
|
23
|
+
required: false, // Only set for partition records (under_review, approved)
|
|
24
|
+
},
|
|
25
|
+
// Basic Information
|
|
26
|
+
name: {
|
|
27
|
+
type: String,
|
|
28
|
+
required: true,
|
|
29
|
+
},
|
|
30
|
+
displayName: String,
|
|
31
|
+
description: String,
|
|
32
|
+
iconUrl: String,
|
|
33
|
+
// Status and Workflow
|
|
34
|
+
status: {
|
|
35
|
+
type: String,
|
|
36
|
+
required: true,
|
|
37
|
+
enum: Object.values(CONNECTOR_STATUS),
|
|
38
|
+
default: CONNECTOR_STATUS.PRIVATE,
|
|
39
|
+
index: {
|
|
40
|
+
name: 'statusIdIndex',
|
|
41
|
+
global: true,
|
|
42
|
+
rangeKey: 'id',
|
|
43
|
+
project: ['accountId', 'name', 'displayName', 'developer', 'originalAccountId'],
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
creatorId: String,
|
|
47
|
+
// Developer Information
|
|
48
|
+
developer: {
|
|
49
|
+
type: Object,
|
|
50
|
+
schema: {
|
|
51
|
+
name: String,
|
|
52
|
+
websiteUrl: String,
|
|
53
|
+
supportUrl: String,
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
// Manifest Management
|
|
57
|
+
manifest: {
|
|
58
|
+
type: Object,
|
|
59
|
+
required: true,
|
|
60
|
+
},
|
|
61
|
+
proxyConfig: {
|
|
62
|
+
type: Object,
|
|
63
|
+
required: false,
|
|
64
|
+
},
|
|
65
|
+
proxyId: {
|
|
66
|
+
type: String,
|
|
67
|
+
index: {
|
|
68
|
+
name: 'proxyIdIndex',
|
|
69
|
+
global: true,
|
|
70
|
+
project: ['id', 'accountId', 'creatorId', 'name', 'displayName', 'status', 'developer', 'originalAccountId', 'proxyConfig'],
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
// Review and Approval
|
|
74
|
+
submittedAt: Number,
|
|
75
|
+
reviewedBy: String,
|
|
76
|
+
reviewedAt: Number,
|
|
77
|
+
reviewNotes: String,
|
|
78
|
+
rejectionReason: String,
|
|
79
|
+
demoAccounts: String,
|
|
80
|
+
// Usage and Analytics
|
|
81
|
+
usageCount: {
|
|
82
|
+
type: Number,
|
|
83
|
+
default: 0,
|
|
84
|
+
},
|
|
85
|
+
lastUsedAt: Number,
|
|
86
|
+
allowedAccounts: {
|
|
87
|
+
type: Array,
|
|
88
|
+
schema: [String],
|
|
89
|
+
},
|
|
90
|
+
encodedSecretKey: String,
|
|
91
|
+
}, {
|
|
92
|
+
saveUnknown: ['manifest.**', 'proxyConfig.**'],
|
|
93
|
+
timestamps: true,
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
const tableOptions = {
|
|
97
|
+
prefix: process.env.DEVELOPER_DYNAMODB_TABLE_PREFIX,
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
if (process.env.NODE_ENV === 'production') {
|
|
101
|
+
tableOptions.create = false;
|
|
102
|
+
tableOptions.waitForActive = false;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const Connector = dynamoose.model('connectors', connectorSchema, tableOptions);
|
|
106
|
+
|
|
107
|
+
function getDeveloperCipherKey() {
|
|
108
|
+
if (!process.env.DEVELOPER_APP_SERVER_SECRET_KEY) {
|
|
109
|
+
throw new Error('DEVELOPER_APP_SERVER_SECRET_KEY is not defined');
|
|
110
|
+
}
|
|
111
|
+
if (process.env.DEVELOPER_APP_SERVER_SECRET_KEY.length < 32) {
|
|
112
|
+
// pad secret key with spaces if it is less than 32 bytes
|
|
113
|
+
return process.env.DEVELOPER_APP_SERVER_SECRET_KEY.padEnd(32, ' ');
|
|
114
|
+
}
|
|
115
|
+
if (process.env.DEVELOPER_APP_SERVER_SECRET_KEY.length > 32) {
|
|
116
|
+
// truncate secret key if it is more than 32 bytes
|
|
117
|
+
return process.env.DEVELOPER_APP_SERVER_SECRET_KEY.slice(0, 32);
|
|
118
|
+
}
|
|
119
|
+
return process.env.DEVELOPER_APP_SERVER_SECRET_KEY;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function decode(encryptedData) {
|
|
123
|
+
const decipher = crypto.createDecipheriv('aes-256-cbc', getDeveloperCipherKey(), Buffer.alloc(16, 0));
|
|
124
|
+
return decipher.update(encryptedData, 'hex', 'utf8') + decipher.final('utf8');
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// ADD static method to get connector by proxyId
|
|
128
|
+
Connector.getProxyConfig = async (proxyId) => {
|
|
129
|
+
const connectors = await Connector
|
|
130
|
+
.query('proxyId')
|
|
131
|
+
.eq(proxyId)
|
|
132
|
+
.using('proxyIdIndex')
|
|
133
|
+
.exec();
|
|
134
|
+
if (connectors.length > 0) {
|
|
135
|
+
const proxyConfig = connectors[0].proxyConfig;
|
|
136
|
+
const encodedSecretKey = connectors[0].encodedSecretKey;
|
|
137
|
+
const secretKey = encodedSecretKey ? decode(encodedSecretKey) : null;
|
|
138
|
+
if (secretKey) {
|
|
139
|
+
proxyConfig.secretKey = secretKey;
|
|
140
|
+
}
|
|
141
|
+
return proxyConfig;
|
|
142
|
+
}
|
|
143
|
+
return null;
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
exports.Connector = Connector;
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
const dynamoose = require('dynamoose');
|
|
2
|
-
|
|
3
|
-
const lockSchema = new dynamoose.Schema({
|
|
4
|
-
userId: {
|
|
5
|
-
type: String,
|
|
6
|
-
hashKey: true
|
|
7
|
-
},
|
|
8
|
-
ttl: {
|
|
9
|
-
type: Number
|
|
10
|
-
}
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
const tableOptions = {
|
|
14
|
-
prefix: process.env.DYNAMODB_TABLE_PREFIX,
|
|
15
|
-
expires: 60 // 60 seconds
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
if (process.env.NODE_ENV === 'production') {
|
|
19
|
-
tableOptions.create = false;
|
|
20
|
-
tableOptions.waitForActive = false;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const Lock = dynamoose.model('-token-refresh-lock', lockSchema, tableOptions);
|
|
24
|
-
|
|
1
|
+
const dynamoose = require('dynamoose');
|
|
2
|
+
|
|
3
|
+
const lockSchema = new dynamoose.Schema({
|
|
4
|
+
userId: {
|
|
5
|
+
type: String,
|
|
6
|
+
hashKey: true
|
|
7
|
+
},
|
|
8
|
+
ttl: {
|
|
9
|
+
type: Number
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
const tableOptions = {
|
|
14
|
+
prefix: process.env.DYNAMODB_TABLE_PREFIX,
|
|
15
|
+
expires: 60 // 60 seconds
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
if (process.env.NODE_ENV === 'production') {
|
|
19
|
+
tableOptions.create = false;
|
|
20
|
+
tableOptions.waitForActive = false;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const Lock = dynamoose.model('-token-refresh-lock', lockSchema, tableOptions);
|
|
24
|
+
|
|
25
25
|
exports.Lock = Lock;
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
const dynamoose = require('dynamoose');
|
|
2
|
-
|
|
3
|
-
const noteCacheSchema = new dynamoose.Schema({
|
|
4
|
-
sessionId: {
|
|
5
|
-
type: String,
|
|
6
|
-
hashKey: true,
|
|
7
|
-
},
|
|
8
|
-
note: {
|
|
9
|
-
type: String,
|
|
10
|
-
required: true,
|
|
11
|
-
},
|
|
12
|
-
ttl: {
|
|
13
|
-
type: Number,
|
|
14
|
-
required: true,
|
|
15
|
-
},
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
const tableOptions = {
|
|
19
|
-
prefix: process.env.DYNAMODB_TABLE_PREFIX,
|
|
20
|
-
expires: 60 // 60 seconds
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
if (process.env.NODE_ENV === 'production') {
|
|
24
|
-
tableOptions.create = false;
|
|
25
|
-
tableOptions.waitForActive = false;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const NoteCache = dynamoose.model('-note-cache', noteCacheSchema, tableOptions);
|
|
29
|
-
|
|
1
|
+
const dynamoose = require('dynamoose');
|
|
2
|
+
|
|
3
|
+
const noteCacheSchema = new dynamoose.Schema({
|
|
4
|
+
sessionId: {
|
|
5
|
+
type: String,
|
|
6
|
+
hashKey: true,
|
|
7
|
+
},
|
|
8
|
+
note: {
|
|
9
|
+
type: String,
|
|
10
|
+
required: true,
|
|
11
|
+
},
|
|
12
|
+
ttl: {
|
|
13
|
+
type: Number,
|
|
14
|
+
required: true,
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
const tableOptions = {
|
|
19
|
+
prefix: process.env.DYNAMODB_TABLE_PREFIX,
|
|
20
|
+
expires: 60 // 60 seconds
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
if (process.env.NODE_ENV === 'production') {
|
|
24
|
+
tableOptions.create = false;
|
|
25
|
+
tableOptions.waitForActive = false;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const NoteCache = dynamoose.model('-note-cache', noteCacheSchema, tableOptions);
|
|
29
|
+
|
|
30
30
|
exports.NoteCache = NoteCache;
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
const Sequelize = require('sequelize');
|
|
2
|
-
const { sequelize } = require('./sequelize');
|
|
3
|
-
|
|
4
|
-
// Model for Admin data
|
|
5
|
-
exports.LlmSessionModel = sequelize.define('llmSessions', {
|
|
6
|
-
// LLM session ID
|
|
7
|
-
id: {
|
|
8
|
-
type: Sequelize.STRING,
|
|
9
|
-
primaryKey: true,
|
|
10
|
-
},
|
|
11
|
-
jwtToken: {
|
|
12
|
-
type: Sequelize.STRING,
|
|
13
|
-
},
|
|
14
|
-
expiry: {
|
|
15
|
-
type: Sequelize.DATE
|
|
16
|
-
}
|
|
17
|
-
});
|
|
1
|
+
const Sequelize = require('sequelize');
|
|
2
|
+
const { sequelize } = require('./sequelize');
|
|
3
|
+
|
|
4
|
+
// Model for Admin data
|
|
5
|
+
exports.LlmSessionModel = sequelize.define('llmSessions', {
|
|
6
|
+
// LLM session ID
|
|
7
|
+
id: {
|
|
8
|
+
type: Sequelize.STRING,
|
|
9
|
+
primaryKey: true,
|
|
10
|
+
},
|
|
11
|
+
jwtToken: {
|
|
12
|
+
type: Sequelize.STRING,
|
|
13
|
+
},
|
|
14
|
+
expiry: {
|
|
15
|
+
type: Sequelize.DATE
|
|
16
|
+
}
|
|
17
|
+
});
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
const Sequelize = require('sequelize');
|
|
2
|
-
const { sequelize } = require('./sequelize');
|
|
3
|
-
|
|
4
|
-
// Model for User data
|
|
5
|
-
exports.MessageLogModel = sequelize.define('messageLogs', {
|
|
6
|
-
id: {
|
|
7
|
-
type: Sequelize.STRING,
|
|
8
|
-
primaryKey: true,
|
|
9
|
-
},
|
|
10
|
-
platform: {
|
|
11
|
-
type: Sequelize.STRING,
|
|
12
|
-
},
|
|
13
|
-
conversationId: {
|
|
14
|
-
type: Sequelize.STRING,
|
|
15
|
-
},
|
|
16
|
-
conversationLogId:{
|
|
17
|
-
type: Sequelize.STRING,
|
|
18
|
-
},
|
|
19
|
-
thirdPartyLogId: {
|
|
20
|
-
type: Sequelize.STRING,
|
|
21
|
-
},
|
|
22
|
-
userId: {
|
|
23
|
-
type: Sequelize.STRING,
|
|
24
|
-
}
|
|
25
|
-
});
|
|
1
|
+
const Sequelize = require('sequelize');
|
|
2
|
+
const { sequelize } = require('./sequelize');
|
|
3
|
+
|
|
4
|
+
// Model for User data
|
|
5
|
+
exports.MessageLogModel = sequelize.define('messageLogs', {
|
|
6
|
+
id: {
|
|
7
|
+
type: Sequelize.STRING,
|
|
8
|
+
primaryKey: true,
|
|
9
|
+
},
|
|
10
|
+
platform: {
|
|
11
|
+
type: Sequelize.STRING,
|
|
12
|
+
},
|
|
13
|
+
conversationId: {
|
|
14
|
+
type: Sequelize.STRING,
|
|
15
|
+
},
|
|
16
|
+
conversationLogId:{
|
|
17
|
+
type: Sequelize.STRING,
|
|
18
|
+
},
|
|
19
|
+
thirdPartyLogId: {
|
|
20
|
+
type: Sequelize.STRING,
|
|
21
|
+
},
|
|
22
|
+
userId: {
|
|
23
|
+
type: Sequelize.STRING,
|
|
24
|
+
}
|
|
25
|
+
});
|
package/models/sequelize.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
const { Sequelize } = require('sequelize');
|
|
2
|
-
|
|
3
|
-
const sequelize = new Sequelize(process.env.DATABASE_URL,
|
|
4
|
-
{
|
|
5
|
-
dialect: 'postgres',
|
|
6
|
-
protocol: 'postgres',
|
|
7
|
-
dialectOptions:{
|
|
8
|
-
ssl: {
|
|
9
|
-
rejectUnauthorized: false
|
|
10
|
-
}
|
|
11
|
-
},
|
|
12
|
-
logging: false
|
|
13
|
-
}
|
|
14
|
-
);
|
|
15
|
-
|
|
16
|
-
|
|
1
|
+
const { Sequelize } = require('sequelize');
|
|
2
|
+
|
|
3
|
+
const sequelize = new Sequelize(process.env.DATABASE_URL,
|
|
4
|
+
{
|
|
5
|
+
dialect: 'postgres',
|
|
6
|
+
protocol: 'postgres',
|
|
7
|
+
dialectOptions:{
|
|
8
|
+
ssl: {
|
|
9
|
+
rejectUnauthorized: false
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
logging: false
|
|
13
|
+
}
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
|
|
17
17
|
exports.sequelize = sequelize;
|
package/models/userModel.js
CHANGED
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
const Sequelize = require('sequelize');
|
|
2
|
-
const { sequelize } = require('./sequelize');
|
|
3
|
-
|
|
4
|
-
// Model for User data
|
|
5
|
-
exports.UserModel = sequelize.define('users', {
|
|
6
|
-
// id = {crmName}-{crmUserId}
|
|
7
|
-
id: {
|
|
8
|
-
type: Sequelize.STRING,
|
|
9
|
-
primaryKey: true,
|
|
10
|
-
},
|
|
11
|
-
rcAccountId: {
|
|
12
|
-
type: Sequelize.STRING,
|
|
13
|
-
},
|
|
14
|
-
hostname: {
|
|
15
|
-
type: Sequelize.STRING,
|
|
16
|
-
},
|
|
17
|
-
timezoneName: {
|
|
18
|
-
type: Sequelize.STRING,
|
|
19
|
-
},
|
|
20
|
-
timezoneOffset: {
|
|
21
|
-
type: Sequelize.STRING,
|
|
22
|
-
},
|
|
23
|
-
platform: {
|
|
24
|
-
type: Sequelize.STRING,
|
|
25
|
-
},
|
|
26
|
-
// in apiKey auth, accessToken will be API key
|
|
27
|
-
accessToken: {
|
|
28
|
-
type: Sequelize.STRING(2000),
|
|
29
|
-
},
|
|
30
|
-
refreshToken: {
|
|
31
|
-
type: Sequelize.STRING(2000),
|
|
32
|
-
},
|
|
33
|
-
tokenExpiry: {
|
|
34
|
-
type: Sequelize.DATE
|
|
35
|
-
},
|
|
36
|
-
platformAdditionalInfo: {
|
|
37
|
-
type: Sequelize.JSON
|
|
38
|
-
},
|
|
39
|
-
hashedRcExtensionId: {
|
|
40
|
-
type: Sequelize.STRING,
|
|
41
|
-
},
|
|
42
|
-
userSettings: {
|
|
43
|
-
type: Sequelize.JSON
|
|
44
|
-
}
|
|
45
|
-
});
|
|
1
|
+
const Sequelize = require('sequelize');
|
|
2
|
+
const { sequelize } = require('./sequelize');
|
|
3
|
+
|
|
4
|
+
// Model for User data
|
|
5
|
+
exports.UserModel = sequelize.define('users', {
|
|
6
|
+
// id = {crmName}-{crmUserId}
|
|
7
|
+
id: {
|
|
8
|
+
type: Sequelize.STRING,
|
|
9
|
+
primaryKey: true,
|
|
10
|
+
},
|
|
11
|
+
rcAccountId: {
|
|
12
|
+
type: Sequelize.STRING,
|
|
13
|
+
},
|
|
14
|
+
hostname: {
|
|
15
|
+
type: Sequelize.STRING,
|
|
16
|
+
},
|
|
17
|
+
timezoneName: {
|
|
18
|
+
type: Sequelize.STRING,
|
|
19
|
+
},
|
|
20
|
+
timezoneOffset: {
|
|
21
|
+
type: Sequelize.STRING,
|
|
22
|
+
},
|
|
23
|
+
platform: {
|
|
24
|
+
type: Sequelize.STRING,
|
|
25
|
+
},
|
|
26
|
+
// in apiKey auth, accessToken will be API key
|
|
27
|
+
accessToken: {
|
|
28
|
+
type: Sequelize.STRING(2000),
|
|
29
|
+
},
|
|
30
|
+
refreshToken: {
|
|
31
|
+
type: Sequelize.STRING(2000),
|
|
32
|
+
},
|
|
33
|
+
tokenExpiry: {
|
|
34
|
+
type: Sequelize.DATE
|
|
35
|
+
},
|
|
36
|
+
platformAdditionalInfo: {
|
|
37
|
+
type: Sequelize.JSON
|
|
38
|
+
},
|
|
39
|
+
hashedRcExtensionId: {
|
|
40
|
+
type: Sequelize.STRING,
|
|
41
|
+
},
|
|
42
|
+
userSettings: {
|
|
43
|
+
type: Sequelize.JSON
|
|
44
|
+
}
|
|
45
|
+
});
|