From 4ad8d8e98ed57853f404b756319a356d12d51050 Mon Sep 17 00:00:00 2001 From: martmull Date: Thu, 4 Jun 2026 11:14:51 +0200 Subject: [PATCH] Set 200 code for post requests (#21214) as title, nestJS use to set 201 for post requests but some services (like google) requests 200 response code See https://discord.com/channels/1130383047699738754/1511054250971758642/1511785364027609099 for context --- .../route-trigger.controller.spec.ts | 60 +++++++++++++++++++ .../route-trigger/route-trigger.controller.ts | 7 +++ 2 files changed, 67 insertions(+) create mode 100644 packages/twenty-server/src/engine/metadata-modules/route-trigger/__tests__/route-trigger.controller.spec.ts diff --git a/packages/twenty-server/src/engine/metadata-modules/route-trigger/__tests__/route-trigger.controller.spec.ts b/packages/twenty-server/src/engine/metadata-modules/route-trigger/__tests__/route-trigger.controller.spec.ts new file mode 100644 index 0000000000..2b7fcd4c52 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/route-trigger/__tests__/route-trigger.controller.spec.ts @@ -0,0 +1,60 @@ +import { HttpStatus } from '@nestjs/common'; +import { HTTP_CODE_METADATA } from '@nestjs/common/constants'; + +import { type Request } from 'express'; +import { HTTPMethod } from 'twenty-shared/types'; + +import { RouteTriggerService } from 'src/engine/core-modules/logic-function/logic-function-trigger/triggers/route/route-trigger.service'; +import { RouteTriggerController } from 'src/engine/metadata-modules/route-trigger/route-trigger.controller'; + +describe('RouteTriggerController', () => { + let controller: RouteTriggerController; + const handle = jest.fn(); + + beforeEach(() => { + const routeTriggerService = { + handle, + } as unknown as RouteTriggerService; + + controller = new RouteTriggerController(routeTriggerService); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); + + describe('response status code', () => { + it.each([ + ['get', RouteTriggerController.prototype.get], + ['post', RouteTriggerController.prototype.post], + ['put', RouteTriggerController.prototype.put], + ['patch', RouteTriggerController.prototype.patch], + ['delete', RouteTriggerController.prototype.delete], + ])('should respond with 200 for %s', (_method, handler) => { + const httpCode = Reflect.getMetadata(HTTP_CODE_METADATA, handler); + + expect(httpCode).toBe(HttpStatus.OK); + }); + }); + + describe('post', () => { + it('should delegate to the service with the POST http method', async () => { + const request = { path: '/s/webhooks/google/leads' } as Request; + const expectedResult = {}; + + handle.mockResolvedValue(expectedResult); + + const result = await controller.post(request); + + expect(handle).toHaveBeenCalledWith({ + request, + httpMethod: HTTPMethod.POST, + }); + expect(result).toBe(expectedResult); + }); + }); +}); diff --git a/packages/twenty-server/src/engine/metadata-modules/route-trigger/route-trigger.controller.ts b/packages/twenty-server/src/engine/metadata-modules/route-trigger/route-trigger.controller.ts index 11f2e2e399..dbfbd29a8a 100644 --- a/packages/twenty-server/src/engine/metadata-modules/route-trigger/route-trigger.controller.ts +++ b/packages/twenty-server/src/engine/metadata-modules/route-trigger/route-trigger.controller.ts @@ -2,6 +2,8 @@ import { Controller, Delete, Get, + HttpCode, + HttpStatus, Patch, Post, Put, @@ -25,6 +27,7 @@ export class RouteTriggerController { constructor(private readonly routeTriggerService: RouteTriggerService) {} @Get('*path') + @HttpCode(HttpStatus.OK) async get(@Req() request: Request) { return await this.routeTriggerService.handle({ request, @@ -33,6 +36,7 @@ export class RouteTriggerController { } @Post('*path') + @HttpCode(HttpStatus.OK) async post(@Req() request: Request) { return await this.routeTriggerService.handle({ request, @@ -41,6 +45,7 @@ export class RouteTriggerController { } @Put('*path') + @HttpCode(HttpStatus.OK) async put(@Req() request: Request) { return await this.routeTriggerService.handle({ request, @@ -49,6 +54,7 @@ export class RouteTriggerController { } @Patch('*path') + @HttpCode(HttpStatus.OK) async patch(@Req() request: Request) { return await this.routeTriggerService.handle({ request, @@ -57,6 +63,7 @@ export class RouteTriggerController { } @Delete('*path') + @HttpCode(HttpStatus.OK) async delete(@Req() request: Request) { return await this.routeTriggerService.handle({ request,