[messaging] Fix messaging import with no person skipped email (#3941)

This commit is contained in:
Weiko
2024-02-13 16:55:06 +01:00
committed by GitHub
parent 7f122a4671
commit 36b69a8625
9 changed files with 31 additions and 51 deletions

View File

@ -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 { 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 { MessageThreadService } from 'src/workspace/messaging/message-thread/message-thread.service';
import { MessageParticipantService } from 'src/workspace/messaging/message-participant/message-participant.service'; import { MessageParticipantService } from 'src/workspace/messaging/message-participant/message-participant.service';
import { isPersonEmail } from 'src/workspace/messaging/utils/is-person-email.util';
@Injectable() @Injectable()
export class MessageService { export class MessageService {
@ -101,6 +102,10 @@ export class MessageService {
workspaceId: string, workspaceId: string,
) { ) {
for (const message of messages) { for (const message of messages) {
if (this.shouldSkipImport(message)) {
continue;
}
await workspaceDataSource?.transaction(async (manager: EntityManager) => { await workspaceDataSource?.transaction(async (manager: EntityManager) => {
const existingMessageChannelMessageAssociationsCount = const existingMessageChannelMessageAssociationsCount =
await this.messageChannelMessageAssociationService.countByMessageExternalIdsAndMessageChannelId( await this.messageChannelMessageAssociationService.countByMessageExternalIdsAndMessageChannelId(
@ -146,6 +151,10 @@ export class MessageService {
} }
} }
private shouldSkipImport(message: GmailMessage): boolean {
return !isPersonEmail(message.fromHandle);
}
private async saveMessageOrReturnExistingMessage( private async saveMessageOrReturnExistingMessage(
message: GmailMessage, message: GmailMessage,
messageThreadId: string, messageThreadId: string,

View File

@ -14,13 +14,11 @@ import { FetchMessagesByBatchesService } from 'src/workspace/messaging/services/
import { GmailFullSyncService } from 'src/workspace/messaging/services/gmail-full-sync.service'; import { GmailFullSyncService } from 'src/workspace/messaging/services/gmail-full-sync.service';
import { GmailPartialSyncService } from 'src/workspace/messaging/services/gmail-partial-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 { 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 { WorkspaceDataSourceModule } from 'src/workspace/workspace-datasource/workspace-datasource.module';
import { MessageParticipantModule } from 'src/workspace/messaging/message-participant/message-participant.module'; import { MessageParticipantModule } from 'src/workspace/messaging/message-participant/message-participant.module';
import { MessagingWorkspaceMemberListener } from 'src/workspace/messaging/listeners/messaging-workspace-member.listener'; import { MessagingWorkspaceMemberListener } from 'src/workspace/messaging/listeners/messaging-workspace-member.listener';
import { MessagingMessageChannelListener } from 'src/workspace/messaging/listeners/messaging-message-channel.listener'; import { MessagingMessageChannelListener } from 'src/workspace/messaging/listeners/messaging-message-channel.listener';
import { MessageService } from 'src/workspace/messaging/message/message.service'; import { MessageService } from 'src/workspace/messaging/message/message.service';
import { CreateQueriesFromMessageIdsService } from 'src/workspace/messaging/services/utils/create-queries-from-message-ids.service';
@Module({ @Module({
imports: [ imports: [
@ -40,13 +38,11 @@ import { CreateQueriesFromMessageIdsService } from 'src/workspace/messaging/serv
GmailRefreshAccessTokenService, GmailRefreshAccessTokenService,
GmailClientProvider, GmailClientProvider,
CreateContactService, CreateContactService,
IsPersonEmailService,
CreateCompanyService, CreateCompanyService,
MessagingPersonListener, MessagingPersonListener,
MessagingWorkspaceMemberListener, MessagingWorkspaceMemberListener,
MessagingMessageChannelListener, MessagingMessageChannelListener,
MessageService, MessageService,
CreateQueriesFromMessageIdsService,
], ],
exports: [ exports: [
GmailPartialSyncService, GmailPartialSyncService,

View File

@ -10,13 +10,12 @@ import {
} from 'src/workspace/messaging/types/gmail-message'; } from 'src/workspace/messaging/types/gmail-message';
import { MessageQuery } from 'src/workspace/messaging/types/message-or-thread-query'; import { MessageQuery } from 'src/workspace/messaging/types/message-or-thread-query';
import { GmailMessageParsedResponse } from 'src/workspace/messaging/types/gmail-message-parsed-response'; import { GmailMessageParsedResponse } from 'src/workspace/messaging/types/gmail-message-parsed-response';
import { IsPersonEmailService } from 'src/workspace/messaging/services/is-person-email.service';
@Injectable() @Injectable()
export class FetchMessagesByBatchesService { export class FetchMessagesByBatchesService {
private readonly httpService: AxiosInstance; private readonly httpService: AxiosInstance;
constructor(private readonly isPersonEmailService: IsPersonEmailService) { constructor() {
this.httpService = axios.create({ this.httpService = axios.create({
baseURL: 'https://www.googleapis.com/batch/gmail/v1', baseURL: 'https://www.googleapis.com/batch/gmail/v1',
}); });
@ -190,8 +189,6 @@ export class FetchMessagesByBatchesService {
} = parsed; } = parsed;
if (!from) throw new Error('From value is missing'); 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'); if (!to) throw new Error('To value is missing');
const participants = [ const participants = [

View File

@ -12,8 +12,8 @@ import { ConnectedAccountService } from 'src/workspace/messaging/connected-accou
import { MessageChannelService } from 'src/workspace/messaging/message-channel/message-channel.service'; 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 { 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 { 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 { MessageService } from 'src/workspace/messaging/message/message.service';
import { createQueriesFromMessageIds } from 'src/workspace/messaging/utils/create-queries-from-message-ids.util';
@Injectable() @Injectable()
export class GmailFullSyncService { export class GmailFullSyncService {
@ -29,7 +29,6 @@ export class GmailFullSyncService {
private readonly messageChannelService: MessageChannelService, private readonly messageChannelService: MessageChannelService,
private readonly messageChannelMessageAssociationService: MessageChannelMessageAssociationService, private readonly messageChannelMessageAssociationService: MessageChannelMessageAssociationService,
private readonly messageService: MessageService, private readonly messageService: MessageService,
private readonly createQueriesFromMessageIdsService: CreateQueriesFromMessageIdsService,
) {} ) {}
public async fetchConnectedAccountThreads( public async fetchConnectedAccountThreads(
@ -101,10 +100,7 @@ export class GmailFullSyncService {
), ),
); );
const messageQueries = const messageQueries = createQueriesFromMessageIds(messagesToFetch);
this.createQueriesFromMessageIdsService.createQueriesFromMessageIds(
messagesToFetch,
);
const { messages: messagesToSave, errors } = const { messages: messagesToSave, errors } =
await this.fetchMessagesByBatchesService.fetchAllMessages( await this.fetchMessagesByBatchesService.fetchAllMessages(

View File

@ -14,7 +14,7 @@ import { ConnectedAccountService } from 'src/workspace/messaging/connected-accou
import { WorkspaceDataSourceService } from 'src/workspace/workspace-datasource/workspace-datasource.service'; import { WorkspaceDataSourceService } from 'src/workspace/workspace-datasource/workspace-datasource.service';
import { MessageChannelService } from 'src/workspace/messaging/message-channel/message-channel.service'; import { MessageChannelService } from 'src/workspace/messaging/message-channel/message-channel.service';
import { MessageService } from 'src/workspace/messaging/message/message.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() @Injectable()
export class GmailPartialSyncService { export class GmailPartialSyncService {
@ -29,7 +29,6 @@ export class GmailPartialSyncService {
private readonly connectedAccountService: ConnectedAccountService, private readonly connectedAccountService: ConnectedAccountService,
private readonly messageChannelService: MessageChannelService, private readonly messageChannelService: MessageChannelService,
private readonly messageService: MessageService, private readonly messageService: MessageService,
private readonly createQueriesFromMessageIdsService: CreateQueriesFromMessageIdsService,
) {} ) {}
public async fetchConnectedAccountThreads( public async fetchConnectedAccountThreads(
@ -99,10 +98,7 @@ export class GmailPartialSyncService {
const { messagesAdded, messagesDeleted } = const { messagesAdded, messagesDeleted } =
await this.getMessageIdsFromHistory(history); await this.getMessageIdsFromHistory(history);
const messageQueries = const messageQueries = createQueriesFromMessageIds(messagesAdded);
this.createQueriesFromMessageIdsService.createQueriesFromMessageIds(
messagesAdded,
);
const { messages: messagesToSave, errors } = const { messages: messagesToSave, errors } =
await this.fetchMessagesByBatchesService.fetchAllMessages( await this.fetchMessagesByBatchesService.fetchAllMessages(

View File

@ -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);
}
}

View File

@ -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',
}));
}
}

View File

@ -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',
}));
};

View File

@ -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);
};