@checkfirst/nestjs-outlook 7.1.2 → 7.1.5

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 (38) hide show
  1. package/dist/entities/microsoft-user.entity.d.ts +2 -0
  2. package/dist/entities/microsoft-user.entity.js +11 -0
  3. package/dist/entities/microsoft-user.entity.js.map +1 -1
  4. package/dist/entities/outlook-webhook-subscription.entity.d.ts +1 -0
  5. package/dist/entities/outlook-webhook-subscription.entity.js +5 -0
  6. package/dist/entities/outlook-webhook-subscription.entity.js.map +1 -1
  7. package/dist/enums/event-types.enum.d.ts +3 -0
  8. package/dist/enums/event-types.enum.js +3 -0
  9. package/dist/enums/event-types.enum.js.map +1 -1
  10. package/dist/enums/microsoft-user-status.enum.d.ts +4 -0
  11. package/dist/enums/microsoft-user-status.enum.js +9 -0
  12. package/dist/enums/microsoft-user-status.enum.js.map +1 -0
  13. package/dist/errors/microsoft-refresh-token-invalid.error.d.ts +4 -0
  14. package/dist/errors/microsoft-refresh-token-invalid.error.js +12 -0
  15. package/dist/errors/microsoft-refresh-token-invalid.error.js.map +1 -0
  16. package/dist/migrations/1776600000000-AddLastNotificationAtToSubscriptions.d.ts +5 -0
  17. package/dist/migrations/1776600000000-AddLastNotificationAtToSubscriptions.js +18 -0
  18. package/dist/migrations/1776600000000-AddLastNotificationAtToSubscriptions.js.map +1 -0
  19. package/dist/migrations/1776700000000-AddMicrosoftUserStatusColumn.d.ts +5 -0
  20. package/dist/migrations/1776700000000-AddMicrosoftUserStatusColumn.js +20 -0
  21. package/dist/migrations/1776700000000-AddMicrosoftUserStatusColumn.js.map +1 -0
  22. package/dist/repositories/outlook-webhook-subscription.repository.d.ts +3 -1
  23. package/dist/repositories/outlook-webhook-subscription.repository.js +19 -10
  24. package/dist/repositories/outlook-webhook-subscription.repository.js.map +1 -1
  25. package/dist/services/auth/microsoft-auth.service.d.ts +4 -3
  26. package/dist/services/auth/microsoft-auth.service.js +54 -11
  27. package/dist/services/auth/microsoft-auth.service.js.map +1 -1
  28. package/dist/services/calendar/calendar.service.d.ts +3 -11
  29. package/dist/services/calendar/calendar.service.js +23 -247
  30. package/dist/services/calendar/calendar.service.js.map +1 -1
  31. package/dist/services/calendar/lifecycle-event-handler.service.d.ts +3 -1
  32. package/dist/services/calendar/lifecycle-event-handler.service.js +35 -5
  33. package/dist/services/calendar/lifecycle-event-handler.service.js.map +1 -1
  34. package/dist/services/subscription/microsoft-subscription.service.d.ts +35 -0
  35. package/dist/services/subscription/microsoft-subscription.service.js +504 -2
  36. package/dist/services/subscription/microsoft-subscription.service.js.map +1 -1
  37. package/dist/tsconfig.tsbuildinfo +1 -1
  38. package/package.json +1 -1
@@ -5,14 +5,44 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
8
14
  var MicrosoftSubscriptionService_1;
9
15
  Object.defineProperty(exports, "__esModule", { value: true });
10
16
  exports.MicrosoftSubscriptionService = void 0;
17
+ const crypto_1 = require("crypto");
11
18
  const common_1 = require("@nestjs/common");
19
+ const event_emitter_1 = require("@nestjs/event-emitter");
20
+ const schedule_1 = require("@nestjs/schedule");
21
+ const typeorm_1 = require("@nestjs/typeorm");
22
+ const typeorm_2 = require("typeorm");
12
23
  const axios_1 = require("axios");
24
+ const microsoft_auth_service_1 = require("../auth/microsoft-auth.service");
25
+ const outlook_webhook_subscription_repository_1 = require("../../repositories/outlook-webhook-subscription.repository");
26
+ const microsoft_user_entity_1 = require("../../entities/microsoft-user.entity");
27
+ const constants_1 = require("../../constants");
28
+ const event_types_enum_1 = require("../../enums/event-types.enum");
29
+ const microsoft_user_status_enum_1 = require("../../enums/microsoft-user-status.enum");
30
+ const user_id_converter_service_1 = require("../shared/user-id-converter.service");
31
+ const graph_rate_limiter_service_1 = require("../shared/graph-rate-limiter.service");
13
32
  const outlook_api_executor_util_1 = require("../../utils/outlook-api-executor.util");
