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.

72 lines 3.07 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WebhookResourceType = void 0; exports.validateNotificationItem = validateNotificationItem; exports.validateChangeType = validateChangeType; var WebhookResourceType; (function (WebhookResourceType) { WebhookResourceType["CALENDAR"] = "calendar"; WebhookResourceType["EMAIL"] = "email"; })(WebhookResourceType || (exports.WebhookResourceType = WebhookResourceType = {})); const EXPECTED_ODATA_TYPES = { [WebhookResourceType.CALENDAR]: '#microsoft.graph.event', [WebhookResourceType.EMAIL]: '#microsoft.graph.message', }; const LOG_PREFIXES = { [WebhookResourceType.CALENDAR]: '[CALENDAR_WEBHOOK]', [WebhookResourceType.EMAIL]: '[EMAIL_WEBHOOK]', }; const hasODataTypeMismatch = (actual, expected) => { return (actual === null || actual === void 0 ? void 0 : actual.toLowerCase()) !== expected.toLowerCase(); }; function validateNotificationItem(item, resourceType, logger) { const logPrefix = LOG_PREFIXES[resourceType]; const expectedODataType = EXPECTED_ODATA_TYPES[resourceType]; if (!item.subscriptionId || !item.resource) { logger.warn(`${logPrefix} Missing required fields (subscriptionId or resource)`); return { isValid: false, shouldSkip: true, reason: 'Missing required fields', }; } const resourceData = item.resourceData; if (!resourceData) { if (item.changeType === 'deleted') { logger.warn(`${logPrefix} Missing resourceData for DELETED ${resourceType} - potential data loss. ` + `Resource: ${item.resource}, SubscriptionId: ${item.subscriptionId}, ChangeType: deleted`); } else { logger.error(`${logPrefix} CRITICAL: Missing resourceData for ${item.changeType.toUpperCase()} ${resourceType} - DATA LOSS SCENARIO. ` + `Resource: ${item.resource}, SubscriptionId: ${item.subscriptionId}, ChangeType: ${item.changeType}. ` + `Manual sync recommended for this subscription.`); } return { isValid: false, shouldSkip: true, reason: 'Missing resourceData', }; } if (hasODataTypeMismatch(resourceData['@odata.type'], expectedODataType)) { logger.warn(`${logPrefix} Invalid resource type: ${resourceData['@odata.type']}. ` + `Expected: ${expectedODataType}, Resource: ${item.resource}`); return { isValid: false, shouldSkip: true, reason: `Invalid @odata.type: expected ${expectedODataType}`, }; } return { isValid: true, shouldSkip: false, }; } function validateChangeType(changeType, logger, logPrefix) { const validChangeTypes = ['created', 'updated', 'deleted']; if (!validChangeTypes.includes(changeType)) { logger.warn(`${logPrefix} Unsupported change type: ${changeType}`); return false; } return true; } //# sourceMappingURL=webhook-notification.validator.js.map