* 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>
93 lines
3.2 KiB
TypeScript
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),
|
|
});
|
|
}
|
|
}
|