From 920ad4c3f26850b05bc36b33eb5f08ba43f81fea Mon Sep 17 00:00:00 2001 From: martmull Date: Wed, 8 Oct 2025 19:09:25 +0200 Subject: [PATCH] Return data or raise error in serverless controller (#14989) as title TODO validate we do not need to add a new column --- .../route-trigger/route-trigger.controller.ts | 24 ++++++++++++------- .../format-serverless-controller-response.ts | 22 +++++++++++++++++ 2 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 packages/twenty-server/src/engine/metadata-modules/route-trigger/utils/format-serverless-controller-response.ts 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 2427566b9d..cc61a87464 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 @@ -6,60 +6,68 @@ import { Post, Put, Req, - UseFilters, UseGuards, } from '@nestjs/common'; import { Request } from 'express'; -import { RestApiExceptionFilter } from 'src/engine/api/rest/rest-api-exception.filter'; import { PublicEndpointGuard } from 'src/engine/guards/public-endpoint.guard'; import { HTTPMethod } from 'src/engine/metadata-modules/route-trigger/route-trigger.entity'; import { RouteTriggerService } from 'src/engine/metadata-modules/route-trigger/route-trigger.service'; +import { formatServerlessControllerResponse } from 'src/engine/metadata-modules/route-trigger/utils/format-serverless-controller-response'; @Controller('s') @UseGuards(PublicEndpointGuard) -@UseFilters(RestApiExceptionFilter) export class RouteTriggerController { constructor(private readonly routeTriggerService: RouteTriggerService) {} @Get('*') async get(@Req() request: Request) { - return await this.routeTriggerService.handle({ + const result = await this.routeTriggerService.handle({ request, httpMethod: HTTPMethod.GET, }); + + return formatServerlessControllerResponse(result); } @Post('*') async post(@Req() request: Request) { - return await this.routeTriggerService.handle({ + const result = await this.routeTriggerService.handle({ request, httpMethod: HTTPMethod.POST, }); + + return formatServerlessControllerResponse(result); } @Put('*') async put(@Req() request: Request) { - return await this.routeTriggerService.handle({ + const result = await this.routeTriggerService.handle({ request, httpMethod: HTTPMethod.PUT, }); + + return formatServerlessControllerResponse(result); } @Patch('*') async patch(@Req() request: Request) { - return await this.routeTriggerService.handle({ + const result = await this.routeTriggerService.handle({ request, httpMethod: HTTPMethod.PATCH, }); + + return formatServerlessControllerResponse(result); } @Delete('*') async delete(@Req() request: Request) { - return await this.routeTriggerService.handle({ + const result = await this.routeTriggerService.handle({ request, httpMethod: HTTPMethod.DELETE, }); + + return formatServerlessControllerResponse(result); } } diff --git a/packages/twenty-server/src/engine/metadata-modules/route-trigger/utils/format-serverless-controller-response.ts b/packages/twenty-server/src/engine/metadata-modules/route-trigger/utils/format-serverless-controller-response.ts new file mode 100644 index 0000000000..8f0540f229 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/route-trigger/utils/format-serverless-controller-response.ts @@ -0,0 +1,22 @@ +import { HttpException, HttpStatus } from '@nestjs/common'; + +import { isDefined } from 'twenty-shared/utils'; + +import { type ServerlessExecuteResult } from 'src/engine/core-modules/serverless/drivers/interfaces/serverless-driver.interface'; + +export const formatServerlessControllerResponse = ( + result?: ServerlessExecuteResult | null, +) => { + if (!isDefined(result)) { + return result; + } + + if (result.error) { + throw new HttpException( + { errorType: result.error.errorType, message: result.error.errorMessage }, + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + + return result.data; +};