UNPKG

@checkfirst/nestjs-outlook

Version:

An opinionated NestJS module for Microsoft Outlook integration that provides easy access to Microsoft Graph API for emails, calendars, and more.

105 lines 4.72 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 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; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var DeltaSyncService_1; Object.defineProperty(exports, "__esModule", { value: true }); exports.DeltaSyncService = exports.DeltaSyncError = void 0; const common_1 = require("@nestjs/common"); const outlook_delta_link_repository_1 = require("../../repositories/outlook-delta-link.repository"); const resource_type_enum_1 = require("../../enums/resource-type.enum"); class DeltaSyncError extends Error { constructor(message, code, statusCode) { super(message); this.code = code; this.statusCode = statusCode; this.name = 'DeltaSyncError'; } } exports.DeltaSyncError = DeltaSyncError; let DeltaSyncService = DeltaSyncService_1 = class DeltaSyncService { constructor(deltaLinkRepository) { this.deltaLinkRepository = deltaLinkRepository; this.logger = new common_1.Logger(DeltaSyncService_1.name); this.MAX_RETRIES = 3; this.RETRY_DELAY_MS = 1000; } async delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async retryWithBackoff(operation, retryCount = 0) { try { return await operation(); } catch (error) { if (retryCount >= this.MAX_RETRIES) { throw error; } const delayMs = this.RETRY_DELAY_MS * Math.pow(2, retryCount); await this.delay(delayMs); return this.retryWithBackoff(operation, retryCount + 1); } } handleDeltaResponse(response, userId, resourceType) { var _a; if ((_a = response['@odata.deltaLink']) === null || _a === void 0 ? void 0 : _a.includes('$deltatoken=')) { this.logger.log(`Sync reset detected for user ${userId}, resource ${resourceType}`); void this.deltaLinkRepository.saveDeltaLink(userId, resourceType, ''); } if (response['@odata.deltaLink']) { const tokenExpiry = this.calculateTokenExpiry(resourceType); this.logger.log(`Delta token will expire at ${tokenExpiry.toISOString()}`); } } calculateTokenExpiry(resourceType) { const now = new Date(); if (resourceType === resource_type_enum_1.ResourceType.CALENDAR) { return new Date(now.getTime() + 6 * 24 * 60 * 60 * 1000); } return new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000); } handleReplays(items) { var _a; const uniqueItems = new Map(); for (const item of items) { if (item.id) { if (item['@removed']) { uniqueItems.set(item.id, item); } else if (!uniqueItems.has(item.id) || !((_a = uniqueItems.get(item.id)) === null || _a === void 0 ? void 0 : _a['@removed'])) { uniqueItems.set(item.id, item); } } } return Array.from(uniqueItems.values()); } async fetchAndSortChanges(client, requestUrl) { const allItems = []; let response = { '@odata.nextLink': requestUrl, value: [] }; while (response['@odata.nextLink']) { const nextLink = response['@odata.nextLink']; response = await client.api(nextLink).get(); allItems.push(...response.value); } return allItems.sort((a, b) => { const aTime = a.lastModifiedDateTime || a.createdDateTime; const bTime = b.lastModifiedDateTime || b.createdDateTime; return new Date(aTime).getTime() - new Date(bTime).getTime(); }); } getDeltaLink(response) { return response['@odata.deltaLink'] || null; } }; exports.DeltaSyncService = DeltaSyncService; exports.DeltaSyncService = DeltaSyncService = DeltaSyncService_1 = __decorate([ (0, common_1.Injectable)(), __metadata("design:paramtypes", [outlook_delta_link_repository_1.OutlookDeltaLinkRepository]) ], DeltaSyncService); //# sourceMappingURL=delta-sync.service.js.map