@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
JavaScript
;
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