feat: trigger webhook functionality

This commit is contained in:
Catalin Pit
2024-02-16 11:04:11 +02:00
parent 61958989b4
commit 019db27b1d
5 changed files with 117 additions and 8 deletions
@@ -0,0 +1,39 @@
import type { Document, Webhook } from '@documenso/prisma/client';
export type PostWebhookPayloadOptions = {
webhookData: Pick<Webhook, 'webhookUrl' | 'secret' | 'eventTriggers'>;
documentData: Document;
};
export const postWebhookPayload = async ({
webhookData,
documentData,
}: PostWebhookPayloadOptions) => {
const { webhookUrl, secret } = webhookData;
const payload = {
event: webhookData.eventTriggers.toString(),
createdAt: new Date().toISOString(),
webhookEndpoint: webhookUrl,
payload: documentData,
};
const response = await fetch(webhookUrl, {
method: 'POST',
body: JSON.stringify(payload),
headers: {
'Content-Type': 'application/json',
'X-Documenso-Secret': secret ?? '',
},
});
if (!response.ok) {
throw new Error(`Webhook failed with the status code ${response.status}`);
}
return {
status: response.status,
statusText: response.statusText,
message: 'Webhook sent successfully',
};
};
+30
View File
@@ -0,0 +1,30 @@
import type { Document, WebhookTriggerEvents } from '@documenso/prisma/client';
import { getAllWebhooks } from '../server-only/webhooks/get-all-webhooks';
import { postWebhookPayload } from './post-webhook-payload';
export type TriggerWebhookOptions = {
eventTrigger: WebhookTriggerEvents;
documentData: Document;
};
export const triggerWebhook = async ({ eventTrigger, documentData }: TriggerWebhookOptions) => {
try {
const allWebhooks = await getAllWebhooks({ eventTrigger });
const webhookPromises = allWebhooks.map((webhook) => {
const { webhookUrl, secret } = webhook;
postWebhookPayload({
webhookData: { webhookUrl, secret, eventTriggers: [eventTrigger] },
documentData,
}).catch((_err) => {
throw new Error(`Failed to send webhook to ${webhookUrl}`);
});
});
return Promise.all(webhookPromises);
} catch (err) {
throw new Error(`Failed to trigger webhook`);
}
};