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