diff --git a/packages/twenty-server/src/engine/core-modules/auth/services/google-apis.service.ts b/packages/twenty-server/src/engine/core-modules/auth/services/google-apis.service.ts index 5af45f759b..1f5e5e04e1 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/services/google-apis.service.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/services/google-apis.service.ts @@ -154,6 +154,7 @@ export class GoogleAPIsService { handle, userWorkspaceId, workspaceId, + provider: ConnectedAccountProvider.GOOGLE, }, }); diff --git a/packages/twenty-server/src/engine/core-modules/auth/services/microsoft-apis.service.ts b/packages/twenty-server/src/engine/core-modules/auth/services/microsoft-apis.service.ts index d705dc3d33..5559b823e7 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/services/microsoft-apis.service.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/services/microsoft-apis.service.ts @@ -120,6 +120,7 @@ export class MicrosoftAPIsService { handle, userWorkspaceId: userWorkspaceId, workspaceId, + provider: ConnectedAccountProvider.MICROSOFT, }, }); diff --git a/packages/twenty-server/src/modules/connected-account/services/imap-smtp-caldav-apis.service.spec.ts b/packages/twenty-server/src/modules/connected-account/services/imap-smtp-caldav-apis.service.spec.ts index c5b17982a8..f91d2e46ed 100644 --- a/packages/twenty-server/src/modules/connected-account/services/imap-smtp-caldav-apis.service.spec.ts +++ b/packages/twenty-server/src/modules/connected-account/services/imap-smtp-caldav-apis.service.spec.ts @@ -658,6 +658,7 @@ describe('ImapSmtpCalDavAPIService', () => { handle: 'test@example.com', userWorkspaceId: 'user-workspace-id', workspaceId: 'workspace-id', + provider: ConnectedAccountProvider.IMAP_SMTP_CALDAV, }, }); @@ -674,6 +675,38 @@ describe('ImapSmtpCalDavAPIService', () => { }); }); + it('should create a new row instead of overriding an account with the same handle under a different provider', async () => { + mockConnectedAccountRepository.findOne.mockResolvedValue(null); + mockMessageChannelRepository.findOne.mockResolvedValue(null); + mockCalendarChannelRepository.findOne.mockResolvedValue(null); + mockWorkspaceMemberRepository.findOne.mockResolvedValue({ + id: 'workspace-member-id', + userId: 'user-id', + }); + mockUserWorkspaceRepository.findOne.mockResolvedValue({ + id: 'user-workspace-id', + userId: 'user-id', + }); + + await service.upsertConnectedAccount(baseInput); + + expect(mockConnectedAccountRepository.findOne).toHaveBeenCalledWith({ + where: { + handle: 'test@example.com', + userWorkspaceId: 'user-workspace-id', + workspaceId: 'workspace-id', + provider: ConnectedAccountProvider.IMAP_SMTP_CALDAV, + }, + }); + + expect(mockTransactionManagerSave).toHaveBeenCalledWith( + expect.objectContaining({ + id: 'mocked-uuid', + provider: ConnectedAccountProvider.IMAP_SMTP_CALDAV, + }), + ); + }); + it('should not create channels when neither IMAP nor CALDAV is configured', async () => { const smtpOnlyInput = { ...baseInput, diff --git a/packages/twenty-server/src/modules/connected-account/services/imap-smtp-caldav-apis.service.ts b/packages/twenty-server/src/modules/connected-account/services/imap-smtp-caldav-apis.service.ts index a5a2362990..74ced60179 100644 --- a/packages/twenty-server/src/modules/connected-account/services/imap-smtp-caldav-apis.service.ts +++ b/packages/twenty-server/src/modules/connected-account/services/imap-smtp-caldav-apis.service.ts @@ -86,7 +86,12 @@ export class ImapSmtpCalDavAPIService { const existingAccount = input.existingAccount ?? (await this.connectedAccountRepository.findOne({ - where: { handle, userWorkspaceId, workspaceId }, + where: { + handle, + userWorkspaceId, + workspaceId, + provider: ConnectedAccountProvider.IMAP_SMTP_CALDAV, + }, })); const newOrExistingAccountId = existingAccount?.id ?? v4();