33
+ const GRAPH_BATCH_SIZE = 20;
34
+ const HEALTH_CHECK_WINDOW_HOURS = 24;
35
+ const FORCE_RENEWAL_WINDOW_HOURS = 12;
36
+ const STALE_NOTIFICATION_THRESHOLD_HOURS = 24;
14
37
  let MicrosoftSubscriptionService = MicrosoftSubscriptionService_1 = class MicrosoftSubscriptionService {
15
- constructor() {
38
+ constructor(microsoftAuthService, webhookSubscriptionRepository, eventEmitter, microsoftConfig, microsoftUserRepository, userIdConverter, rateLimiter) {
39
+ this.microsoftAuthService = microsoftAuthService;
40
+ this.webhookSubscriptionRepository = webhookSubscriptionRepository;
41
+ this.eventEmitter = eventEmitter;
42
+ this.microsoftConfig = microsoftConfig;
43
+ this.microsoftUserRepository = microsoftUserRepository;
44
+ this.userIdConverter = userIdConverter;
45
+ this.rateLimiter = rateLimiter;
16
46
  this.logger = new common_1.Logger(MicrosoftSubscriptionService_1.name);
17
47
  this.graphApiBaseUrl = 'https://graph.microsoft.com/v1.0';
18
48
  this.msAuthUrl = 'https://login.microsoftonline.com/common/oauth2/v2.0';
@@ -68,6 +98,235 @@ let MicrosoftSubscriptionService = MicrosoftSubscriptionService_1 = class Micros
68
98
  throw error;
69
99
  }
70
100
  }
101
+ async createWebhookSubscription(externalUserId) {
102
+ var _a, _b;
103
+ const internalUserId = await this.userIdConverter.externalToInternal(externalUserId, { cache: false });
104
+ const correlationId = `webhook-${internalUserId}-${Date.now()}`;
105
+ this.logger.log(`[${correlationId}] Starting webhook subscription creation for user ${internalUserId}`);
106
+ try {
107
+ this.logger.log(`[${correlationId}] Fetching access token for user ${internalUserId}`);
108
+ const accessToken = await this.microsoftAuthService.getUserAccessToken({ internalUserId, cache: false });
109
+ this.logger.log(`[${correlationId}] Successfully obtained access token`);
110
+ const expirationDateTime = new Date();
111
+ expirationDateTime.setHours(expirationDateTime.getHours() + 72);
112
+ const appUrl = this.microsoftConfig.backendBaseUrl || "http://localhost:3000";
113
+ const basePath = this.microsoftConfig.basePath;
114
+ const basePathUrl = basePath ? `${appUrl}/${basePath}` : appUrl;
115
+ const webhookPath = this.microsoftConfig.calendarWebhookPath || '/calendar/webhook';
116
+ const notificationUrl = `${basePathUrl}${webhookPath}`;
117
+ const subscriptionData = {
118
+ changeType: "created,updated,deleted",
119
+ notificationUrl,
120
+ lifecycleNotificationUrl: notificationUrl,
121
+ resource: "/me/events",
122
+ expirationDateTime: expirationDateTime.toISOString(),
123
+ clientState: `user_${internalUserId}_${(0, crypto_1.randomUUID)()}`,
124
+ };
125
+ this.logger.log(`[${correlationId}] Creating webhook subscription with notificationUrl: ${notificationUrl}`);
126
+ this.logger.debug(`[${correlationId}] Subscription data: ${JSON.stringify(subscriptionData)}`);
127
+ this.logger.log(`[${correlationId}] Sending POST request to Microsoft Graph API`);
128
+ const response = await (0, outlook_api_executor_util_1.executeGraphApiCall)(() => axios_1.default.post(`${this.graphApiBaseUrl}/subscriptions`, subscriptionData, {
129
+ headers: {
130
+ Authorization: `Bearer ${accessToken}`,
131
+ "Content-Type": "application/json",
132
+ "Prefer": 'IdType="ImmutableId"',
133
+ },
134
+ }), {
135
+ logger: this.logger,
136
+ resourceName: `create webhook subscription for user ${internalUserId}`,
137
+ maxRetries: 7,
138
+ });
139
+ if (!(response === null || response === void 0 ? void 0 : response.data)) {
140
+ throw new Error('Subscription creation returned null response');
141
+ }
142
+ this.logger.log(`[${correlationId}] Created webhook subscription ${response.data.id || "unknown"} for user ${internalUserId}`);
143
+ this.logger.log(`[${correlationId}] Saving subscription to database (internalUserId: ${internalUserId}, externalUserId: ${externalUserId})`);
144
+ await this.webhookSubscriptionRepository.saveSubscription({
145
+ subscriptionId: response.data.id,
146
+ userId: internalUserId,
147
+ resource: response.data.resource,
148
+ changeType: response.data.changeType,
149
+ clientState: response.data.clientState || "",
150
+ notificationUrl: response.data.notificationUrl,
151
+ expirationDateTime: response.data.expirationDateTime
152
+ ? new Date(response.data.expirationDateTime)
153
+ : new Date(),
154
+ });
155
+ this.logger.log(`[${correlationId}] Successfully stored subscription in database`);
156
+ this.logger.log(`[${correlationId}] Webhook subscription creation completed successfully`);
157
+ return response.data;
158
+ }
159
+ catch (error) {
160
+ if (axios_1.default.isAxiosError(error)) {
161
+ this.logger.error(`[${correlationId}] Microsoft Graph API error: Status ${(_a = error.response) === null || _a === void 0 ? void 0 : _a.status}, ` +
162
+ `Message: ${JSON.stringify((_b = error.response) === null || _b === void 0 ? void 0 : _b.data)}`);
163
+ }
164
+ else {
165
+ this.logger.error(`[${correlationId}] Failed to create webhook subscription:`, error);
166
+ }
167
+ throw new Error(`Failed to create webhook subscription: ${error instanceof Error ? error.message : 'Unknown error'}`);
168
+ }
169
+ }
170
+ async renewWebhookSubscription(subscriptionId, internalUserId) {
171
+ var _a, _b;
172
+ const correlationId = `renew-${subscriptionId}-${Date.now()}`;
173
+ try {
174
+ this.logger.log(`[${correlationId}] Attempting to renew subscription ${subscriptionId} for user ${internalUserId}`);
175
+ const user = await this.microsoftUserRepository.findOne({
176
+ where: { id: internalUserId, isActive: true }
177
+ });
178
+ if (!user) {
179
+ this.logger.warn(`[${correlationId}] User ${internalUserId} not found or inactive. ` +
180
+ `Deactivating subscription ${subscriptionId}`);
181
+ await this.webhookSubscriptionRepository.deactivateSubscription(subscriptionId);
182
+ throw new Error(`Cannot renew subscription ${subscriptionId}: ` +
183
+ `User ${internalUserId} not found or inactive. ` +
184
+ `Subscription has been automatically deactivated.`);
185
+ }
186
+ this.logger.debug(`[${correlationId}] User ${internalUserId} validated successfully`);
187
+ const accessToken = await this.microsoftAuthService.getUserAccessToken({
188
+ internalUserId
189
+ });
190
+ this.logger.debug(`[${correlationId}] Access token obtained`);
191
+ const expirationDateTime = new Date();
192
+ expirationDateTime.setHours(expirationDateTime.getHours() + 72);
193
+ const renewalData = {
194
+ expirationDateTime: expirationDateTime.toISOString(),
195
+ };
196
+ this.logger.debug(`[${correlationId}] Calling Microsoft Graph API to renew subscription`);
197
+ const response = await (0, outlook_api_executor_util_1.executeGraphApiCall)(() => axios_1.default.patch(`${this.graphApiBaseUrl}/subscriptions/${subscriptionId}`, renewalData, {
198
+ headers: {
199
+ Authorization: `Bearer ${accessToken}`,
200
+ "Content-Type": "application/json",
201
+ "Prefer": 'IdType="ImmutableId"',
202
+ },
203
+ }), {
204
+ logger: this.logger,
205
+ resourceName: `renew webhook subscription ${subscriptionId} for user ${internalUserId}`,
206
+ maxRetries: 7,
207
+ });
208
+ if (!(response === null || response === void 0 ? void 0 : response.data)) {
209
+ throw new Error('Subscription renewal returned null response');
210
+ }
211
+ this.logger.debug(`[${correlationId}] Microsoft Graph API returned status: ${response.status}`);
212
+ if (response.data.expirationDateTime) {
213
+ await this.webhookSubscriptionRepository.updateSubscriptionExpiration(subscriptionId, new Date(response.data.expirationDateTime));
214
+ this.logger.debug(`[${correlationId}] Updated local database with new expiration: ${response.data.expirationDateTime}`);
215
+ }
216
+ this.logger.log(`[${correlationId}] Successfully renewed subscription ${subscriptionId}. ` +
217
+ `New expiration: ${response.data.expirationDateTime}`);
218
+ return response.data;
219
+ }
220
+ catch (error) {
221
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
222
+ if (axios_1.default.isAxiosError(error)) {
223
+ const statusCode = (_a = error.response) === null || _a === void 0 ? void 0 : _a.status;
224
+ if (statusCode === 404) {
225
+ const outcome = await this.handleSubscriptionNotFoundAtMicrosoft(subscriptionId, internalUserId, 'renewal_404', correlationId);
226
+ if (outcome === 'recreated') {
227
+ return {};
228
+ }
229
+ throw new Error(`Subscription ${subscriptionId} not found at Microsoft. ` +
230
+ `Subscription has been deactivated and re-creation failed.`);
231
+ }
232
+ if (statusCode === 401 || statusCode === 403) {
233
+ this.logger.error(`[${correlationId}] Authentication failed for subscription ${subscriptionId}. ` +
234
+ `Status: ${statusCode}, Response: ${JSON.stringify((_b = error.response) === null || _b === void 0 ? void 0 : _b.data)}. ` +
235
+ `Deactivating subscription to prevent repeated failures.`);
236
+ await this.webhookSubscriptionRepository.deactivateSubscription(subscriptionId);
237
+ this.eventEmitter.emit(event_types_enum_1.OutlookEventTypes.SUBSCRIPTION_AUTH_FAILED, {
238
+ subscriptionId,
239
+ userId: internalUserId,
240
+ statusCode,
241
+ });
242
+ }
243
+ if (statusCode === 429) {
244
+ this.logger.warn(`[${correlationId}] Rate limited by Microsoft Graph API for subscription ${subscriptionId}`);
245
+ }
246
+ }
247
+ this.logger.error(`[${correlationId}] Failed to renew subscription ${subscriptionId}: ${errorMessage}`);
248
+ throw new Error(`Failed to renew webhook subscription: ${errorMessage}`);
249
+ }
250
+ }
251
+ async deleteWebhookSubscription(subscriptionId, userId) {
252
+ var _a;
253
+ const correlationId = `delete-sub-${subscriptionId}-${Date.now()}`;
254
+ try {
255
+ this.logger.log(`[${correlationId}] Deleting calendar subscription ${subscriptionId} for user ${userId}`);
256
+ const internalUserId = await this.userIdConverter.toInternalUserId(userId);
257
+ const accessToken = await this.microsoftAuthService.getUserAccessToken({
258
+ internalUserId,
259
+ includeInactive: true
260
+ });
261
+ this.logger.debug(`[${correlationId}] Access token obtained`);
262
+ this.logger.debug(`[${correlationId}] Calling Microsoft Graph API to delete subscription`);
263
+ await this.deleteSubscription(subscriptionId, accessToken);
264
+ this.logger.log(`[${correlationId}] Successfully deleted subscription ${subscriptionId} at Microsoft`);
265
+ await this.webhookSubscriptionRepository.deactivateSubscription(subscriptionId);
266
+ this.logger.debug(`[${correlationId}] Deactivated subscription in local database`);
267
+ const otherActiveSubscriptions = await this.webhookSubscriptionRepository.count({
268
+ where: {
269
+ userId: internalUserId,
270
+ isActive: true,
271
+ subscriptionId: (0, typeorm_2.Not)(subscriptionId)
272
+ }
273
+ });
274
+ if (otherActiveSubscriptions === 0) {
275
+ const updateCriteria = typeof userId === 'string' ? { externalUserId: userId } : { id: userId };
276
+ await this.microsoftUserRepository.update(updateCriteria, { isActive: false });
277
+ this.logger.debug(`[${correlationId}] Marked Microsoft user as inactive - no other subscriptions remain`);
278
+ }
279
+ else {
280
+ this.logger.debug(`[${correlationId}] User still has ${otherActiveSubscriptions} other active subscription(s), keeping user active`);
281
+ }
282
+ this.logger.log(`[${correlationId}] Successfully deleted calendar subscription ${subscriptionId}`);
283
+ return true;
284
+ }
285
+ catch (error) {
286
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
287
+ if (axios_1.default.isAxiosError(error) && ((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) === 404) {
288
+ this.logger.log(`[${correlationId}] Subscription ${subscriptionId} not found at Microsoft, ` +
289
+ `cleaning up local database`);
290
+ await this.webhookSubscriptionRepository.deactivateSubscription(subscriptionId);
291
+ this.logger.log(`[${correlationId}] Successfully cleaned up orphaned subscription ${subscriptionId}`);
292
+ return true;
293
+ }
294
+ this.logger.error(`[${correlationId}] Failed to delete subscription ${subscriptionId}: ${errorMessage}`);
295
+ throw new Error(`Failed to delete webhook subscription: ${errorMessage}`);
296
+ }
297
+ }
298
+ async getSubscription(subscriptionId) {
299
+ return this.webhookSubscriptionRepository.findBySubscriptionId(subscriptionId);
300
+ }
301
+ async getActiveSubscriptionForUser(externalUserId) {
302
+ var _a;
303
+ try {
304
+ const internalUserId = await this.userIdConverter.externalToInternal(externalUserId, { cache: false });
305
+ const user = await this.microsoftUserRepository.findOne({
306
+ select: ['id', 'status'],
307
+ where: { id: internalUserId },
308
+ });
309
+ if (!user || user.status === microsoft_user_status_enum_1.MicrosoftUserStatus.CORRUPTED) {
310
+ this.logger.debug(`[getActiveSubscriptionForUser] User ${externalUserId} is missing or CORRUPTED — reporting as not connected`);
311
+ return null;
312
+ }
313
+ this.logger.log(`[getActiveSubscriptionForUser] Getting active subscription for user ${externalUserId} (internalUserId: ${internalUserId})`);
314
+ const subscription = await this.webhookSubscriptionRepository.findActiveByUserId(internalUserId);
315
+ this.logger.log(`[getActiveSubscriptionForUser] Found subscription: ${subscription === null || subscription === void 0 ? void 0 : subscription.subscriptionId}`);
316
+ return (_a = subscription === null || subscription === void 0 ? void 0 : subscription.subscriptionId) !== null && _a !== void 0 ? _a : null;
317
+ }
318
+ catch (_b) {
319
+ this.logger.debug(`No active subscription for user ${externalUserId}`);
320
+ return null;
321
+ }
322
+ }
323
+ trackNotificationReceived(subscriptionId) {
324
+ this.webhookSubscriptionRepository
325
+ .updateLastNotificationAt(subscriptionId)
326
+ .catch((err) => {
327
+ this.logger.warn(`Failed to update lastNotificationAt for subscription ${subscriptionId}: ${err instanceof Error ? err.message : 'Unknown error'}`);
328
+ });
329
+ }
71
330
  async cleanupSubscriptions(options) {
72
331
  const { accessToken, filter } = options;
73
332
  const result = {
@@ -128,6 +387,28 @@ let MicrosoftSubscriptionService = MicrosoftSubscriptionService_1 = class Micros
128
387
  filter: (sub) => { var _a; return ((_a = sub.clientState) === null || _a === void 0 ? void 0 : _a.includes(`user_${userId}_`)) || false; },
129
388
  });
130
389
  }
390
+ async cleanupSubscriptionsForUserAndResource(externalUserId, resource) {
391
+ const internalUserId = await this.userIdConverter.externalToInternal(externalUserId, { cache: false });
392
+ const accessToken = await this.microsoftAuthService.getUserAccessToken({
393
+ internalUserId,
394
+ cache: false,
395
+ });
396
+ this.logger.log(`🧹 Cleaning up ${resource} subscriptions for user ${internalUserId}`);
397
+ const result = await this.cleanupSubscriptions({
398
+ accessToken,
399
+ filter: (sub) => {
400
+ var _a;
401
+ return sub.resource === resource &&
402
+ (((_a = sub.clientState) === null || _a === void 0 ? void 0 : _a.includes(`user_${internalUserId}_`)) || false);
403
+ },
404
+ });
405
+ const dbRows = await this.webhookSubscriptionRepository
406
+ .findAllActiveByUserIdAndResource(internalUserId, resource);
407
+ for (const row of dbRows) {
408
+ await this.webhookSubscriptionRepository.deactivateSubscription(row.subscriptionId);
409
+ }
410
+ return result;
411
+ }
131
412
  async revokeTokens(refreshToken) {
132
413
  try {
133
414
  if (!refreshToken) {
@@ -158,9 +439,230 @@ let MicrosoftSubscriptionService = MicrosoftSubscriptionService_1 = class Micros
158
439
  this.logger.log('✅ Full cleanup completed');
159
440
  return result;
160
441
  }
442
+ async verifySubscriptionHealth() {
443
+ const correlationId = `health-check-${Date.now()}`;
444
+ try {
445
+ const allActiveSubs = await this.webhookSubscriptionRepository.findActiveSubscriptions();
446
+ if (allActiveSubs.length === 0) {
447
+ this.logger.debug(`[${correlationId}] No active subscriptions to verify`);
448
+ return;
449
+ }
450
+ const corruptedUserIds = await this.findCorruptedUserIds(allActiveSubs);
451
+ const activeSubs = corruptedUserIds.size > 0
452
+ ? allActiveSubs.filter((sub) => !corruptedUserIds.has(sub.userId))
453
+ : allActiveSubs;
454
+ const skipped = allActiveSubs.length - activeSubs.length;
455
+ if (skipped > 0) {
456
+ this.logger.log(`[${correlationId}] Skipping ${skipped} sub(s) owned by ${corruptedUserIds.size} CORRUPTED user(s)`);
457
+ }
458
+ const expiringSoon = this.filterExpiringSoon(activeSubs, HEALTH_CHECK_WINDOW_HOURS);
459
+ this.logger.log(`[${correlationId}] Health check: ${activeSubs.length} active, ${expiringSoon.length} expiring within ${HEALTH_CHECK_WINDOW_HOURS}h`);
460
+ const counters = { verified: 0, recreated: 0, renewed: 0, staleDetected: 0, failed: 0 };
461
+ counters.staleDetected = this.detectStaleSubscriptions(activeSubs, correlationId);
462
+ if (expiringSoon.length > 0) {
463
+ const byUser = this.groupByUserId(expiringSoon);
464
+ for (const [userId, userSubs] of byUser) {
465
+ const perUser = await this.verifySubscriptionsForUser(userId, userSubs, correlationId);
466
+ counters.verified += perUser.verified;
467
+ counters.recreated += perUser.recreated;
468
+ counters.renewed += perUser.renewed;
469
+ counters.failed += perUser.failed;
470
+ }
471
+ }
472
+ this.logger.log(`[${correlationId}] Health check complete: ${counters.verified} verified, ${counters.recreated} recreated, ${counters.renewed} renewed, ${counters.staleDetected} stale-detected, ${counters.failed} failed`);
473
+ }
474
+ catch (error) {
475
+ this.logger.error(`[${correlationId}] Subscription health check job failed:`, error);
476
+ }
477
+ }
478
+ async findCorruptedUserIds(subs) {
479
+ const userIds = Array.from(new Set(subs.map((s) => s.userId)));
480
+ if (userIds.length === 0)
481
+ return new Set();
482
+ const rows = await this.microsoftUserRepository.find({
483
+ select: ['id'],
484
+ where: { id: (0, typeorm_2.In)(userIds), status: microsoft_user_status_enum_1.MicrosoftUserStatus.CORRUPTED },
485
+ });
486
+ return new Set(rows.map((u) => u.id));
487
+ }
488
+ filterExpiringSoon(subs, hoursAhead) {
489
+ const threshold = new Date(Date.now() + hoursAhead * 3600 * 1000);
490
+ return subs.filter((sub) => sub.expirationDateTime < threshold);
491
+ }
492
+ groupByUserId(subs) {
493
+ const byUser = new Map();
494
+ for (const sub of subs) {
495
+ const bucket = byUser.get(sub.userId);
496
+ if (bucket)
497
+ bucket.push(sub);
498
+ else
499
+ byUser.set(sub.userId, [sub]);
500
+ }
501
+ return byUser;
502
+ }
503
+ detectStaleSubscriptions(subs, correlationId) {
504
+ const staleThreshold = new Date(Date.now() - STALE_NOTIFICATION_THRESHOLD_HOURS * 3600 * 1000);
505
+ let staleDetected = 0;
506
+ for (const sub of subs) {
507
+ if (!sub.lastNotificationAt || sub.lastNotificationAt >= staleThreshold)
508
+ continue;
509
+ this.logger.warn(`[${correlationId}] Subscription ${sub.subscriptionId} has not received notifications since ${sub.lastNotificationAt.toISOString()}. Emitting LIFECYCLE_MISSED for delta sync.`);
510
+ this.eventEmitter.emit(event_types_enum_1.OutlookEventTypes.LIFECYCLE_MISSED, {
511
+ subscriptionId: sub.subscriptionId,
512
+ userId: sub.userId,
513
+ reason: 'health_check_stale',
514
+ });
515
+ staleDetected++;
516
+ }
517
+ return staleDetected;
518
+ }
519
+ async verifySubscriptionsForUser(userId, userSubs, correlationId) {
520
+ const totals = { verified: 0, recreated: 0, renewed: 0, staleDetected: 0, failed: 0 };
521
+ let externalUserId;
522
+ let accessToken;
523
+ try {
524
+ externalUserId = await this.userIdConverter.internalToExternal(userId);
525
+ accessToken = await this.microsoftAuthService.getUserAccessToken({ internalUserId: userId });
526
+ }
527
+ catch (error) {
528
+ totals.failed += userSubs.length;
529
+ this.logger.error(`[${correlationId}] Token fetch failed for user ${userId}; skipping ${userSubs.length} sub(s):`, error);
530
+ return totals;
531
+ }
532
+ for (let offset = 0; offset < userSubs.length; offset += GRAPH_BATCH_SIZE) {
533
+ const chunk = userSubs.slice(offset, offset + GRAPH_BATCH_SIZE);
534
+ const chunkTotals = await this.verifySubscriptionsBatch(chunk, userId, externalUserId, accessToken, correlationId);
535
+ totals.verified += chunkTotals.verified;
536
+ totals.recreated += chunkTotals.recreated;
537
+ totals.renewed += chunkTotals.renewed;
538
+ totals.failed += chunkTotals.failed;
539
+ }
540
+ return totals;
541
+ }
542
+ async verifySubscriptionsBatch(chunk, userId, externalUserId, accessToken, correlationId) {
543
+ const totals = { verified: 0, recreated: 0, renewed: 0, staleDetected: 0, failed: 0 };
544
+ await this.rateLimiter.acquirePermit(externalUserId);
545
+ const batchPayload = {
546
+ requests: chunk.map((sub, index) => ({
547
+ id: String(index),
548
+ method: 'GET',
549
+ url: `/subscriptions/${sub.subscriptionId}`,
550
+ headers: { 'Prefer': 'IdType="ImmutableId"' },
551
+ })),
552
+ };
553
+ try {
554
+ const response = await (0, outlook_api_executor_util_1.executeGraphApiCall)(() => axios_1.default.post(`${this.graphApiBaseUrl}/$batch`, batchPayload, {
555
+ headers: {
556
+ Authorization: `Bearer ${accessToken}`,
557
+ 'Content-Type': 'application/json',
558
+ },
559
+ }), {
560
+ logger: this.logger,
561
+ resourceName: `verify batch (user ${userId}, ${chunk.length} subs)`,
562
+ maxRetries: 2,
563
+ });
564
+ if (!(response === null || response === void 0 ? void 0 : response.data)) {
565
+ totals.failed += chunk.length;
566
+ this.logger.error(`[${correlationId}] Batch verify returned null for user ${userId}`);
567
+ return totals;
568
+ }
569
+ for (const item of response.data.responses) {
570
+ const sub = chunk[parseInt(item.id, 10)];
571
+ if (!sub)
572
+ continue;
573
+ const itemTotals = await this.handleBatchResponseItem(sub, item, correlationId);
574
+ totals.verified += itemTotals.verified;
575
+ totals.recreated += itemTotals.recreated;
576
+ totals.renewed += itemTotals.renewed;
577
+ totals.failed += itemTotals.failed;
578
+ }
579
+ }
580
+ catch (error) {
581
+ totals.failed += chunk.length;
582
+ this.logger.error(`[${correlationId}] Batch verify failed for user ${userId} (${chunk.length} subs):`, error);
583
+ }
584
+ return totals;
585
+ }
586
+ async handleBatchResponseItem(sub, item, correlationId) {
587
+ const totals = { verified: 0, recreated: 0, renewed: 0, staleDetected: 0, failed: 0 };
588
+ if (item.status === 200) {
589
+ totals.verified = 1;
590
+ if (await this.maybeRenewIfExpiringSoon(sub, item.body, correlationId)) {
591
+ totals.renewed = 1;
592
+ }
593
+ return totals;
594
+ }
595
+ if (item.status === 404) {
596
+ const result = await this.handleSubscriptionNotFoundAtMicrosoft(sub.subscriptionId, sub.userId, 'health_check_404', correlationId);
597
+ if (result === 'recreated')
598
+ totals.recreated = 1;
599
+ else
600
+ totals.failed = 1;
601
+ return totals;
602
+ }
603
+ totals.failed = 1;
604
+ this.logger.error(`[${correlationId}] Unexpected status ${item.status} for sub ${sub.subscriptionId}: ${JSON.stringify(item.body)}`);
605
+ return totals;
606
+ }
607
+ async maybeRenewIfExpiringSoon(sub, graphSub, correlationId) {
608
+ if (!graphSub.expirationDateTime)
609
+ return false;
610
+ const expiration = new Date(graphSub.expirationDateTime);
611
+ const renewalThreshold = new Date(Date.now() + FORCE_RENEWAL_WINDOW_HOURS * 3600 * 1000);
612
+ if (expiration >= renewalThreshold)
613
+ return false;
614
+ this.logger.log(`[${correlationId}] Subscription ${sub.subscriptionId} expires within ${FORCE_RENEWAL_WINDOW_HOURS}h. Forcing renewal.`);
615
+ try {
616
+ await this.renewWebhookSubscription(sub.subscriptionId, sub.userId);
617
+ }
618
+ catch (error) {
619
+ this.logger.warn(`[${correlationId}] Forced renewal of ${sub.subscriptionId} failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
620
+ }
621
+ return true;
622
+ }
623
+ async handleSubscriptionNotFoundAtMicrosoft(subscriptionId, internalUserId, reason, correlationId) {
624
+ this.logger.warn(`[${correlationId}] Subscription ${subscriptionId} not found at Microsoft. Deactivating and attempting re-creation.`);
625
+ await this.webhookSubscriptionRepository.deactivateSubscription(subscriptionId);
626
+ try {
627
+ const externalUserId = await this.userIdConverter.internalToExternal(internalUserId);
628
+ await this.createWebhookSubscription(externalUserId);
629
+ this.logger.log(`[${correlationId}] Successfully re-created subscription for user ${internalUserId} after 404`);
630
+ this.eventEmitter.emit(event_types_enum_1.OutlookEventTypes.SUBSCRIPTION_RECREATED, {
631
+ subscriptionId,
632
+ userId: internalUserId,
633
+ reason,
634
+ });
635
+ return 'recreated';
636
+ }
637
+ catch (recreateError) {
638
+ const recreateMsg = recreateError instanceof Error ? recreateError.message : 'Unknown error';
639
+ this.logger.error(`[${correlationId}] Failed to re-create subscription for user ${internalUserId}: ${recreateMsg}`);
640
+ this.eventEmitter.emit(event_types_enum_1.OutlookEventTypes.SUBSCRIPTION_RECREATION_FAILED, {
641
+ subscriptionId,
642
+ userId: internalUserId,
643
+ reason,
644
+ error: recreateMsg,
645
+ });
646
+ return 'failed';
647
+ }
648
+ }
161
649
  };
162
650
  exports.MicrosoftSubscriptionService = MicrosoftSubscriptionService;
651
+ __decorate([
652
+ (0, schedule_1.Cron)('0 */6 * * *'),
653
+ __metadata("design:type", Function),
654
+ __metadata("design:paramtypes", []),
655
+ __metadata("design:returntype", Promise)
656
+ ], MicrosoftSubscriptionService.prototype, "verifySubscriptionHealth", null);
163
657
  exports.MicrosoftSubscriptionService = MicrosoftSubscriptionService = MicrosoftSubscriptionService_1 = __decorate([
164
- (0, common_1.Injectable)()
658
+ (0, common_1.Injectable)(),
659
+ __param(0, (0, common_1.Inject)((0, common_1.forwardRef)(() => microsoft_auth_service_1.MicrosoftAuthService))),
660
+ __param(3, (0, common_1.Inject)(constants_1.MICROSOFT_CONFIG)),
661
+ __param(4, (0, typeorm_1.InjectRepository)(microsoft_user_entity_1.MicrosoftUser)),
662
+ __metadata("design:paramtypes", [microsoft_auth_service_1.MicrosoftAuthService,
663
+ outlook_webhook_subscription_repository_1.OutlookWebhookSubscriptionRepository,
664
+ event_emitter_1.EventEmitter2, Object, typeorm_2.Repository,
665
+ user_id_converter_service_1.UserIdConverterService,
666
+ graph_rate_limiter_service_1.GraphRateLimiterService])
165
667
  ], MicrosoftSubscriptionService);
166
668
  //# sourceMappingURL=microsoft-subscription.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"microsoft-subscription.service.js","sourceRoot":"","sources":["../../../src/services/subscription/microsoft-subscription.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"microsoft-subscription.service.js","sourceRoot":"","sources":["../../../src/services/subscription/microsoft-subscription.service.ts"],"names":[],"mappings":"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"}