n8n-nodes-microsoft-teams-bot 1.0.0

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 (127) hide show
  1. package/dist/credentials/TeamsBotApi.credentials.d.ts +7 -0
  2. package/dist/credentials/TeamsBotApi.credentials.js +107 -0
  3. package/dist/credentials/TeamsBotApi.credentials.js.map +1 -0
  4. package/dist/credentials/TeamsGraphApi.credentials.d.ts +7 -0
  5. package/dist/credentials/TeamsGraphApi.credentials.js +58 -0
  6. package/dist/credentials/TeamsGraphApi.credentials.js.map +1 -0
  7. package/dist/index.d.ts +4 -0
  8. package/dist/index.js +23 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/nodes/TeamsBot/TeamsBot.node.d.ts +21 -0
  11. package/dist/nodes/TeamsBot/TeamsBot.node.js +457 -0
  12. package/dist/nodes/TeamsBot/TeamsBot.node.js.map +1 -0
  13. package/dist/nodes/TeamsBot/TeamsBot.node.json +73 -0
  14. package/dist/nodes/TeamsBot/TeamsBotTrigger.node.d.ts +21 -0
  15. package/dist/nodes/TeamsBot/TeamsBotTrigger.node.js +506 -0
  16. package/dist/nodes/TeamsBot/TeamsBotTrigger.node.js.map +1 -0
  17. package/dist/nodes/TeamsBot/TeamsBotTrigger.node.json +57 -0
  18. package/dist/nodes/TeamsBot/actions/buildCard.d.ts +6 -0
  19. package/dist/nodes/TeamsBot/actions/buildCard.js +176 -0
  20. package/dist/nodes/TeamsBot/actions/buildCard.js.map +1 -0
  21. package/dist/nodes/TeamsBot/actions/cards.d.ts +34 -0
  22. package/dist/nodes/TeamsBot/actions/cards.js +731 -0
  23. package/dist/nodes/TeamsBot/actions/cards.js.map +1 -0
  24. package/dist/nodes/TeamsBot/actions/channels.d.ts +18 -0
  25. package/dist/nodes/TeamsBot/actions/channels.js +199 -0
  26. package/dist/nodes/TeamsBot/actions/channels.js.map +1 -0
  27. package/dist/nodes/TeamsBot/actions/messages.d.ts +86 -0
  28. package/dist/nodes/TeamsBot/actions/messages.js +1259 -0
  29. package/dist/nodes/TeamsBot/actions/messages.js.map +1 -0
  30. package/dist/nodes/TeamsBot/actions/router.d.ts +2 -0
  31. package/dist/nodes/TeamsBot/actions/router.js +186 -0
  32. package/dist/nodes/TeamsBot/actions/router.js.map +1 -0
  33. package/dist/nodes/TeamsBot/actions/teams.d.ts +18 -0
  34. package/dist/nodes/TeamsBot/actions/teams.js +227 -0
  35. package/dist/nodes/TeamsBot/actions/teams.js.map +1 -0
  36. package/dist/nodes/TeamsBot/actions/users.d.ts +13 -0
  37. package/dist/nodes/TeamsBot/actions/users.js +184 -0
  38. package/dist/nodes/TeamsBot/actions/users.js.map +1 -0
  39. package/dist/nodes/TeamsBot/descriptions/buildCard.description.d.ts +7 -0
  40. package/dist/nodes/TeamsBot/descriptions/buildCard.description.js +682 -0
  41. package/dist/nodes/TeamsBot/descriptions/buildCard.description.js.map +1 -0
  42. package/dist/nodes/TeamsBot/descriptions/card.description.d.ts +2 -0
  43. package/dist/nodes/TeamsBot/descriptions/card.description.js +564 -0
  44. package/dist/nodes/TeamsBot/descriptions/card.description.js.map +1 -0
  45. package/dist/nodes/TeamsBot/descriptions/index.d.ts +3 -0
  46. package/dist/nodes/TeamsBot/descriptions/index.js +20 -0
  47. package/dist/nodes/TeamsBot/descriptions/index.js.map +1 -0
  48. package/dist/nodes/TeamsBot/descriptions/message.description.d.ts +2 -0
  49. package/dist/nodes/TeamsBot/descriptions/message.description.js +964 -0
  50. package/dist/nodes/TeamsBot/descriptions/message.description.js.map +1 -0
  51. package/dist/nodes/TeamsBot/descriptions/node.description.d.ts +2 -0
  52. package/dist/nodes/TeamsBot/descriptions/node.description.js +567 -0
  53. package/dist/nodes/TeamsBot/descriptions/node.description.js.map +1 -0
  54. package/dist/nodes/TeamsBot/errors/authentication.d.ts +100 -0
  55. package/dist/nodes/TeamsBot/errors/authentication.js +110 -0
  56. package/dist/nodes/TeamsBot/errors/authentication.js.map +1 -0
  57. package/dist/nodes/TeamsBot/errors/graphApi.d.ts +44 -0
  58. package/dist/nodes/TeamsBot/errors/graphApi.js +84 -0
  59. package/dist/nodes/TeamsBot/errors/graphApi.js.map +1 -0
  60. package/dist/nodes/TeamsBot/errors/messages.d.ts +187 -0
  61. package/dist/nodes/TeamsBot/errors/messages.js +190 -0
  62. package/dist/nodes/TeamsBot/errors/messages.js.map +1 -0
  63. package/dist/nodes/TeamsBot/methods/listSearch.d.ts +4 -0
  64. package/dist/nodes/TeamsBot/methods/listSearch.js +78 -0
  65. package/dist/nodes/TeamsBot/methods/listSearch.js.map +1 -0
  66. package/dist/nodes/TeamsBot/teams.svg +11 -0
  67. package/dist/nodes/TeamsBot/transport/TeamsApiClient.d.ts +305 -0
  68. package/dist/nodes/TeamsBot/transport/TeamsApiClient.js +458 -0
  69. package/dist/nodes/TeamsBot/transport/TeamsApiClient.js.map +1 -0
  70. package/dist/nodes/TeamsBot/transport/api/BotFrameworkApi.d.ts +350 -0
  71. package/dist/nodes/TeamsBot/transport/api/BotFrameworkApi.js +1265 -0
  72. package/dist/nodes/TeamsBot/transport/api/BotFrameworkApi.js.map +1 -0
  73. package/dist/nodes/TeamsBot/transport/api/GraphApi.d.ts +158 -0
  74. package/dist/nodes/TeamsBot/transport/api/GraphApi.js +443 -0
  75. package/dist/nodes/TeamsBot/transport/api/GraphApi.js.map +1 -0
  76. package/dist/nodes/TeamsBot/transport/api/GraphApiClient.d.ts +160 -0
  77. package/dist/nodes/TeamsBot/transport/api/GraphApiClient.js +268 -0
  78. package/dist/nodes/TeamsBot/transport/api/GraphApiClient.js.map +1 -0
  79. package/dist/nodes/TeamsBot/transport/api/index.d.ts +7 -0
  80. package/dist/nodes/TeamsBot/transport/api/index.js +26 -0
  81. package/dist/nodes/TeamsBot/transport/api/index.js.map +1 -0
  82. package/dist/nodes/TeamsBot/transport/index.d.ts +12 -0
  83. package/dist/nodes/TeamsBot/transport/index.js +30 -0
  84. package/dist/nodes/TeamsBot/transport/index.js.map +1 -0
  85. package/dist/nodes/TeamsBot/types/api-types.d.ts +258 -0
  86. package/dist/nodes/TeamsBot/types/api-types.js +3 -0
  87. package/dist/nodes/TeamsBot/types/api-types.js.map +1 -0
  88. package/dist/nodes/TeamsBot/types/cards.d.ts +252 -0
  89. package/dist/nodes/TeamsBot/types/cards.js +3 -0
  90. package/dist/nodes/TeamsBot/types/cards.js.map +1 -0
  91. package/dist/nodes/TeamsBot/types/index.d.ts +5 -0
  92. package/dist/nodes/TeamsBot/types/index.js +24 -0
  93. package/dist/nodes/TeamsBot/types/index.js.map +1 -0
  94. package/dist/nodes/TeamsBot/utils/AdaptiveCardBuilder.d.ts +147 -0
  95. package/dist/nodes/TeamsBot/utils/AdaptiveCardBuilder.js +333 -0
  96. package/dist/nodes/TeamsBot/utils/AdaptiveCardBuilder.js.map +1 -0
  97. package/dist/nodes/TeamsBot/utils/AdaptiveCardTemplates.d.ts +122 -0
  98. package/dist/nodes/TeamsBot/utils/AdaptiveCardTemplates.js +467 -0
  99. package/dist/nodes/TeamsBot/utils/AdaptiveCardTemplates.js.map +1 -0
  100. package/dist/nodes/TeamsBot/utils/CardTemplates.d.ts +94 -0
  101. package/dist/nodes/TeamsBot/utils/CardTemplates.js +446 -0
  102. package/dist/nodes/TeamsBot/utils/CardTemplates.js.map +1 -0
  103. package/dist/nodes/TeamsBot/utils/apiHelpers.d.ts +30 -0
  104. package/dist/nodes/TeamsBot/utils/apiHelpers.js +95 -0
  105. package/dist/nodes/TeamsBot/utils/apiHelpers.js.map +1 -0
  106. package/dist/nodes/TeamsBot/utils/constants.d.ts +86 -0
  107. package/dist/nodes/TeamsBot/utils/constants.js +60 -0
  108. package/dist/nodes/TeamsBot/utils/constants.js.map +1 -0
  109. package/dist/nodes/TeamsBot/utils/fileProcessing.d.ts +66 -0
  110. package/dist/nodes/TeamsBot/utils/fileProcessing.js +276 -0
  111. package/dist/nodes/TeamsBot/utils/fileProcessing.js.map +1 -0
  112. package/dist/nodes/TeamsBot/utils/graphNotificationParser.d.ts +91 -0
  113. package/dist/nodes/TeamsBot/utils/graphNotificationParser.js +162 -0
  114. package/dist/nodes/TeamsBot/utils/graphNotificationParser.js.map +1 -0
  115. package/dist/nodes/TeamsBot/utils/index.d.ts +24 -0
  116. package/dist/nodes/TeamsBot/utils/index.js +90 -0
  117. package/dist/nodes/TeamsBot/utils/index.js.map +1 -0
  118. package/dist/nodes/TeamsBot/utils/installation.d.ts +15 -0
  119. package/dist/nodes/TeamsBot/utils/installation.js +41 -0
  120. package/dist/nodes/TeamsBot/utils/installation.js.map +1 -0
  121. package/dist/nodes/TeamsBot/utils/subscriptionManager.d.ts +63 -0
  122. package/dist/nodes/TeamsBot/utils/subscriptionManager.js +100 -0
  123. package/dist/nodes/TeamsBot/utils/subscriptionManager.js.map +1 -0
  124. package/dist/nodes/TeamsBot/utils/validation.d.ts +93 -0
  125. package/dist/nodes/TeamsBot/utils/validation.js +281 -0
  126. package/dist/nodes/TeamsBot/utils/validation.js.map +1 -0
  127. package/package.json +79 -0
