Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
+33
-10
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user