From 7d49639ba6ad20e94fae09013f62ba4745cdb630 Mon Sep 17 00:00:00 2001 From: Marie <51697796+ijreilly@users.noreply.github.com> Date: Thu, 17 Jul 2025 18:52:57 +0200 Subject: [PATCH] [permissions] Fix query of foreign key field (ex: messageId) (#13266) Issue introduced by [Restrict queried columns to graphql-requested fields](https://github.com/twentyhq/twenty/pull/13246) In this query ```ts { ... name messageId message { id } } ``` `messageId` was being filtered out from the selected fields as we failed to link it to an existing field, thus null was always returned. `message { id }` worked because we already handled connections correctly. --- .../graphql-selected-fields.parser.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query-selected-fields/graphql-selected-fields.parser.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query-selected-fields/graphql-selected-fields.parser.ts index 8b61a0d51..1b526b40e 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query-selected-fields/graphql-selected-fields.parser.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query-selected-fields/graphql-selected-fields.parser.ts @@ -75,11 +75,28 @@ export class GraphqlQuerySelectedFieldsParser { for (const [fieldKey, fieldValue] of Object.entries( graphqlSelectedFields, )) { - const fieldMetadata = + const fieldMetadataBasedOnName = objectMetadataMapItem.fieldsById[ objectMetadataMapItem.fieldIdByName[fieldKey] ]; + const isFieldForeignKey = + !fieldMetadataBasedOnName && fieldKey.endsWith('Id'); + + if (isFieldForeignKey) { + const fieldMetadataBasedOnRelationName = + objectMetadataMapItem.fieldsById[ + objectMetadataMapItem.fieldIdByName[fieldKey.slice(0, -2)] + ]; + + if (fieldMetadataBasedOnRelationName) { + accumulator.select[fieldKey] = true; // field is not a connection so should not be treated as a relation + continue; + } + } + + const fieldMetadata = fieldMetadataBasedOnName; + if (!fieldMetadata) { continue; }