message channel change #3 (#15757)

Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
neo773
2025-11-13 18:42:20 +05:30
committed by GitHub
parent a3b78f080b
commit 3ef9be6622
32 changed files with 1116 additions and 171 deletions
@@ -10,7 +10,10 @@ import { type WorkspaceEntityManager } from 'src/engine/twenty-orm/entity-manage
import { WorkspaceRepository } from 'src/engine/twenty-orm/repository/workspace.repository';
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
import { type MessageChannelWorkspaceEntity } from 'src/modules/messaging/common/standard-objects/message-channel.workspace-entity';
import { type MessageFolderWorkspaceEntity } from 'src/modules/messaging/common/standard-objects/message-folder.workspace-entity';
import {
MessageFolderPendingSyncAction,
type MessageFolderWorkspaceEntity,
} from 'src/modules/messaging/common/standard-objects/message-folder.workspace-entity';
import { GmailGetAllFoldersService } from 'src/modules/messaging/message-folder-manager/drivers/gmail/gmail-get-all-folders.service';
import { ImapGetAllFoldersService } from 'src/modules/messaging/message-folder-manager/drivers/imap/imap-get-all-folders.service';
import { MicrosoftGetAllFoldersService } from 'src/modules/messaging/message-folder-manager/drivers/microsoft/microsoft-get-all-folders.service';
@@ -18,8 +21,10 @@ import { MessageFolderName } from 'src/modules/messaging/message-import-manager/
type SyncMessageFoldersInput = {
workspaceId: string;
messageChannelId: string;
connectedAccount: MessageChannelWorkspaceEntity['connectedAccount'];
messageChannel: Pick<
MessageChannelWorkspaceEntity,
'messageFolderImportPolicy' | 'connectedAccount' | 'id'
>;
manager: WorkspaceEntityManager;
};
@@ -52,13 +57,16 @@ export class SyncMessageFoldersService {
) {}
async syncMessageFolders(input: SyncMessageFoldersInput): Promise<void> {
const { workspaceId, messageChannelId, connectedAccount, manager } = input;
const { workspaceId, messageChannel, manager } = input;
const folders = await this.discoverAllFolders(connectedAccount);
const folders = await this.discoverAllFolders(
messageChannel.connectedAccount,
messageChannel,
);
await this.upsertDiscoveredFolders({
workspaceId,
messageChannelId,
messageChannelId: messageChannel.id,
folders,
manager,
});
@@ -88,7 +96,7 @@ export class SyncMessageFoldersService {
const inserts: MessageFolderToInsert[] = [];
const updates: [string, MessageFolderToUpdate][] = [];
const deletes: string[] = [];
const foldersToMarkForDeletion: string[] = [];
const discoveredExternalIds = new Set(
folders
@@ -101,7 +109,7 @@ export class SyncMessageFoldersService {
existingFolder.externalId &&
!discoveredExternalIds.has(existingFolder.externalId)
) {
deletes.push(existingFolder.id);
foldersToMarkForDeletion.push(existingFolder.id);
}
}
@@ -150,26 +158,41 @@ export class SyncMessageFoldersService {
);
}
if (deletes.length > 0) {
await messageFolderRepository.delete(deletes, manager);
if (foldersToMarkForDeletion.length > 0) {
await messageFolderRepository.updateMany(
foldersToMarkForDeletion.map((id) => ({
criteria: id,
partialEntity: {
pendingSyncAction: MessageFolderPendingSyncAction.FOLDER_DELETION,
},
})),
manager,
);
}
}
async discoverAllFolders(
connectedAccount: MessageChannelWorkspaceEntity['connectedAccount'],
messageChannel: Pick<
MessageChannelWorkspaceEntity,
'messageFolderImportPolicy'
>,
): Promise<MessageFolder[]> {
switch (connectedAccount.provider) {
case ConnectedAccountProvider.GOOGLE:
return await this.gmailGetAllFoldersService.getAllMessageFolders(
connectedAccount,
messageChannel,
);
case ConnectedAccountProvider.MICROSOFT:
return await this.microsoftGetAllFoldersService.getAllMessageFolders(
connectedAccount,
messageChannel,
);
case ConnectedAccountProvider.IMAP_SMTP_CALDAV:
return await this.imapGetAllFoldersService.getAllMessageFolders(
connectedAccount,
messageChannel,
);
default:
throw new Error(