n8n-nodes-microsoft-teams-bot 1.3.0 → 1.3.2
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.
|
@@ -70,12 +70,21 @@ class TeamsBot {
|
|
|
70
70
|
...nodeDesc,
|
|
71
71
|
version: nodeDesc.version || 1,
|
|
72
72
|
webhooks: [
|
|
73
|
+
{
|
|
74
|
+
name: 'default',
|
|
75
|
+
httpMethod: 'GET',
|
|
76
|
+
responseMode: 'onReceived',
|
|
77
|
+
path: '={{ $nodeId }}',
|
|
78
|
+
restartWebhook: true,
|
|
79
|
+
isFullPath: true,
|
|
80
|
+
},
|
|
73
81
|
{
|
|
74
82
|
name: 'default',
|
|
75
83
|
httpMethod: 'POST',
|
|
76
84
|
responseMode: 'onReceived',
|
|
77
85
|
path: '={{ $nodeId }}',
|
|
78
86
|
restartWebhook: true,
|
|
87
|
+
isFullPath: true,
|
|
79
88
|
},
|
|
80
89
|
],
|
|
81
90
|
};
|
|
@@ -90,7 +99,7 @@ class TeamsBot {
|
|
|
90
99
|
const query = req.query;
|
|
91
100
|
if (query.responded === 'true') {
|
|
92
101
|
this.logger.info('[TeamsBot] Send-and-wait webhook triggered - resuming execution');
|
|
93
|
-
|
|
102
|
+
const htmlPage = `
|
|
94
103
|
<!DOCTYPE html>
|
|
95
104
|
<html>
|
|
96
105
|
<head>
|
|
@@ -105,9 +114,9 @@ class TeamsBot {
|
|
|
105
114
|
<p>Your response has been recorded. You can close this window.</p>
|
|
106
115
|
</body>
|
|
107
116
|
</html>
|
|
108
|
-
|
|
117
|
+
`;
|
|
109
118
|
return {
|
|
110
|
-
|
|
119
|
+
webhookResponse: htmlPage,
|
|
111
120
|
workflowData: [[{ json: { responded: true, timestamp: new Date().toISOString() } }]],
|
|
112
121
|
};
|
|
113
122
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TeamsBot.node.js","sourceRoot":"","sources":["../../../nodes/TeamsBot/TeamsBot.node.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,6CAA0C;AAC1C,iEAAmD;AACnD,6DAA+D;AAC/D,sEAAqF;AACrF,6CAA6E;AAC7E,6EAA0E;AAC1E,mEAAsE;AAEtE,MAAa,QAAQ;IAGnB,YAAY,eAAyC;
|
|
1
|
+
{"version":3,"file":"TeamsBot.node.js","sourceRoot":"","sources":["../../../nodes/TeamsBot/TeamsBot.node.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,37 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.sendAndWaitOperation = void 0;
|
|
4
4
|
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
5
|
const index_1 = require("../transport/index");
|
|
6
|
+
async function getChatIdForUser(graphClient, targetUserId, api, teamsAppId) {
|
|
7
|
+
var _a;
|
|
8
|
+
const targetAadId = await api.resolveUserId(targetUserId);
|
|
9
|
+
const installedApps = await graphClient.makeRequest({
|
|
10
|
+
method: 'GET',
|
|
11
|
+
url: `/users/${targetAadId}/teamwork/installedApps?$expand=teamsApp,teamsAppDefinition`,
|
|
12
|
+
});
|
|
13
|
+
const apps = installedApps.value || [];
|
|
14
|
+
const appInstall = apps.find((app) => {
|
|
15
|
+
var _a;
|
|
16
|
+
const appId = (_a = app === null || app === void 0 ? void 0 : app.teamsAppDefinition) === null || _a === void 0 ? void 0 : _a.teamsAppId;
|
|
17
|
+
return (typeof appId === 'string' &&
|
|
18
|
+
typeof teamsAppId === 'string' &&
|
|
19
|
+
appId.toLowerCase() === teamsAppId.toLowerCase());
|
|
20
|
+
});
|
|
21
|
+
if (!appInstall) {
|
|
22
|
+
throw new Error(`Teams app ${teamsAppId} is not installed for user ${targetUserId} (no personal 1:1 chat). ` +
|
|
23
|
+
`Please install the Teams app for this user first.`);
|
|
24
|
+
}
|
|
25
|
+
if ((_a = appInstall.chat) === null || _a === void 0 ? void 0 : _a.id) {
|
|
26
|
+
return appInstall.chat.id;
|
|
27
|
+
}
|
|
28
|
+
const chat = await graphClient.makeRequest({
|
|
29
|
+
method: 'GET',
|
|
30
|
+
url: `/users/${targetAadId}/teamwork/installedApps/${appInstall.id}/chat`,
|
|
31
|
+
});
|
|
32
|
+
if (!chat.id) {
|
|
33
|
+
throw new Error('Failed to resolve chat ID for user/app combination.');
|
|
34
|
+
}
|
|
35
|
+
return chat.id;
|
|
36
|
+
}
|
|
6
37
|
async function sendAndWaitOperation() {
|
|
7
38
|
const items = this.getInputData();
|
|
8
39
|
if (items.length > 1) {
|
|
@@ -21,15 +52,17 @@ async function sendAndWaitOperation() {
|
|
|
21
52
|
messageLength: message.length,
|
|
22
53
|
});
|
|
23
54
|
const nodeOptions = this.getNodeParameter('options', i, {});
|
|
24
|
-
|
|
55
|
+
const credentials = (await this.getCredentials('teamsBotApi'));
|
|
56
|
+
const graphClient = new index_1.GraphApiClient(this, credentials);
|
|
57
|
+
// Generate signed resume URL for quick link-click response
|
|
25
58
|
this.setSignatureValidationRequired();
|
|
26
|
-
const resumeUrl = this.getSignedResumeUrl({ responded: 'true' });
|
|
59
|
+
const resumeUrl = this.getSignedResumeUrl({ responded: 'true', source: 'link' });
|
|
27
60
|
console.log('[TeamsBot][SendAndWait] Generated signed resume URL', {
|
|
28
61
|
resumeUrl: resumeUrl.substring(0, 50) + '...',
|
|
29
62
|
});
|
|
30
63
|
let htmlContent = message;
|
|
31
64
|
if (nodeOptions.appendAttribution !== false) {
|
|
32
|
-
htmlContent += `<br><br><em>Reply to this message
|
|
65
|
+
htmlContent += `<br><br><em>Reply to this message or <a href="${resumeUrl}">click here</a> to respond</em>`;
|
|
33
66
|
}
|
|
34
67
|
else {
|
|
35
68
|
htmlContent += `<br><a href="${resumeUrl}">Click here to respond</a>`;
|
|
@@ -37,6 +70,8 @@ async function sendAndWaitOperation() {
|
|
|
37
70
|
const options = {
|
|
38
71
|
textFormat: 'xml',
|
|
39
72
|
};
|
|
73
|
+
let resource;
|
|
74
|
+
let originalMessageId;
|
|
40
75
|
if (recipientType === 'channel') {
|
|
41
76
|
const teamId = this.getNodeParameter('teamId', i);
|
|
42
77
|
const channelId = this.getNodeParameter('channelId', i);
|
|
@@ -44,26 +79,103 @@ async function sendAndWaitOperation() {
|
|
|
44
79
|
teamId,
|
|
45
80
|
channelId,
|
|
46
81
|
});
|
|
47
|
-
await api.sendChannelMessage(teamId, channelId, htmlContent, options);
|
|
48
|
-
|
|
82
|
+
const response = (await api.sendChannelMessage(teamId, channelId, htmlContent, options));
|
|
83
|
+
resource = `/teams/${teamId}/channels/${channelId}/messages`;
|
|
84
|
+
originalMessageId = response.id || response.activityId || '';
|
|
85
|
+
console.log('[TeamsBot][SendAndWait] Channel message sent successfully', {
|
|
86
|
+
messageId: originalMessageId,
|
|
87
|
+
});
|
|
49
88
|
}
|
|
50
89
|
else if (recipientType === 'chat') {
|
|
51
90
|
const userId = this.getNodeParameter('userId', i);
|
|
91
|
+
const teamsAppId = credentials.teamsAppId;
|
|
52
92
|
console.log('[TeamsBot][SendAndWait] Starting 1:1 chat send-and-wait operation', {
|
|
53
93
|
userId,
|
|
94
|
+
teamsAppId,
|
|
54
95
|
});
|
|
96
|
+
if (!teamsAppId) {
|
|
97
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Teams app ID (teamsAppId) is missing from credentials. It is required for 1:1 chat send and wait.', { itemIndex: i });
|
|
98
|
+
}
|
|
55
99
|
await (0, index_1.handleAutoInstall)(api, userId, i, this);
|
|
56
100
|
console.log('[TeamsBot][SendAndWait] Sending 1:1 chat message via Bot Framework');
|
|
57
|
-
await (0, index_1.withAutoInstallRetry)(() => api.sendMessage(userId, htmlContent, options), () => api.installBot(userId), this, userId, 'user');
|
|
58
|
-
console.log('[TeamsBot][SendAndWait]
|
|
101
|
+
const response = (await (0, index_1.withAutoInstallRetry)(() => api.sendMessage(userId, htmlContent, options), () => api.installBot(userId), this, userId, 'user'));
|
|
102
|
+
console.log('[TeamsBot][SendAndWait] Resolving chat ID for subscription via Graph installedApps');
|
|
103
|
+
const chatId = await getChatIdForUser(graphClient, userId, api, teamsAppId);
|
|
104
|
+
console.log('[TeamsBot][SendAndWait] Resolved chat ID:', chatId);
|
|
105
|
+
resource = `/chats/${chatId}/messages`;
|
|
106
|
+
originalMessageId = response.id || response.activityId || '';
|
|
107
|
+
console.log('[TeamsBot][SendAndWait] Chat message sent successfully', {
|
|
108
|
+
messageId: originalMessageId,
|
|
109
|
+
});
|
|
59
110
|
}
|
|
60
111
|
else {
|
|
61
112
|
throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Unsupported recipient type: ${recipientType}`, { itemIndex: i });
|
|
62
113
|
}
|
|
114
|
+
if (!originalMessageId) {
|
|
115
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Failed to get message ID from response', { itemIndex: i });
|
|
116
|
+
}
|
|
117
|
+
// Construct webhook URL for Graph API subscriptions
|
|
118
|
+
// Use the same webhook mechanism as the link-click URL
|
|
119
|
+
const baseUrl = this.getInstanceBaseUrl();
|
|
120
|
+
const nodeId = this.getNode().id;
|
|
121
|
+
const webhookUrl = `${baseUrl}/webhook/${nodeId}`;
|
|
122
|
+
this.logger.info('[TeamsBot][SendAndWait] Constructed webhook URL for Graph notifications', {
|
|
123
|
+
webhookUrl,
|
|
124
|
+
baseUrl,
|
|
125
|
+
nodeId,
|
|
126
|
+
});
|
|
127
|
+
const workflowStaticData = this.getWorkflowStaticData('global');
|
|
128
|
+
if (!workflowStaticData.sendAndWaitExecutions) {
|
|
129
|
+
workflowStaticData.sendAndWaitExecutions = {};
|
|
130
|
+
}
|
|
63
131
|
// Calculate wait time
|
|
64
132
|
const MAX_TIMEOUT_SECONDS = 3300;
|
|
65
133
|
const cappedTimeout = Math.min(timeout, MAX_TIMEOUT_SECONDS);
|
|
66
134
|
const waitTill = new Date(Date.now() + cappedTimeout * 1000);
|
|
135
|
+
const expirationDateTime = new Date(Date.now() + (cappedTimeout + 60) * 1000);
|
|
136
|
+
const subscriptionExpiration = expirationDateTime.toISOString();
|
|
137
|
+
// Create Graph API subscription to listen for message replies
|
|
138
|
+
const initialClientState = `sendAndWait_temp_${originalMessageId}_${Date.now()}`;
|
|
139
|
+
const subscriptionParams = {
|
|
140
|
+
changeType: 'created',
|
|
141
|
+
notificationUrl: webhookUrl,
|
|
142
|
+
resource,
|
|
143
|
+
includeResourceData: false,
|
|
144
|
+
expirationDateTime: subscriptionExpiration,
|
|
145
|
+
clientState: initialClientState,
|
|
146
|
+
};
|
|
147
|
+
console.log('[TeamsBot][SendAndWait] Creating Graph subscription', {
|
|
148
|
+
resource,
|
|
149
|
+
notificationUrl: webhookUrl,
|
|
150
|
+
expirationDateTime: subscriptionExpiration,
|
|
151
|
+
cappedTimeout,
|
|
152
|
+
originalTimeout: timeout,
|
|
153
|
+
});
|
|
154
|
+
const subscription = await graphClient.createSubscription(subscriptionParams);
|
|
155
|
+
console.log('[TeamsBot][SendAndWait] Subscription created successfully', {
|
|
156
|
+
subscriptionId: subscription.id,
|
|
157
|
+
});
|
|
158
|
+
const finalClientState = `sendAndWait_${subscription.id}_${originalMessageId}`;
|
|
159
|
+
await graphClient.updateSubscription(subscription.id, {
|
|
160
|
+
clientState: finalClientState,
|
|
161
|
+
});
|
|
162
|
+
console.log('[TeamsBot][SendAndWait] Updated subscription clientState', {
|
|
163
|
+
subscriptionId: subscription.id,
|
|
164
|
+
clientState: finalClientState,
|
|
165
|
+
});
|
|
166
|
+
const executionKey = `${subscription.id}_${originalMessageId}`;
|
|
167
|
+
workflowStaticData.sendAndWaitExecutions[executionKey] = {
|
|
168
|
+
subscriptionId: subscription.id,
|
|
169
|
+
originalMessageId,
|
|
170
|
+
resource,
|
|
171
|
+
recipientType,
|
|
172
|
+
createdAt: Date.now(),
|
|
173
|
+
expiresAt: waitTill.getTime(),
|
|
174
|
+
};
|
|
175
|
+
console.log('[TeamsBot][SendAndWait] Stored send-and-wait execution context', {
|
|
176
|
+
executionKey,
|
|
177
|
+
expiresAt: new Date(waitTill.getTime()).toISOString(),
|
|
178
|
+
});
|
|
67
179
|
console.log('[TeamsBot][SendAndWait] Putting execution to wait', {
|
|
68
180
|
waitTill: waitTill.toISOString(),
|
|
69
181
|
cappedTimeout,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.sendAndWait.js","sourceRoot":"","sources":["../../../../nodes/TeamsBot/actions/messages.sendAndWait.ts"],"names":[],"mappings":";;;AACA,+CAAkD;AAClD,
|
|
1
|
+
{"version":3,"file":"messages.sendAndWait.js","sourceRoot":"","sources":["../../../../nodes/TeamsBot/actions/messages.sendAndWait.ts"],"names":[],"mappings":"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"}
|