@@ -0,0 +1,506 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TeamsBotTrigger = void 0;
4
+ const index_1 = require("./transport/index");
5
+ const graphNotificationParser_1 = require("./utils/graphNotificationParser");
6
+ const subscriptionManager_1 = require("./utils/subscriptionManager");
7
+ /**
8
+ * Checks if an incoming message matches a waiting response from sendAndWait
9
+ * @param {IDataObject} workflowStaticData - Workflow static data containing waitingResponses
10
+ * @param {ParsedNotification} notification - Parsed notification from Graph API
11
+ * @param {any} resourceData - Full resource data (message details)
12
+ * @param {IDataObject} standardEvent - Normalized event data
13
+ * @returns {any | null} Matched wait context or null if no match
14
+ */
15
+ function checkForWaitingResponse(workflowStaticData, notification, resourceData, standardEvent) {
16
+ // Check if there are any waiting responses
17
+ if (!workflowStaticData.waitingResponses || typeof workflowStaticData.waitingResponses !== 'object') {
18
+ return null;
19
+ }
20
+ const waitingResponses = workflowStaticData.waitingResponses;
21
+ // Extract conversation ID and replyToId from the message
22
+ const conversationId = notification.chatId || notification.channelId;
23
+ const replyToId = resourceData === null || resourceData === void 0 ? void 0 : resourceData.replyToId;
24
+ // Check each waiting response for a match
25
+ for (const [originalMessageId, waitContext] of Object.entries(waitingResponses)) {
26
+ // Match by conversation ID and check if this is a reply to the original message
27
+ const conversationMatches = waitContext.conversationId === conversationId ||
28
+ (waitContext.teamId && waitContext.channelId &&
29
+ notification.teamId === waitContext.teamId &&
30
+ notification.channelId === waitContext.channelId) ||
31
+ (waitContext.userId && notification.chatId);
32
+ // Check if this message is a reply to the original message
33
+ const isReplyToOriginal = replyToId === originalMessageId || replyToId === waitContext.originalMessageId;
34
+ if (conversationMatches && isReplyToOriginal) {
35
+ // Match found - remove from waiting responses
36
+ delete waitingResponses[originalMessageId];
37
+ return waitContext;
38
+ }
39
+ }
40
+ return null;
41
+ }
42
+ /**
43
+ * Cleans up expired waiting responses
44
+ * @param {IDataObject} workflowStaticData - Workflow static data containing waitingResponses
45
+ * @param {any} logger - Logger instance for logging cleanup actions
46
+ */
47
+ function cleanupExpiredWaitingResponses(workflowStaticData, logger) {
48
+ if (!workflowStaticData.waitingResponses || typeof workflowStaticData.waitingResponses !== 'object') {
49
+ return;
50
+ }
51
+ const waitingResponses = workflowStaticData.waitingResponses;
52
+ const now = Date.now();
53
+ // Remove expired waiting responses
54
+ for (const [messageId, waitContext] of Object.entries(waitingResponses)) {
55
+ if (waitContext.timeout && waitContext.timeout < now) {
56
+ delete waitingResponses[messageId];
57
+ logger.info(`Cleaned up expired waiting response: ${messageId}`);
58
+ }
59
+ }
60
+ }
61
+ /**
62
+ * Teams Bot Trigger Node
63
+ *
64
+ * This node provides webhook functionality for receiving Teams events via Microsoft Graph API subscriptions.
65
+ * It listens for incoming notifications from Graph API and triggers workflows based on Teams message events.
66
+ */
67
+ class TeamsBotTrigger {
68
+ constructor() {
69
+ this.description = {
70
+ displayName: 'Microsoft Teams Bot Trigger',
71
+ name: 'teamsBotTrigger',
72
+ icon: 'file:teams.svg',
73
+ group: ['trigger'],
74
+ version: 2,
75
+ subtitle: '={{$parameter["subscriptionType"]}}',
76
+ description: 'Triggers workflows when Teams messages are created, updated, or deleted via Microsoft Graph API subscriptions',
77
+ defaults: {
78
+ name: 'Teams Bot Trigger',
79
+ },
80
+ credentials: [
81
+ {
82
+ name: 'teamsGraphApi',
83
+ required: true,
84
+ },
85
+ ],
86
+ inputs: [],
87
+ outputs: ["main" /* NodeConnectionType.Main */],
88
+ webhooks: [
89
+ {
90
+ name: 'default',
91
+ httpMethod: 'POST',
92
+ responseMode: 'responseNode',
93
+ path: 'webhook',
94
+ },
95
+ ],
96
+ properties: [
97
+ {
98
+ displayName: 'Subscription Type',
99
+ name: 'subscriptionType',
100
+ type: 'options',
101
+ default: 'specificChannel',
102
+ options: [
103
+ {
104
+ name: 'Specific Channel Messages',
105
+ value: 'specificChannel',
106
+ description: 'Receive messages from a specific channel (FREE)',
107
+ },
108
+ {
109
+ name: 'Specific Chat Messages',
110
+ value: 'specificChat',
111
+ description: 'Receive messages from a specific chat (FREE)',
112
+ },
113
+ {
114
+ name: 'All Tenant Chat Messages',
115
+ value: 'allChats',
116
+ description: 'Receive all chat messages in tenant (REQUIRES LICENSING)',
117
+ },
118
+ {
119
+ name: 'All Tenant Channel Messages',
120
+ value: 'allChannels',
121
+ description: 'Receive all channel messages in tenant (REQUIRES LICENSING)',
122
+ },
123
+ ],
124
+ description: 'Type of subscription to create',
125
+ },
126
+ {
127
+ displayName: 'Team ID',
128
+ name: 'teamId',
129
+ type: 'string',
130
+ required: true,
131
+ default: '',
132
+ displayOptions: {
133
+ show: {
134
+ subscriptionType: ['specificChannel'],
135
+ },
136
+ },
137
+ description: 'ID of the team containing the channel',
138
+ },
139
+ {
140
+ displayName: 'Channel ID',
141
+ name: 'channelId',
142
+ type: 'string',
143
+ required: true,
144
+ default: '',
145
+ displayOptions: {
146
+ show: {
147
+ subscriptionType: ['specificChannel'],
148
+ },
149
+ },
150
+ description: 'ID of the channel to monitor',
151
+ },
152
+ {
153
+ displayName: 'Chat ID',
154
+ name: 'chatId',
155
+ type: 'string',
156
+ required: true,
157
+ default: '',
158
+ displayOptions: {
159
+ show: {
160
+ subscriptionType: ['specificChat'],
161
+ },
162
+ },
163
+ description: 'ID of the chat to monitor',
164
+ },
165
+ {
166
+ displayName: 'Event Types',
167
+ name: 'changeTypes',
168
+ type: 'multiOptions',
169
+ required: true,
170
+ default: ['created'],
171
+ options: [
172
+ {
173
+ name: 'Created',
174
+ value: 'created',
175
+ },
176
+ {
177
+ name: 'Updated',
178
+ value: 'updated',
179
+ },
180
+ {
181
+ name: 'Deleted',
182
+ value: 'deleted',
183
+ },
184
+ ],
185
+ description: 'Types of changes to listen for',
186
+ },
187
+ {
188
+ displayName: 'Payment Model',
189
+ name: 'paymentModel',
190
+ type: 'options',
191
+ default: 'evaluation',
192
+ displayOptions: {
193
+ show: {
194
+ subscriptionType: ['allChats', 'allChannels'],
195
+ },
196
+ },
197
+ options: [
198
+ {
199
+ name: 'Evaluation Mode (Free - Testing Only)',
200
+ value: 'evaluation',
201
+ description: 'Free tier with throttling limits - NOT FOR PRODUCTION',
202
+ },
203
+ {
204
+ name: 'Model A (Seeded Capacity)',
205
+ value: 'A',
206
+ description: 'Based on license count with pay-as-you-go overages',
207
+ },
208
+ {
209
+ name: 'Model B (Pay-as-you-go)',
210
+ value: 'B',
211
+ description: 'Per-notification billing',
212
+ },
213
+ ],
214
+ description: 'Payment model for licensed endpoints',
215
+ },
216
+ {
217
+ displayName: 'Include Full Message Data',
218
+ name: 'includeResourceData',
219
+ type: 'boolean',
220
+ default: false,
221
+ description: 'Whether to include full message content in notifications (requires certificate for encryption)',
222
+ },
223
+ {
224
+ displayName: 'Filters',
225
+ name: 'filters',
226
+ type: 'collection',
227
+ placeholder: 'Add Filter',
228
+ default: {},
229
+ options: [
230
+ {
231
+ displayName: 'Message Contains',
232
+ name: 'messageContains',
233
+ type: 'string',
234
+ default: '',
235
+ description: 'Only trigger if message contains this text (case insensitive)',
236
+ },
237
+ {
238
+ displayName: 'Sender Email',
239
+ name: 'senderEmail',
240
+ type: 'string',
241
+ default: '',
242
+ description: 'Only trigger if message is from this user email',
243
+ },
244
+ ],
245
+ description: 'Optional filters to apply to notifications',
246
+ },
247
+ ],
248
+ };
249
+ /**
250
+ * Webhook lifecycle methods for subscription management
251
+ */
252
+ this.webhookMethods = {
253
+ default: {
254
+ async checkExists() {
255
+ const subscriptionManager = new subscriptionManager_1.SubscriptionManager(this);
256
+ const subscription = subscriptionManager.getSubscription();
257
+ if (!(subscription === null || subscription === void 0 ? void 0 : subscription.subscriptionId)) {
258
+ return false;
259
+ }
260
+ // Verify subscription still exists in Graph API
261
+ try {
262
+ const credentials = await this.getCredentials('teamsGraphApi');
263
+ const graphClient = new index_1.GraphApiClient(this, credentials);
264
+ await graphClient.getSubscription(subscription.subscriptionId);
265
+ return true;
266
+ }
267
+ catch (error) {
268
+ // Subscription doesn't exist
269
+ subscriptionManager.clearSubscription();
270
+ return false;
271
+ }
272
+ },
273
+ async create() {
274
+ const credentials = await this.getCredentials('teamsGraphApi');
275
+ const webhookUrl = this.getNodeWebhookUrl('default');
276
+ // Get parameters
277
+ const subscriptionType = this.getNodeParameter('subscriptionType');
278
+ const changeTypes = this.getNodeParameter('changeTypes');
279
+ const teamId = this.getNodeParameter('teamId', '');
280
+ const channelId = this.getNodeParameter('channelId', '');
281
+ const chatId = this.getNodeParameter('chatId', '');
282
+ const paymentModel = this.getNodeParameter('paymentModel', 'evaluation');
283
+ const includeResourceData = this.getNodeParameter('includeResourceData', false);
284
+ // Build resource URL
285
+ let resource = '';
286
+ switch (subscriptionType) {
287
+ case 'specificChannel':
288
+ resource = `/teams/${teamId}/channels/${channelId}/messages`;
289
+ break;
290
+ case 'specificChat':
291
+ resource = `/chats/${chatId}/messages`;
292
+ break;
293
+ case 'allChats':
294
+ resource = paymentModel === 'evaluation'
295
+ ? '/chats/getAllMessages'
296
+ : `/chats/getAllMessages?model=${paymentModel}`;
297
+ break;
298
+ case 'allChannels':
299
+ resource = paymentModel === 'evaluation'
300
+ ? '/teams/getAllMessages'
301
+ : `/teams/getAllMessages?model=${paymentModel}`;
302
+ break;
303
+ }
304
+ // Generate client state
305
+ const subscriptionManager = new subscriptionManager_1.SubscriptionManager(this);
306
+ const clientState = subscriptionManager.generateClientState();
307
+ // Calculate expiration (1 hour from now)
308
+ const expirationDateTime = subscriptionManager.calculateExpiryTime(60);
309
+ // Build subscription parameters
310
+ const params = {
311
+ changeType: changeTypes.join(','),
312
+ notificationUrl: webhookUrl,
313
+ resource,
314
+ expirationDateTime,
315
+ clientState,
316
+ lifecycleNotificationUrl: webhookUrl, // Required for >1 hour subscriptions
317
+ };
318
+ // Add encryption if includeResourceData requested
319
+ if (includeResourceData) {
320
+ const certificatePem = credentials.certificatePem;
321
+ if (!certificatePem) {
322
+ throw new Error('Certificate required for includeResourceData=true. Add certificate in credentials.');
323
+ }
324
+ params.includeResourceData = true;
325
+ params.encryptionCertificate = Buffer.from(certificatePem).toString('base64');
326
+ params.encryptionCertificateId = credentials.certificateThumbprint || 'default';
327
+ }
328
+ // Create subscription
329
+ const graphClient = new index_1.GraphApiClient(this, credentials);
330
+ const subscription = await graphClient.createSubscription(params);
331
+ // Store subscription metadata
332
+ subscriptionManager.storeSubscription({
333
+ subscriptionId: subscription.id,
334
+ expirationDateTime: subscription.expirationDateTime,
335
+ resource,
336
+ changeType: changeTypes.join(','),
337
+ notificationUrl: webhookUrl,
338
+ clientState,
339
+ lastRenewalCheck: Date.now(),
340
+ createdAt: Date.now(),
341
+ });
342
+ return true;
343
+ },
344
+ async delete() {
345
+ const subscriptionManager = new subscriptionManager_1.SubscriptionManager(this);
346
+ const subscription = subscriptionManager.getSubscription();
347
+ if (!(subscription === null || subscription === void 0 ? void 0 : subscription.subscriptionId)) {
348
+ return true; // Already deleted
349
+ }
350
+ try {
351
+ const credentials = await this.getCredentials('teamsGraphApi');
352
+ const graphClient = new index_1.GraphApiClient(this, credentials);
353
+ await graphClient.deleteSubscription(subscription.subscriptionId);
354
+ }
355
+ catch (error) {
356
+ // Log but don't fail - subscription might already be deleted
357
+ this.logger.warn(`Failed to delete subscription: ${error}`);
358
+ }
359
+ // Clear storage
360
+ subscriptionManager.clearSubscription();
361
+ return true;
362
+ },
363
+ },
364
+ };
365
+ }
366
+ async webhook() {
367
+ var _a, _b, _c;
368
+ const req = this.getRequestObject();
369
+ const res = this.getResponseObject();
370
+ try {
371
+ // Handle Graph API validation request
372
+ const validationToken = req.query.validationToken;
373
+ if (validationToken) {
374
+ // Must respond within 10 seconds with plain text token
375
+ res.status(200).contentType('text/plain').send(validationToken);
376
+ return { noWebhookResponse: true };
377
+ }
378
+ // Get credentials and parameters
379
+ const credentials = await this.getCredentials('teamsGraphApi');
380
+ const subscriptionType = this.getNodeParameter('subscriptionType');
381
+ const changeTypes = this.getNodeParameter('changeTypes');
382
+ const filters = this.getNodeParameter('filters', {});
383
+ const includeResourceData = this.getNodeParameter('includeResourceData', false);
384
+ // Parse Graph API notification
385
+ const body = req.body;
386
+ const parser = new graphNotificationParser_1.GraphNotificationParser();
387
+ const notifications = parser.parseNotification(body);
388
+ if (notifications.length === 0) {
389
+ // No valid notifications
390
+ res.status(202).json({ status: 'Accepted' });
391
+ return { noWebhookResponse: true };
392
+ }
393
+ // Get stored subscription metadata
394
+ const subscriptionManager = new subscriptionManager_1.SubscriptionManager(this);
395
+ const storedSubscription = subscriptionManager.getSubscription();
396
+ // Validate clientState matches (security check)
397
+ for (const notification of notifications) {
398
+ if (!storedSubscription || notification.clientState !== storedSubscription.clientState) {
399
+ res.status(403).json({ error: 'Invalid clientState' });
400
+ return { noWebhookResponse: true };
401
+ }
402
+ }
403
+ // Check if subscription needs renewal
404
+ if (storedSubscription && subscriptionManager.shouldRenew()) {
405
+ try {
406
+ const graphClient = new index_1.GraphApiClient(this, credentials);
407
+ const newExpirationDateTime = subscriptionManager.calculateExpiryTime(60);
408
+ await graphClient.renewSubscription(storedSubscription.subscriptionId, {
409
+ expirationDateTime: newExpirationDateTime,
410
+ });
411
+ subscriptionManager.updateExpiration(newExpirationDateTime);
412
+ }
413
+ catch (error) {
414
+ this.logger.error(`Failed to renew subscription: ${error}`);
415
+ // Don't throw - subscription might still be valid
416
+ }
417
+ }
418
+ // Get workflow static data to check for waiting responses
419
+ const workflowStaticData = this.getWorkflowStaticData('global');
420
+ // Clean up expired waiting responses
421
+ cleanupExpiredWaitingResponses(workflowStaticData, this.logger);
422
+ // Process each notification
423
+ const workflowData = [];
424
+ for (const notification of notifications) {
425
+ // Apply filters
426
+ let passesFilters = true;
427
+ // Check message content filter
428
+ if (filters.messageContains) {
429
+ const resourceData = notification.resourceData;
430
+ if ((_a = resourceData === null || resourceData === void 0 ? void 0 : resourceData.body) === null || _a === void 0 ? void 0 : _a.content) {
431
+ const messageText = resourceData.body.content.toLowerCase();
432
+ const filterText = filters.messageContains.toLowerCase();
433
+ if (!messageText.includes(filterText)) {
434
+ passesFilters = false;
435
+ }
436
+ }
437
+ // If no resource data, we can't filter by content, so pass through
438
+ }
439
+ // Check sender email filter
440
+ if (passesFilters && filters.senderEmail) {
441
+ const resourceData = notification.resourceData;
442
+ if ((_c = (_b = resourceData === null || resourceData === void 0 ? void 0 : resourceData.from) === null || _b === void 0 ? void 0 : _b.user) === null || _c === void 0 ? void 0 : _c.userIdentity) {
443
+ const senderEmail = resourceData.from.user.userIdentity;
444
+ const filterEmail = filters.senderEmail.toLowerCase();
445
+ if (senderEmail.toLowerCase() !== filterEmail) {
446
+ passesFilters = false;
447
+ }
448
+ }
449
+ }
450
+ if (!passesFilters) {
451
+ continue;
452
+ }
453
+ // Fetch full resource data if not included
454
+ let resourceData = notification.resourceData;
455
+ if (!resourceData && notification.resourceUrl && !includeResourceData) {
456
+ // Only fetch if includeResourceData is false (data not in notification)
457
+ try {
458
+ const graphClient = new index_1.GraphApiClient(this, credentials);
459
+ resourceData = await graphClient.getResource(notification.resourceUrl);
460
+ }
461
+ catch (error) {
462
+ this.logger.warn(`Failed to fetch resource data: ${error}`);
463
+ // Continue without resource data
464
+ }
465
+ }
466
+ // Normalize to standard event format
467
+ const standardEvent = parser.normalizeEvent(notification, resourceData);
468
+ // Check if this message matches a waiting response
469
+ const matchedWait = checkForWaitingResponse(workflowStaticData, notification, resourceData, standardEvent);
470
+ if (matchedWait) {
471
+ // This message is a response to a "send and wait" operation
472
+ // The execution will be resumed automatically by n8n
473
+ this.logger.info(`Matched response for waiting execution: ${matchedWait.originalMessageId}`);
474
+ // Return accepted immediately (Graph API expects quick response)
475
+ res.status(202).json({ status: 'Accepted' });
476
+ return {
477
+ workflowData: [[{ json: standardEvent }]],
478
+ noWebhookResponse: true,
479
+ };
480
+ }
481
+ // Regular trigger - add to workflow data
482
+ workflowData.push([{ json: standardEvent }]);
483
+ }
484
+ // Return accepted immediately (Graph API expects quick response)
485
+ res.status(202).json({ status: 'Accepted' });
486
+ if (workflowData.length === 0) {
487
+ return { noWebhookResponse: true };
488
+ }
489
+ return {
490
+ workflowData,
491
+ noWebhookResponse: true,
492
+ };
493
+ }
494
+ catch (error) {
495
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
496
+ this.logger.error(`Graph API webhook error: ${errorMessage}`, { error });
497
+ res.status(500).json({
498
+ error: 'Internal server error',
499
+ message: errorMessage,
500
+ });
501
+ return { noWebhookResponse: true };
502
+ }
503
+ }
504
+ }
505
+ exports.TeamsBotTrigger = TeamsBotTrigger;
506
+ //# sourceMappingURL=TeamsBotTrigger.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TeamsBotTrigger.node.js","sourceRoot":"","sources":["../../../nodes/TeamsBot/TeamsBotTrigger.node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ {
2
+ "node": "n8n-nodes-microsoft-teams-bot",
3
+ "nodeVersion": 2,
4
+ "codexVersion": 1,
5
+ "categories": [
6
+ "Communication"
7
+ ],
8
+ "resources": {
9
+ "credentialDocumentation": [
10
+ {
11
+ "url": "https://learn.microsoft.com/en-us/graph/api/subscription-post-subscriptions"
12
+ }
13
+ ],
14
+ "primaryDocumentation": [
15
+ {
16
+ "url": "https://learn.microsoft.com/en-us/graph/teams-change-notification-in-microsoft-teams-overview"
17
+ }
18
+ ]
19
+ },
20
+ "subcategories": {
21
+ "Communication": [
22
+ "Trigger"
23
+ ]
24
+ },
25
+ "alias": [
26
+ "Microsoft",
27
+ "Teams",
28
+ "Bot",
29
+ "Trigger",
30
+ "Webhook",
31
+ "Graph API",
32
+ "Subscriptions",
33
+ "Message",
34
+ "Chat",
35
+ "Channel"
36
+ ],
37
+ "operations": {
38
+ "trigger": {
39
+ "specificChannel": {
40
+ "description": "Trigger workflow on messages in a specific Teams channel",
41
+ "documentationUrl": "https://learn.microsoft.com/en-us/graph/teams-changenotifications-chatmessage"
42
+ },
43
+ "specificChat": {
44
+ "description": "Trigger workflow on messages in a specific chat",
45
+ "documentationUrl": "https://learn.microsoft.com/en-us/graph/teams-changenotifications-chatmessage"
46
+ },
47
+ "allChats": {
48
+ "description": "Trigger workflow on all chat messages in tenant (requires licensing)",
49
+ "documentationUrl": "https://learn.microsoft.com/en-us/graph/teams-licenses"
50
+ },
51
+ "allChannels": {
52
+ "description": "Trigger workflow on all channel messages in tenant (requires licensing)",
53
+ "documentationUrl": "https://learn.microsoft.com/en-us/graph/teams-licenses"
54
+ }
55
+ }
56
+ }
57
+ }
@@ -0,0 +1,6 @@
1
+ import type { IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
2
+ /**
3
+ * Handles the 'Build Adaptive Card' operation in the Teams Bot node.
4
+ * This creates a JSON representation of an adaptive card based on UI inputs.
5
+ */
6
+ export declare function buildCard(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;