diff --git a/apps/api/v2/src/vercel-webhook.controller.ts b/apps/api/v2/src/vercel-webhook.controller.ts index ee7385e02a..3f2ace8a7d 100644 --- a/apps/api/v2/src/vercel-webhook.controller.ts +++ b/apps/api/v2/src/vercel-webhook.controller.ts @@ -27,8 +27,25 @@ export class VercelWebhookController { @Post("deployment-promoted") @UseGuards(VercelWebhookGuard) @HttpCode(HttpStatus.OK) - async handlePromotion(@Body() payload: VercelWebhookPayload): Promise<{ status: string; version: string }> { + async handlePromotion( + @Body() rawBody: Buffer | VercelWebhookPayload + ): Promise<{ status: string; version: string }> { + // RawBodyMiddleware provides a Buffer, need to parse it + // In test environment, body may already be parsed as object + let payload: VercelWebhookPayload; + if (Buffer.isBuffer(rawBody)) { + try { + payload = JSON.parse(rawBody.toString("utf-8")) as VercelWebhookPayload; + } catch { + this.logger.error("Failed to parse webhook payload as JSON"); + return { status: "error", version: "" }; + } + } else { + payload = rawBody; + } + if (payload.type !== "deployment.promoted") { + this.logger.log(`Ignoring webhook event type: ${payload.type}`); return { status: "ignored", version: "" }; }