[messaging] Fix messaging import with no person skipped email (#3941)
This commit is contained in:
@ -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,
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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 = [
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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',
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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',
|
||||||
|
}));
|
||||||
|
};
|
||||||
@ -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);
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user