send email refacto (#10691)
working refacto with min module deps of messaging-import-manager-module
This commit is contained in:
@ -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 { 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 { 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 { 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 { MessageParticipantManagerModule } from 'src/modules/messaging/message-participant-manager/message-participant-manager.module';
|
||||||
import { MessagingMonitoringModule } from 'src/modules/messaging/monitoring/messaging-monitoring.module';
|
import { MessagingMonitoringModule } from 'src/modules/messaging/monitoring/messaging-monitoring.module';
|
||||||
@Module({
|
@Module({
|
||||||
@ -75,7 +76,8 @@ import { MessagingMonitoringModule } from 'src/modules/messaging/monitoring/mess
|
|||||||
MessagingGetMessagesService,
|
MessagingGetMessagesService,
|
||||||
MessageImportExceptionHandlerService,
|
MessageImportExceptionHandlerService,
|
||||||
MessagingCursorService,
|
MessagingCursorService,
|
||||||
|
MessagingSendMessageService,
|
||||||
],
|
],
|
||||||
exports: [],
|
exports: [MessagingSendMessageService],
|
||||||
})
|
})
|
||||||
export class MessagingImportManagerModule {}
|
export class MessagingImportManagerModule {}
|
||||||
|
|||||||
@ -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`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,17 +1,12 @@
|
|||||||
import { Module } from '@nestjs/common';
|
import { Module } from '@nestjs/common';
|
||||||
|
|
||||||
import { ScopedWorkspaceContextFactory } from 'src/engine/twenty-orm/factories/scoped-workspace-context.factory';
|
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 { MessagingImportManagerModule } from 'src/modules/messaging/message-import-manager/messaging-import-manager.module';
|
||||||
import { GmailClientProvider } from 'src/modules/messaging/message-import-manager/drivers/gmail/providers/gmail-client.provider';
|
|
||||||
import { SendEmailWorkflowAction } from 'src/modules/workflow/workflow-executor/workflow-actions/mail-sender/send-email.workflow-action';
|
import { SendEmailWorkflowAction } from 'src/modules/workflow/workflow-executor/workflow-actions/mail-sender/send-email.workflow-action';
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [OAuth2ClientManagerModule],
|
imports: [MessagingImportManagerModule],
|
||||||
providers: [
|
providers: [ScopedWorkspaceContextFactory, SendEmailWorkflowAction],
|
||||||
GmailClientProvider,
|
|
||||||
ScopedWorkspaceContextFactory,
|
|
||||||
SendEmailWorkflowAction,
|
|
||||||
],
|
|
||||||
exports: [SendEmailWorkflowAction],
|
exports: [SendEmailWorkflowAction],
|
||||||
})
|
})
|
||||||
export class SendEmailActionModule {}
|
export class SendEmailActionModule {}
|
||||||
|
|||||||
@ -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 { ScopedWorkspaceContextFactory } from 'src/engine/twenty-orm/factories/scoped-workspace-context.factory';
|
||||||
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
|
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 { 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 {
|
import {
|
||||||
WorkflowStepExecutorException,
|
WorkflowStepExecutorException,
|
||||||
WorkflowStepExecutorExceptionCode,
|
WorkflowStepExecutorExceptionCode,
|
||||||
@ -33,12 +33,12 @@ export type WorkflowSendEmailStepOutputSchema = {
|
|||||||
export class SendEmailWorkflowAction implements WorkflowExecutor {
|
export class SendEmailWorkflowAction implements WorkflowExecutor {
|
||||||
private readonly logger = new Logger(SendEmailWorkflowAction.name);
|
private readonly logger = new Logger(SendEmailWorkflowAction.name);
|
||||||
constructor(
|
constructor(
|
||||||
private readonly gmailClientProvider: GmailClientProvider,
|
|
||||||
private readonly scopedWorkspaceContextFactory: ScopedWorkspaceContextFactory,
|
private readonly scopedWorkspaceContextFactory: ScopedWorkspaceContextFactory,
|
||||||
private readonly twentyORMGlobalManager: TwentyORMGlobalManager,
|
private readonly twentyORMGlobalManager: TwentyORMGlobalManager,
|
||||||
|
private readonly sendMessageService: MessagingSendMessageService,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
private async getEmailClient(connectedAccountId: string) {
|
private async getConnectedAccount(connectedAccountId: string) {
|
||||||
if (!isValidUuid(connectedAccountId)) {
|
if (!isValidUuid(connectedAccountId)) {
|
||||||
throw new SendEmailActionException(
|
throw new SendEmailActionException(
|
||||||
`Connected Account ID is not a valid UUID`,
|
`Connected Account ID is not a valid UUID`,
|
||||||
@ -71,15 +71,7 @@ export class SendEmailWorkflowAction implements WorkflowExecutor {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (connectedAccount.provider) {
|
return connectedAccount;
|
||||||
case 'google':
|
|
||||||
return await this.gmailClientProvider.getGmailClient(connectedAccount);
|
|
||||||
default:
|
|
||||||
throw new SendEmailActionException(
|
|
||||||
`Provider ${connectedAccount.provider} is not supported`,
|
|
||||||
SendEmailActionExceptionCode.PROVIDER_NOT_SUPPORTED,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async execute({
|
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,
|
step.settings.input.connectedAccountId,
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -123,23 +115,14 @@ export class SendEmailWorkflowAction implements WorkflowExecutor {
|
|||||||
const safeBody = purify.sanitize(body || '');
|
const safeBody = purify.sanitize(body || '');
|
||||||
const safeSubject = purify.sanitize(subject || '');
|
const safeSubject = purify.sanitize(subject || '');
|
||||||
|
|
||||||
const message = [
|
await this.sendMessageService.sendMessage(
|
||||||
`To: ${email}`,
|
{
|
||||||
`Subject: ${safeSubject || ''}`,
|
to: email,
|
||||||
'MIME-Version: 1.0',
|
subject: safeSubject,
|
||||||
'Content-Type: text/plain; charset="UTF-8"',
|
body: safeBody,
|
||||||
'',
|
|
||||||
safeBody,
|
|
||||||
].join('\n');
|
|
||||||
|
|
||||||
const encodedMessage = Buffer.from(message).toString('base64');
|
|
||||||
|
|
||||||
await emailProvider.users.messages.send({
|
|
||||||
userId: 'me',
|
|
||||||
requestBody: {
|
|
||||||
raw: encodedMessage,
|
|
||||||
},
|
},
|
||||||
});
|
connectedAccount,
|
||||||
|
);
|
||||||
|
|
||||||
this.logger.log(`Email sent successfully`);
|
this.logger.log(`Email sent successfully`);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user