diff --git a/packages/twenty-server/src/workspace/messaging/message/message.service.ts b/packages/twenty-server/src/workspace/messaging/message/message.service.ts index 861cf1822..605d26b89 100644 --- a/packages/twenty-server/src/workspace/messaging/message/message.service.ts +++ b/packages/twenty-server/src/workspace/messaging/message/message.service.ts @@ -12,6 +12,7 @@ import { ConnectedAccountObjectMetadata } from 'src/workspace/workspace-sync-met import { MessageChannelMessageAssociationService } from 'src/workspace/messaging/message-channel-message-association/message-channel-message-association.service'; import { MessageThreadService } from 'src/workspace/messaging/message-thread/message-thread.service'; import { MessageParticipantService } from 'src/workspace/messaging/message-participant/message-participant.service'; +import { isPersonEmail } from 'src/workspace/messaging/utils/is-person-email.util'; @Injectable() export class MessageService { @@ -101,6 +102,10 @@ export class MessageService { workspaceId: string, ) { for (const message of messages) { + if (this.shouldSkipImport(message)) { + continue; + } + await workspaceDataSource?.transaction(async (manager: EntityManager) => { const existingMessageChannelMessageAssociationsCount = await this.messageChannelMessageAssociationService.countByMessageExternalIdsAndMessageChannelId( @@ -146,6 +151,10 @@ export class MessageService { } } + private shouldSkipImport(message: GmailMessage): boolean { + return !isPersonEmail(message.fromHandle); + } + private async saveMessageOrReturnExistingMessage( message: GmailMessage, messageThreadId: string, diff --git a/packages/twenty-server/src/workspace/messaging/messaging.module.ts b/packages/twenty-server/src/workspace/messaging/messaging.module.ts index d2708d890..fc3b68b18 100644 --- a/packages/twenty-server/src/workspace/messaging/messaging.module.ts +++ b/packages/twenty-server/src/workspace/messaging/messaging.module.ts @@ -14,13 +14,11 @@ import { FetchMessagesByBatchesService } from 'src/workspace/messaging/services/ import { GmailFullSyncService } from 'src/workspace/messaging/services/gmail-full-sync.service'; import { GmailPartialSyncService } from 'src/workspace/messaging/services/gmail-partial-sync.service'; import { GmailRefreshAccessTokenService } from 'src/workspace/messaging/services/gmail-refresh-access-token.service'; -import { IsPersonEmailService } from 'src/workspace/messaging/services/is-person-email.service'; import { WorkspaceDataSourceModule } from 'src/workspace/workspace-datasource/workspace-datasource.module'; import { MessageParticipantModule } from 'src/workspace/messaging/message-participant/message-participant.module'; import { MessagingWorkspaceMemberListener } from 'src/workspace/messaging/listeners/messaging-workspace-member.listener'; import { MessagingMessageChannelListener } from 'src/workspace/messaging/listeners/messaging-message-channel.listener'; import { MessageService } from 'src/workspace/messaging/message/message.service'; -import { CreateQueriesFromMessageIdsService } from 'src/workspace/messaging/services/utils/create-queries-from-message-ids.service'; @Module({ imports: [ @@ -40,13 +38,11 @@ import { CreateQueriesFromMessageIdsService } from 'src/workspace/messaging/serv GmailRefreshAccessTokenService, GmailClientProvider, CreateContactService, - IsPersonEmailService, CreateCompanyService, MessagingPersonListener, MessagingWorkspaceMemberListener, MessagingMessageChannelListener, MessageService, - CreateQueriesFromMessageIdsService, ], exports: [ GmailPartialSyncService, diff --git a/packages/twenty-server/src/workspace/messaging/services/fetch-messages-by-batches.service.ts b/packages/twenty-server/src/workspace/messaging/services/fetch-messages-by-batches.service.ts index 21872a679..91edc9c58 100644 --- a/packages/twenty-server/src/workspace/messaging/services/fetch-messages-by-batches.service.ts +++ b/packages/twenty-server/src/workspace/messaging/services/fetch-messages-by-batches.service.ts @@ -10,13 +10,12 @@ import { } from 'src/workspace/messaging/types/gmail-message'; import { MessageQuery } from 'src/workspace/messaging/types/message-or-thread-query'; import { GmailMessageParsedResponse } from 'src/workspace/messaging/types/gmail-message-parsed-response'; -import { IsPersonEmailService } from 'src/workspace/messaging/services/is-person-email.service'; @Injectable() export class FetchMessagesByBatchesService { private readonly httpService: AxiosInstance; - constructor(private readonly isPersonEmailService: IsPersonEmailService) { + constructor() { this.httpService = axios.create({ baseURL: 'https://www.googleapis.com/batch/gmail/v1', }); @@ -190,8 +189,6 @@ export class FetchMessagesByBatchesService { } = parsed; if (!from) throw new Error('From value is missing'); - if (!this.isPersonEmailService.isPersonEmail(from.value[0].address)) - return; if (!to) throw new Error('To value is missing'); const participants = [ diff --git a/packages/twenty-server/src/workspace/messaging/services/gmail-full-sync.service.ts b/packages/twenty-server/src/workspace/messaging/services/gmail-full-sync.service.ts index d69efecd3..2009b89db 100644 --- a/packages/twenty-server/src/workspace/messaging/services/gmail-full-sync.service.ts +++ b/packages/twenty-server/src/workspace/messaging/services/gmail-full-sync.service.ts @@ -12,8 +12,8 @@ import { ConnectedAccountService } from 'src/workspace/messaging/connected-accou import { MessageChannelService } from 'src/workspace/messaging/message-channel/message-channel.service'; import { MessageChannelMessageAssociationService } from 'src/workspace/messaging/message-channel-message-association/message-channel-message-association.service'; import { WorkspaceDataSourceService } from 'src/workspace/workspace-datasource/workspace-datasource.service'; -import { CreateQueriesFromMessageIdsService } from 'src/workspace/messaging/services/utils/create-queries-from-message-ids.service'; import { MessageService } from 'src/workspace/messaging/message/message.service'; +import { createQueriesFromMessageIds } from 'src/workspace/messaging/utils/create-queries-from-message-ids.util'; @Injectable() export class GmailFullSyncService { @@ -29,7 +29,6 @@ export class GmailFullSyncService { private readonly messageChannelService: MessageChannelService, private readonly messageChannelMessageAssociationService: MessageChannelMessageAssociationService, private readonly messageService: MessageService, - private readonly createQueriesFromMessageIdsService: CreateQueriesFromMessageIdsService, ) {} public async fetchConnectedAccountThreads( @@ -101,10 +100,7 @@ export class GmailFullSyncService { ), ); - const messageQueries = - this.createQueriesFromMessageIdsService.createQueriesFromMessageIds( - messagesToFetch, - ); + const messageQueries = createQueriesFromMessageIds(messagesToFetch); const { messages: messagesToSave, errors } = await this.fetchMessagesByBatchesService.fetchAllMessages( diff --git a/packages/twenty-server/src/workspace/messaging/services/gmail-partial-sync.service.ts b/packages/twenty-server/src/workspace/messaging/services/gmail-partial-sync.service.ts index 95d5f723b..7b6a7e8f2 100644 --- a/packages/twenty-server/src/workspace/messaging/services/gmail-partial-sync.service.ts +++ b/packages/twenty-server/src/workspace/messaging/services/gmail-partial-sync.service.ts @@ -14,7 +14,7 @@ import { ConnectedAccountService } from 'src/workspace/messaging/connected-accou import { WorkspaceDataSourceService } from 'src/workspace/workspace-datasource/workspace-datasource.service'; import { MessageChannelService } from 'src/workspace/messaging/message-channel/message-channel.service'; import { MessageService } from 'src/workspace/messaging/message/message.service'; -import { CreateQueriesFromMessageIdsService } from 'src/workspace/messaging/services/utils/create-queries-from-message-ids.service'; +import { createQueriesFromMessageIds } from 'src/workspace/messaging/utils/create-queries-from-message-ids.util'; @Injectable() export class GmailPartialSyncService { @@ -29,7 +29,6 @@ export class GmailPartialSyncService { private readonly connectedAccountService: ConnectedAccountService, private readonly messageChannelService: MessageChannelService, private readonly messageService: MessageService, - private readonly createQueriesFromMessageIdsService: CreateQueriesFromMessageIdsService, ) {} public async fetchConnectedAccountThreads( @@ -99,10 +98,7 @@ export class GmailPartialSyncService { const { messagesAdded, messagesDeleted } = await this.getMessageIdsFromHistory(history); - const messageQueries = - this.createQueriesFromMessageIdsService.createQueriesFromMessageIds( - messagesAdded, - ); + const messageQueries = createQueriesFromMessageIds(messagesAdded); const { messages: messagesToSave, errors } = await this.fetchMessagesByBatchesService.fetchAllMessages( diff --git a/packages/twenty-server/src/workspace/messaging/services/is-person-email.service.ts b/packages/twenty-server/src/workspace/messaging/services/is-person-email.service.ts deleted file mode 100644 index 6ec343212..000000000 --- a/packages/twenty-server/src/workspace/messaging/services/is-person-email.service.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -@Injectable() -export class IsPersonEmailService { - constructor() {} - - isPersonEmail(email: string | undefined): boolean { - if (!email) return false; - - const nonPersonalPattern = - /noreply|no-reply|do_not_reply|no\.reply|^(accounts@|info@|admin@|contact@|hello@|support@|sales@|feedback@|service@|help@|mailer-daemon|notifications?|digest|auto|apps|assign|comments|customer-success|enterprise|esign|express|forum|gc@|learn|mailer|marketing|messages|news|notification|payments|receipts|recrutement|security|service|support|team)/; - - return !nonPersonalPattern.test(email); - } -} diff --git a/packages/twenty-server/src/workspace/messaging/services/utils/create-queries-from-message-ids.service.ts b/packages/twenty-server/src/workspace/messaging/services/utils/create-queries-from-message-ids.service.ts deleted file mode 100644 index 3371ad5d6..000000000 --- a/packages/twenty-server/src/workspace/messaging/services/utils/create-queries-from-message-ids.service.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -import { MessageQuery } from 'src/workspace/messaging/types/message-or-thread-query'; - -@Injectable() -export class CreateQueriesFromMessageIdsService { - constructor() {} - - public createQueriesFromMessageIds( - messageExternalIds: string[], - ): MessageQuery[] { - return messageExternalIds.map((messageId) => ({ - uri: '/gmail/v1/users/me/messages/' + messageId + '?format=RAW', - })); - } -} diff --git a/packages/twenty-server/src/workspace/messaging/utils/create-queries-from-message-ids.util.ts b/packages/twenty-server/src/workspace/messaging/utils/create-queries-from-message-ids.util.ts new file mode 100644 index 000000000..5263601c5 --- /dev/null +++ b/packages/twenty-server/src/workspace/messaging/utils/create-queries-from-message-ids.util.ts @@ -0,0 +1,9 @@ +import { MessageQuery } from 'src/workspace/messaging/types/message-or-thread-query'; + +export const createQueriesFromMessageIds = ( + messageExternalIds: string[], +): MessageQuery[] => { + return messageExternalIds.map((messageId) => ({ + uri: '/gmail/v1/users/me/messages/' + messageId + '?format=RAW', + })); +}; diff --git a/packages/twenty-server/src/workspace/messaging/utils/is-person-email.util.ts b/packages/twenty-server/src/workspace/messaging/utils/is-person-email.util.ts new file mode 100644 index 000000000..387a94e50 --- /dev/null +++ b/packages/twenty-server/src/workspace/messaging/utils/is-person-email.util.ts @@ -0,0 +1,8 @@ +export const isPersonEmail = (email: string | undefined): boolean => { + if (!email) return false; + + const nonPersonalPattern = + /noreply|no-reply|do_not_reply|no\.reply|^(accounts@|info@|admin@|contact@|hello@|support@|sales@|feedback@|service@|help@|mailer-daemon|notifications?|digest|auto|apps|assign|comments|customer-success|enterprise|esign|express|forum|gc@|learn|mailer|marketing|messages|news|notification|payments|receipts|recrutement|security|service|support|team)/; + + return !nonPersonalPattern.test(email); +};