send email refacto (#10691)

working refacto with min module deps of messaging-import-manager-module
This commit is contained in:
Guillim
2025-03-06 13:56:40 +01:00
committed by GitHub
parent fea8edb16d
commit 341439092a
4 changed files with 74 additions and 38 deletions

View File

@ -34,6 +34,7 @@ import { MessagingMessageService } from 'src/modules/messaging/message-import-ma
import { MessagingMessagesImportService } from 'src/modules/messaging/message-import-manager/services/messaging-messages-import.service';
import { MessagingPartialMessageListFetchService } from 'src/modules/messaging/message-import-manager/services/messaging-partial-message-list-fetch.service';
import { MessagingSaveMessagesAndEnqueueContactCreationService } from 'src/modules/messaging/message-import-manager/services/messaging-save-messages-and-enqueue-contact-creation.service';
import { MessagingSendMessageService } from 'src/modules/messaging/message-import-manager/services/messaging-send-message.service';
import { MessageParticipantManagerModule } from 'src/modules/messaging/message-participant-manager/message-participant-manager.module';
import { MessagingMonitoringModule } from 'src/modules/messaging/monitoring/messaging-monitoring.module';
@Module({
@ -75,7 +76,8 @@ import { MessagingMonitoringModule } from 'src/modules/messaging/monitoring/mess
MessagingGetMessagesService,
MessageImportExceptionHandlerService,
MessagingCursorService,
MessagingSendMessageService,
],
exports: [],
exports: [MessagingSendMessageService],
})
export class MessagingImportManagerModule {}

View File

@ -0,0 +1,56 @@
import { Injectable } from '@nestjs/common';
import { assertUnreachable, ConnectedAccountProvider } from 'twenty-shared';
import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity';
import { GmailClientProvider } from 'src/modules/messaging/message-import-manager/drivers/gmail/providers/gmail-client.provider';
interface SendMessageInput {
body: string;
subject: string;
to: string;
}
@Injectable()
export class MessagingSendMessageService {
constructor(private readonly gmailClientProvider: GmailClientProvider) {}
public async sendMessage(
sendMessageInput: SendMessageInput,
connectedAccount: ConnectedAccountWorkspaceEntity,
): Promise<void> {
switch (connectedAccount.provider) {
case ConnectedAccountProvider.GOOGLE: {
const gmailClient =
await this.gmailClientProvider.getGmailClient(connectedAccount);
const message = [
`To: ${sendMessageInput.to}`,
`Subject: ${sendMessageInput.subject}`,
'MIME-Version: 1.0',
'Content-Type: text/plain; charset="UTF-8"',
'',
sendMessageInput.body,
].join('\n');
const encodedMessage = Buffer.from(message).toString('base64');
await gmailClient.users.messages.send({
userId: 'me',
requestBody: {
raw: encodedMessage,
},
});
break;
}
case ConnectedAccountProvider.MICROSOFT:
// TODO: Implement Microsoft provider
throw new Error('Microsoft provider not implemented');
default:
assertUnreachable(
connectedAccount.provider,
`Provider ${connectedAccount.provider} not supported for sending messages`,
);
}
}
}

View File

@ -1,17 +1,12 @@
import { Module } from '@nestjs/common';
import { ScopedWorkspaceContextFactory } from 'src/engine/twenty-orm/factories/scoped-workspace-context.factory';
import { OAuth2ClientManagerModule } from 'src/modules/connected-account/oauth2-client-manager/oauth2-client-manager.module';
import { GmailClientProvider } from 'src/modules/messaging/message-import-manager/drivers/gmail/providers/gmail-client.provider';
import { MessagingImportManagerModule } from 'src/modules/messaging/message-import-manager/messaging-import-manager.module';
import { SendEmailWorkflowAction } from 'src/modules/workflow/workflow-executor/workflow-actions/mail-sender/send-email.workflow-action';
@Module({
imports: [OAuth2ClientManagerModule],
providers: [
GmailClientProvider,
ScopedWorkspaceContextFactory,
SendEmailWorkflowAction,
],
imports: [MessagingImportManagerModule],
providers: [ScopedWorkspaceContextFactory, SendEmailWorkflowAction],
exports: [SendEmailWorkflowAction],
})
export class SendEmailActionModule {}

View File

@ -10,7 +10,7 @@ import { WorkflowExecutor } from 'src/modules/workflow/workflow-executor/interfa
import { ScopedWorkspaceContextFactory } from 'src/engine/twenty-orm/factories/scoped-workspace-context.factory';
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity';
import { GmailClientProvider } from 'src/modules/messaging/message-import-manager/drivers/gmail/providers/gmail-client.provider';
import { MessagingSendMessageService } from 'src/modules/messaging/message-import-manager/services/messaging-send-message.service';
import {
WorkflowStepExecutorException,
WorkflowStepExecutorExceptionCode,
@ -33,12 +33,12 @@ export type WorkflowSendEmailStepOutputSchema = {
export class SendEmailWorkflowAction implements WorkflowExecutor {
private readonly logger = new Logger(SendEmailWorkflowAction.name);
constructor(
private readonly gmailClientProvider: GmailClientProvider,
private readonly scopedWorkspaceContextFactory: ScopedWorkspaceContextFactory,
private readonly twentyORMGlobalManager: TwentyORMGlobalManager,
private readonly sendMessageService: MessagingSendMessageService,
) {}
private async getEmailClient(connectedAccountId: string) {
private async getConnectedAccount(connectedAccountId: string) {
if (!isValidUuid(connectedAccountId)) {
throw new SendEmailActionException(
`Connected Account ID is not a valid UUID`,
@ -71,15 +71,7 @@ export class SendEmailWorkflowAction implements WorkflowExecutor {
);
}
switch (connectedAccount.provider) {
case 'google':
return await this.gmailClientProvider.getGmailClient(connectedAccount);
default:
throw new SendEmailActionException(
`Provider ${connectedAccount.provider} is not supported`,
SendEmailActionExceptionCode.PROVIDER_NOT_SUPPORTED,
);
}
return connectedAccount;
}
async execute({
@ -96,7 +88,7 @@ export class SendEmailWorkflowAction implements WorkflowExecutor {
);
}
const emailProvider = await this.getEmailClient(
const connectedAccount = await this.getConnectedAccount(
step.settings.input.connectedAccountId,
);
@ -123,23 +115,14 @@ export class SendEmailWorkflowAction implements WorkflowExecutor {
const safeBody = purify.sanitize(body || '');
const safeSubject = purify.sanitize(subject || '');
const message = [
`To: ${email}`,
`Subject: ${safeSubject || ''}`,
'MIME-Version: 1.0',
'Content-Type: text/plain; charset="UTF-8"',
'',
safeBody,
].join('\n');
const encodedMessage = Buffer.from(message).toString('base64');
await emailProvider.users.messages.send({
userId: 'me',
requestBody: {
raw: encodedMessage,
await this.sendMessageService.sendMessage(
{
to: email,
subject: safeSubject,
body: safeBody,
},
});
connectedAccount,
);
this.logger.log(`Email sent successfully`);