From 64470baa1e1caeec703064032ab73e5b988d6e19 Mon Sep 17 00:00:00 2001 From: neo773 <62795688+neo773@users.noreply.github.com> Date: Thu, 16 Apr 2026 14:39:15 +0530 Subject: [PATCH] fix compute folders to update util (#19749) This regressed with the migration work Type checker should've caught it, but didn't because of `Partial` changed it to `Pick` instead to avoid future cases /closes https://github.com/twentyhq/twenty/issues/19745 --- .../sync-message-folders.service.spec.ts | 4 ++ .../compute-folders-to-update.util.spec.ts | 66 +++++++++++++++++++ .../utils/compute-folders-to-update.util.ts | 18 ++++- 3 files changed, 86 insertions(+), 2 deletions(-) diff --git a/packages/twenty-server/src/modules/messaging/message-folder-manager/services/sync-message-folders.service.spec.ts b/packages/twenty-server/src/modules/messaging/message-folder-manager/services/sync-message-folders.service.spec.ts index 7b2eeb522c..0475e63efe 100644 --- a/packages/twenty-server/src/modules/messaging/message-folder-manager/services/sync-message-folders.service.spec.ts +++ b/packages/twenty-server/src/modules/messaging/message-folder-manager/services/sync-message-folders.service.spec.ts @@ -370,6 +370,7 @@ describe('SyncMessageFoldersService', () => { id: 'folder-1', externalId: 'inbox-ext', name: 'INBOX', + isSynced: true, isSentFolder: false, parentFolderId: null, }); @@ -377,6 +378,7 @@ describe('SyncMessageFoldersService', () => { createMockDiscoveredFolder({ externalId: 'inbox-ext', name: 'INBOX', + isSynced: true, isSentFolder: false, parentFolderId: null, }), @@ -474,6 +476,7 @@ describe('SyncMessageFoldersService', () => { createMockDiscoveredFolder({ externalId: 'unchanged-ext', name: 'Unchanged', + isSynced: true, }), createMockDiscoveredFolder({ externalId: 'new-ext', @@ -534,6 +537,7 @@ describe('SyncMessageFoldersService', () => { createMockDiscoveredFolder({ externalId: 'inbox-ext', name: 'INBOX', + isSynced: true, }), ]; const messageChannel = createMockMessageChannel({ diff --git a/packages/twenty-server/src/modules/messaging/message-folder-manager/utils/__tests__/compute-folders-to-update.util.spec.ts b/packages/twenty-server/src/modules/messaging/message-folder-manager/utils/__tests__/compute-folders-to-update.util.spec.ts index e3cbe2ce23..78280196ac 100644 --- a/packages/twenty-server/src/modules/messaging/message-folder-manager/utils/__tests__/compute-folders-to-update.util.spec.ts +++ b/packages/twenty-server/src/modules/messaging/message-folder-manager/utils/__tests__/compute-folders-to-update.util.spec.ts @@ -93,6 +93,72 @@ describe('computeFoldersToUpdate', () => { expect(result.size).toBe(0); }); + it('should detect isSynced change from false to true', () => { + const discoveredFolders = [ + { + name: 'Inbox', + externalId: 'INBOX', + isSynced: true, + isSentFolder: false, + parentFolderId: null, + }, + ]; + + const existingFolders = [ + { + id: 'folder-id', + name: 'Inbox', + externalId: 'INBOX', + isSynced: false, + isSentFolder: false, + parentFolderId: null, + syncCursor: 'cursor', + pendingSyncAction: MessageFolderPendingSyncAction.NONE, + }, + ]; + + const result = computeFoldersToUpdate({ + discoveredFolders, + existingFolders, + }); + + expect(result.size).toBe(1); + expect(result.get('folder-id')?.isSynced).toBe(true); + }); + + it('should detect isSynced change from true to false', () => { + const discoveredFolders = [ + { + name: 'Promotions', + externalId: 'promo-1', + isSynced: false, + isSentFolder: false, + parentFolderId: null, + }, + ]; + + const existingFolders = [ + { + id: 'folder-id', + name: 'Promotions', + externalId: 'promo-1', + isSynced: true, + isSentFolder: false, + parentFolderId: null, + syncCursor: 'cursor', + pendingSyncAction: MessageFolderPendingSyncAction.NONE, + }, + ]; + + const result = computeFoldersToUpdate({ + discoveredFolders, + existingFolders, + }); + + expect(result.size).toBe(1); + expect(result.get('folder-id')?.isSynced).toBe(false); + }); + it('should treat empty string parentFolderId same as null', () => { const discoveredFolders = [ { diff --git a/packages/twenty-server/src/modules/messaging/message-folder-manager/utils/compute-folders-to-update.util.ts b/packages/twenty-server/src/modules/messaging/message-folder-manager/utils/compute-folders-to-update.util.ts index 4c044ec4cb..4e8bdcf6eb 100644 --- a/packages/twenty-server/src/modules/messaging/message-folder-manager/utils/compute-folders-to-update.util.ts +++ b/packages/twenty-server/src/modules/messaging/message-folder-manager/utils/compute-folders-to-update.util.ts @@ -14,12 +14,24 @@ export const computeFoldersToUpdate = ({ }: { discoveredFolders: DiscoveredMessageFolder[]; existingFolders: MessageFolder[]; -}): Map> => { +}): Map< + string, + Pick< + MessageFolderEntity, + 'name' | 'isSynced' | 'isSentFolder' | 'parentFolderId' + > +> => { const existingFoldersByExternalId = new Map( existingFolders.map((folder) => [folder.externalId, folder]), ); - const foldersToUpdate = new Map>(); + const foldersToUpdate = new Map< + string, + Pick< + MessageFolderEntity, + 'name' | 'isSynced' | 'isSentFolder' | 'parentFolderId' + > + >(); for (const discoveredFolder of discoveredFolders) { const existingFolder = existingFoldersByExternalId.get( @@ -36,12 +48,14 @@ export const computeFoldersToUpdate = ({ const discoveredFolderData = { name: discoveredFolder.name, + isSynced: discoveredFolder.isSynced, isSentFolder: discoveredFolder.isSentFolder, parentFolderId, }; const existingFolderData = { name: existingFolder.name, + isSynced: existingFolder.isSynced, isSentFolder: existingFolder.isSentFolder, parentFolderId: isNonEmptyString(existingFolder.parentFolderId) ? existingFolder.parentFolderId