diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/messaging-import-manager.module.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/messaging-import-manager.module.ts index 2048a182a..adf5edf64 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/messaging-import-manager.module.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/messaging-import-manager.module.ts @@ -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 {} diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/services/messaging-send-message.service.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/services/messaging-send-message.service.ts new file mode 100644 index 000000000..85cc5351a --- /dev/null +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/services/messaging-send-message.service.ts @@ -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 { + 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`, + ); + } + } +} diff --git a/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/mail-sender/send-email-action.module.ts b/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/mail-sender/send-email-action.module.ts index c56692f55..79ed34926 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/mail-sender/send-email-action.module.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/mail-sender/send-email-action.module.ts @@ -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 {} diff --git a/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/mail-sender/send-email.workflow-action.ts b/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/mail-sender/send-email.workflow-action.ts index a016cee4a..a0b011491 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/mail-sender/send-email.workflow-action.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-executor/workflow-actions/mail-sender/send-email.workflow-action.ts @@ -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`);