Files
calendar/packages/features/webhooks/lib/triggerDelegationCredentialErrorWebhook.ts
T
MorganGitHubDevin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
b8530e2d78 fix: delegation credential error webhooks + refactor repeated code (#25232)
* fix: delegation credential error webhooks

* refactor: extract repeated delegation credential error webhook logic into helper methods

- Added private triggerDelegationCredentialError method in Office365CalendarService class
- Added triggerDelegationCredentialError helper function in TeamsVideoApiAdapter
- Replaced all 4 instances in Office365CalendarService with helper method call
- Replaced all 4 instances in TeamsVideoApiAdapter with helper function call
- Keeps code DRY by eliminating repeated if statement and webhook trigger logic

Co-Authored-By: morgan@cal.com <morgan@cal.com>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2025-11-18 00:00:42 +02:00

93 lines
3.2 KiB
TypeScript

import { DelegationCredentialRepository } from "@calcom/features/delegation-credentials/repositories/DelegationCredentialRepository";
import { DelegationCredentialErrorPayloadType } from "@calcom/features/webhooks/lib/dto/types";
import type { CalendarAppDelegationCredentialError } from "@calcom/lib/CalendarAppError";
import logger from "@calcom/lib/logger";
import { WebhookTriggerEvents } from "@calcom/prisma/enums";
import { WebhookRepository } from "./repository/WebhookRepository";
import sendPayload from "./sendPayload";
const log = logger.getSubLogger({ prefix: ["triggerDelegationCredentialErrorWebhook"] });
/**
* Triggers delegation credential error webhooks for organization webhooks subscribed to DELEGATION_CREDENTIAL_ERROR
*/
export async function triggerDelegationCredentialErrorWebhook(params: {
error: CalendarAppDelegationCredentialError;
credential: DelegationCredentialErrorPayloadType["credential"];
user: DelegationCredentialErrorPayloadType["user"];
delegationCredentialId: string;
}): Promise<void> {
try {
const { error, credential, user, delegationCredentialId } = params;
const delegationCredential = await DelegationCredentialRepository.findById({
id: delegationCredentialId,
});
if (!delegationCredential) {
log.debug("No delegation credential found", { delegationCredentialId });
return;
}
const webhookRepository = WebhookRepository.getInstance();
const webhooks = await webhookRepository.findByOrgIdAndTrigger({
orgId: delegationCredential.organizationId,
triggerEvent: WebhookTriggerEvents.DELEGATION_CREDENTIAL_ERROR,
});
if (webhooks.length === 0) {
log.debug("No webhooks subscribed to DELEGATION_CREDENTIAL_ERROR for organization", {
orgId: delegationCredential.organizationId,
});
return;
}
const payload = {
error: {
type: error.constructor.name,
message: error.message,
},
credential: {
id: credential.id,
type: credential.type,
appId: credential.appId || "unknown",
delegationCredentialId: delegationCredential.id,
},
user: {
id: user.id,
email: user.email,
organizationId: delegationCredential.organizationId,
},
} satisfies DelegationCredentialErrorPayloadType;
const webhookPromises = webhooks.map((webhook) =>
sendPayload(
webhook.secret,
WebhookTriggerEvents.DELEGATION_CREDENTIAL_ERROR,
new Date().toISOString(),
webhook,
payload
).catch((err) => {
log.error("Failed to send delegation credential error webhook", {
webhookId: webhook.id,
error: err instanceof Error ? err.message : String(err),
});
})
);
await Promise.allSettled(webhookPromises);
log.info("Delegation credential error webhooks triggered", {
webhookCount: webhooks.length,
userId: user.id,
credentialId: credential.id,
errorType: error.constructor.name,
});
} catch (webhookError) {
log.error("Failed to trigger delegation credential error webhook", {
error: webhookError instanceof Error ? webhookError.message : String(webhookError),
});
}
}