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
This commit is contained in:
neo773 2026-04-16 14:39:15 +05:30 committed by GitHub
parent f5e8c05267
commit 64470baa1e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 86 additions and 2 deletions

View file

@ -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({

View file

@ -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 = [
{

View file

@ -14,12 +14,24 @@ export const computeFoldersToUpdate = ({
}: {
discoveredFolders: DiscoveredMessageFolder[];
existingFolders: MessageFolder[];
}): Map<string, Partial<MessageFolderEntity>> => {
}): Map<
string,
Pick<
MessageFolderEntity,
'name' | 'isSynced' | 'isSentFolder' | 'parentFolderId'
>
> => {
const existingFoldersByExternalId = new Map(
existingFolders.map((folder) => [folder.externalId, folder]),
);
const foldersToUpdate = new Map<string, Partial<MessageFolderEntity>>();
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