batched updates/insert and delete invalid folders (#14702)
This commit is contained in:
+67
-24
@@ -6,7 +6,6 @@ import { v4 } from 'uuid';
|
||||
|
||||
import { MessageFolder } from 'src/modules/messaging/message-folder-manager/interfaces/message-folder-driver.interface';
|
||||
|
||||
import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service';
|
||||
import { type WorkspaceEntityManager } from 'src/engine/twenty-orm/entity-manager/workspace-entity-manager';
|
||||
import { WorkspaceRepository } from 'src/engine/twenty-orm/repository/workspace.repository';
|
||||
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
|
||||
@@ -24,11 +23,25 @@ type SyncMessageFoldersInput = {
|
||||
manager: WorkspaceEntityManager;
|
||||
};
|
||||
|
||||
type MessageFolderToInsert = Pick<
|
||||
MessageFolderWorkspaceEntity,
|
||||
| 'id'
|
||||
| 'messageChannelId'
|
||||
| 'name'
|
||||
| 'syncCursor'
|
||||
| 'isSynced'
|
||||
| 'isSentFolder'
|
||||
| 'externalId'
|
||||
>;
|
||||
|
||||
type MessageFolderToUpdate = Partial<
|
||||
Pick<MessageFolderWorkspaceEntity, 'name' | 'externalId' | 'isSentFolder'>
|
||||
>;
|
||||
|
||||
@Injectable()
|
||||
export class SyncMessageFoldersService {
|
||||
constructor(
|
||||
private readonly twentyORMGlobalManager: TwentyORMGlobalManager,
|
||||
private readonly featureFlagService: FeatureFlagService,
|
||||
private readonly gmailGetAllFoldersService: GmailGetAllFoldersService,
|
||||
private readonly microsoftGetAllFoldersService: MicrosoftGetAllFoldersService,
|
||||
private readonly imapGetAllFoldersService: ImapGetAllFoldersService,
|
||||
@@ -69,7 +82,25 @@ export class SyncMessageFoldersService {
|
||||
messageFolderRepository,
|
||||
});
|
||||
|
||||
// TODO: we should delete folders that are not in the list anymore
|
||||
const inserts: MessageFolderToInsert[] = [];
|
||||
const updates: [string, MessageFolderToUpdate][] = [];
|
||||
const deletes: string[] = [];
|
||||
|
||||
const discoveredExternalIds = new Set(
|
||||
folders
|
||||
.filter((folder) => folder.externalId)
|
||||
.map((folder) => folder.externalId!),
|
||||
);
|
||||
|
||||
for (const existingFolder of existingFolderMap.values()) {
|
||||
if (
|
||||
existingFolder.externalId &&
|
||||
!discoveredExternalIds.has(existingFolder.externalId)
|
||||
) {
|
||||
deletes.push(existingFolder.id);
|
||||
}
|
||||
}
|
||||
|
||||
for (const folder of folders) {
|
||||
const existingFolder = this.findExistingFolderInMap(
|
||||
existingFolderMap,
|
||||
@@ -77,32 +108,44 @@ export class SyncMessageFoldersService {
|
||||
);
|
||||
|
||||
if (existingFolder) {
|
||||
// TODO: this code should be refactored to use the updateMany method and only on folders that need to be updated
|
||||
// await messageFolderRepository.update(
|
||||
// existingFolder.id,
|
||||
// {
|
||||
// name: folder.name,
|
||||
// externalId: folder.externalId,
|
||||
// isSentFolder: folder.isSentFolder,
|
||||
// },
|
||||
// manager,
|
||||
// );
|
||||
} else {
|
||||
// TODO: this code should be refactored to use the create (many)
|
||||
await messageFolderRepository.save(
|
||||
updates.push([
|
||||
existingFolder.id,
|
||||
{
|
||||
id: v4(),
|
||||
messageChannelId,
|
||||
name: folder.name,
|
||||
syncCursor: '',
|
||||
isSynced: folder.isSynced,
|
||||
isSentFolder: folder.isSentFolder,
|
||||
externalId: folder.externalId,
|
||||
isSentFolder: folder.isSentFolder,
|
||||
},
|
||||
{},
|
||||
manager,
|
||||
);
|
||||
]);
|
||||
continue;
|
||||
}
|
||||
|
||||
inserts.push({
|
||||
id: v4(),
|
||||
messageChannelId,
|
||||
name: folder.name,
|
||||
syncCursor: '',
|
||||
isSynced: folder.isSynced,
|
||||
isSentFolder: folder.isSentFolder,
|
||||
externalId: folder.externalId,
|
||||
});
|
||||
}
|
||||
|
||||
if (inserts.length > 0) {
|
||||
await messageFolderRepository.insert(inserts, manager);
|
||||
}
|
||||
|
||||
if (updates.length > 0) {
|
||||
await messageFolderRepository.updateMany(
|
||||
updates.map(([id, data]) => ({
|
||||
criteria: id,
|
||||
partialEntity: data,
|
||||
})),
|
||||
manager,
|
||||
);
|
||||
}
|
||||
|
||||
if (deletes.length > 0) {
|
||||
await messageFolderRepository.delete(deletes, manager);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user