From 8e6b175f34b1b2349ef0e5ea985c58e6aaa65517 Mon Sep 17 00:00:00 2001 From: martmull Date: Tue, 1 Apr 2025 17:22:24 +0200 Subject: [PATCH] 700 fix rest api issues (#11326) fixes issues listed here https://github.com/twentyhq/core-team-issues/issues/700 --- .../api/rest/errors/RestApiException.ts | 2 +- .../delete-metadata-query.factory.ts | 8 ++++++-- .../utils/fetch-metadata-fields.utils.ts | 2 +- .../utils/parse-metadata-path.utils.ts | 17 +++++++++------- .../metadata/rest-api-metadata.controller.ts | 4 ++++ .../core-modules/open-api/open-api.service.ts | 20 +++++++++---------- .../open-api/utils/responses.utils.ts | 13 +++++++++--- 7 files changed, 42 insertions(+), 24 deletions(-) diff --git a/packages/twenty-server/src/engine/api/rest/errors/RestApiException.ts b/packages/twenty-server/src/engine/api/rest/errors/RestApiException.ts index 9e900e3b7..98e1db72a 100644 --- a/packages/twenty-server/src/engine/api/rest/errors/RestApiException.ts +++ b/packages/twenty-server/src/engine/api/rest/errors/RestApiException.ts @@ -7,7 +7,7 @@ const formatMessage = (error: BaseGraphQLError) => { ? error.extensions.response?.error || error.extensions.response || error.message - : error.error; + : error.error || error.message; formattedMessage = formattedMessage .replace(/"/g, "'") diff --git a/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/delete-metadata-query.factory.ts b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/delete-metadata-query.factory.ts index 532f8de50..9cfa9d7eb 100644 --- a/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/delete-metadata-query.factory.ts +++ b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/factories/delete-metadata-query.factory.ts @@ -6,10 +6,14 @@ import { capitalize } from 'twenty-shared/utils'; export class DeleteMetadataQueryFactory { create(objectNameSingular: string): string { const objectNameCapitalized = capitalize(objectNameSingular); + const formattedObjectName = + objectNameCapitalized === 'RelationMetadata' + ? 'Relation' + : objectNameCapitalized; return ` - mutation Delete${objectNameCapitalized}($input: DeleteOne${objectNameCapitalized}Input!) { - deleteOne${objectNameCapitalized}(input: $input) { + mutation Delete${objectNameCapitalized}($input: DeleteOne${formattedObjectName}Input!) { + deleteOne${formattedObjectName}(input: $input) { id } } diff --git a/packages/twenty-server/src/engine/api/rest/metadata/query-builder/utils/fetch-metadata-fields.utils.ts b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/utils/fetch-metadata-fields.utils.ts index 718a21e6a..ae10165b1 100644 --- a/packages/twenty-server/src/engine/api/rest/metadata/query-builder/utils/fetch-metadata-fields.utils.ts +++ b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/utils/fetch-metadata-fields.utils.ts @@ -77,7 +77,7 @@ export const fetchMetadataFields = (objectNamePlural: string) => { `; case 'fields': return fields; - case 'relations': + case 'relationMetadata': return ` id relationType diff --git a/packages/twenty-server/src/engine/api/rest/metadata/query-builder/utils/parse-metadata-path.utils.ts b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/utils/parse-metadata-path.utils.ts index c706aa2d2..5bfc2097f 100644 --- a/packages/twenty-server/src/engine/api/rest/metadata/query-builder/utils/parse-metadata-path.utils.ts +++ b/packages/twenty-server/src/engine/api/rest/metadata/query-builder/utils/parse-metadata-path.utils.ts @@ -26,19 +26,19 @@ export const parseMetadataPath = ( case 'fields': return { objectNameSingular: 'field', - objectNamePlural: objectName, + objectNamePlural: 'fields', id: queryAction[1], }; case 'objects': return { objectNameSingular: 'object', - objectNamePlural: objectName, + objectNamePlural: 'objects', id: queryAction[1], }; case 'relations': return { - objectNameSingular: 'relation', - objectNamePlural: objectName, + objectNameSingular: 'relationMetadata', + objectNamePlural: 'relationMetadata', id: queryAction[1], }; default: @@ -47,11 +47,14 @@ export const parseMetadataPath = ( } else { switch (objectName) { case 'fields': - return { objectNameSingular: 'field', objectNamePlural: objectName }; + return { objectNameSingular: 'field', objectNamePlural: 'fields' }; case 'objects': - return { objectNameSingular: 'object', objectNamePlural: objectName }; + return { objectNameSingular: 'object', objectNamePlural: 'objects' }; case 'relations': - return { objectNameSingular: 'relation', objectNamePlural: objectName }; + return { + objectNameSingular: 'relationMetadata', + objectNamePlural: 'relationMetadata', + }; default: return { objectNameSingular: '', objectNamePlural: '' }; } diff --git a/packages/twenty-server/src/engine/api/rest/metadata/rest-api-metadata.controller.ts b/packages/twenty-server/src/engine/api/rest/metadata/rest-api-metadata.controller.ts index fc0154081..2e4accd64 100644 --- a/packages/twenty-server/src/engine/api/rest/metadata/rest-api-metadata.controller.ts +++ b/packages/twenty-server/src/engine/api/rest/metadata/rest-api-metadata.controller.ts @@ -7,14 +7,18 @@ import { Res, Patch, Put, + UseGuards, } from '@nestjs/common'; import { Request, Response } from 'express'; import { RestApiMetadataService } from 'src/engine/api/rest/metadata/rest-api-metadata.service'; import { cleanGraphQLResponse } from 'src/engine/api/rest/utils/clean-graphql-response.utils'; +import { JwtAuthGuard } from 'src/engine/guards/jwt-auth.guard'; +import { WorkspaceAuthGuard } from 'src/engine/guards/workspace-auth.guard'; @Controller('rest/metadata/*') +@UseGuards(JwtAuthGuard, WorkspaceAuthGuard) export class RestApiMetadataController { constructor( private readonly restApiMetadataService: RestApiMetadataService, diff --git a/packages/twenty-server/src/engine/core-modules/open-api/open-api.service.ts b/packages/twenty-server/src/engine/core-modules/open-api/open-api.service.ts index d0937266a..980842cd7 100644 --- a/packages/twenty-server/src/engine/core-modules/open-api/open-api.service.ts +++ b/packages/twenty-server/src/engine/core-modules/open-api/open-api.service.ts @@ -174,16 +174,6 @@ export class OpenApiService { }, } as OpenAPIV3_1.PathItemObject; path[`/${item.namePlural}/{id}`] = { - get: { - tags: [item.namePlural], - summary: `Find One ${item.nameSingular}`, - parameters: [{ $ref: '#/components/parameters/idPath' }], - responses: { - '200': getFindOneResponse200(item), - '400': { $ref: '#/components/responses/400' }, - '401': { $ref: '#/components/responses/401' }, - }, - }, delete: { tags: [item.namePlural], summary: `Delete One ${item.nameSingular}`, @@ -196,6 +186,16 @@ export class OpenApiService { }, }, ...(item.nameSingular !== 'relation' && { + get: { + tags: [item.namePlural], + summary: `Find One ${item.nameSingular}`, + parameters: [{ $ref: '#/components/parameters/idPath' }], + responses: { + '200': getFindOneResponse200(item), + '400': { $ref: '#/components/responses/400' }, + '401': { $ref: '#/components/responses/401' }, + }, + }, patch: { tags: [item.namePlural], summary: `Update One ${item.nameSingular}`, diff --git a/packages/twenty-server/src/engine/core-modules/open-api/utils/responses.utils.ts b/packages/twenty-server/src/engine/core-modules/open-api/utils/responses.utils.ts index 8b298dd91..63d03a41d 100644 --- a/packages/twenty-server/src/engine/core-modules/open-api/utils/responses.utils.ts +++ b/packages/twenty-server/src/engine/core-modules/open-api/utils/responses.utils.ts @@ -10,6 +10,9 @@ export const getFindManyResponse200 = ( item.nameSingular, )} for Response`; + const namePlural = + item.namePlural === 'relations' ? 'relationMetadata' : item.namePlural; + return { description: 'Successful operation', content: { @@ -20,7 +23,7 @@ export const getFindManyResponse200 = ( data: { type: 'object', properties: { - [item.namePlural]: { + [namePlural]: { type: 'array', items: { $ref: schemaRef, @@ -86,7 +89,11 @@ export const getCreateOneResponse201 = ( fromMetadata = false, ) => { const one = fromMetadata ? 'One' : ''; - const schemaRef = `#/components/schemas/${capitalize(item.nameSingular)} for Response`; + + const nameSingular = + item.nameSingular === 'relation' ? 'relationMetadata' : item.nameSingular; + + const schemaRef = `#/components/schemas/${capitalize(nameSingular)} for Response`; return { description: 'Successful operation', @@ -98,7 +105,7 @@ export const getCreateOneResponse201 = ( data: { type: 'object', properties: { - [`create${one}${capitalize(item.nameSingular)}`]: { + [`create${one}${capitalize(nameSingular)}`]: { $ref: schemaRef, }, },