From 4e172247f7e1d2b29924a4da163de432e0dd8744 Mon Sep 17 00:00:00 2001 From: Rena Tsagka <57152951+Renc17@users.noreply.github.com> Date: Tue, 10 Sep 2024 16:42:05 +0300 Subject: [PATCH] fix(email): sync templates/SendGrid provider eu domain/Email providers missing config fields error handling/GetExternalTemplates error handling (#1146) * fix(email): soft syncing external templates * fix(email): external templates pagination fallback * chore(email): remove redundant config field * feat(email): sendgrid provider set region host * fix(email): provider connection error handling before data handling * fix(email): provider config missing fields checks * fix(email): soft syncing external templates * fix(email): external templates pagination fallback * chore(email): remove redundant config field * feat(email): sendgrid provider set region host * fix(email): provider connection error handling before data handling * fix(email): provider config missing fields checks * fix(email): delete deprecated apiUser field on preConfig --- modules/email/src/Email.ts | 5 ++++ modules/email/src/admin/index.ts | 23 ++++++++++-------- modules/email/src/config/config.ts | 8 +++---- modules/email/src/email-provider/index.ts | 24 ++++++++++++++----- .../transports/sendgrid/SendgridProvider.ts | 1 + .../transports/sendgrid/sendgrid.config.ts | 1 + 6 files changed, 42 insertions(+), 20 deletions(-) diff --git a/modules/email/src/Email.ts b/modules/email/src/Email.ts index 3b3b71cbf..c14085e30 100644 --- a/modules/email/src/Email.ts +++ b/modules/email/src/Email.ts @@ -68,6 +68,11 @@ export default class Email extends ManagedModule { } async preConfig(config: Config) { + if (config.transportSettings?.sendgrid.hasOwnProperty('apiUser')) { + delete ( + config as Config & { transportSettings: { sendgrid: { apiUser?: string } } } + ).transportSettings.sendgrid.apiUser; + } if ( isNil(config.active) || isNil(config.transport) || diff --git a/modules/email/src/admin/index.ts b/modules/email/src/admin/index.ts index 0a9bb142e..c71f800ce 100644 --- a/modules/email/src/admin/index.ts +++ b/modules/email/src/admin/index.ts @@ -271,18 +271,23 @@ export class AdminHandlers { } async getExternalTemplates(call: ParsedRouterRequest): Promise { - const { skip } = call.request.params ?? 0; - const { limit } = call.request.params ?? 25; - const { sortByName } = call.request.params; + const { + skip = 0, + limit = 25, + sortByName = false, + } = call.request.params as { + skip?: number; + limit?: number; + sortByName?: boolean; + }; const [err, externalTemplates] = await to(this.emailService.getExternalTemplates()!); + if (!isNil(err)) { + throw new GrpcError(status.INTERNAL, err.message); + } if (!isNil(sortByName)) { if (sortByName) externalTemplates!.sort((a, b) => a.name.localeCompare(b.name)); else externalTemplates!.sort((a, b) => b.name.localeCompare(a.name)); } - - if (!isNil(err)) { - throw new GrpcError(status.INTERNAL, err.message); - } if (isNil(externalTemplates)) { throw new GrpcError(status.NOT_FOUND, 'No external templates could be retrieved'); } @@ -313,11 +318,9 @@ export class AdminHandlers { const templateDocument = await EmailTemplate.getInstance().findOne({ externalId: element.id, }); - if (isNil(templateDocument)) { - throw new GrpcError(status.NOT_FOUND, 'Template does not exist'); + continue; } - const synchronized = { name: element.name, subject: element.versions[0].subject, diff --git a/modules/email/src/config/config.ts b/modules/email/src/config/config.ts index f142ca659..052c828d5 100644 --- a/modules/email/src/config/config.ts +++ b/modules/email/src/config/config.ts @@ -72,13 +72,13 @@ export default { }, }, sendgrid: { - apiKey: { - doc: 'The SendGrid API key', + residency: { + doc: 'Sets the host for sendgrid provider. SendGrid Default: global', format: 'String', default: '', }, - apiUser: { - doc: 'The SendGrid API username', + apiKey: { + doc: 'The SendGrid API key', format: 'String', default: '', }, diff --git a/modules/email/src/email-provider/index.ts b/modules/email/src/email-provider/index.ts index 4fdf1201f..1c9ed94dd 100644 --- a/modules/email/src/email-provider/index.ts +++ b/modules/email/src/email-provider/index.ts @@ -1,7 +1,7 @@ import Mail from 'nodemailer/lib/mailer'; import { SentMessageInfo } from 'nodemailer'; import { MailgunConfig } from './transports/mailgun/mailgun.config.js'; -import { isEmpty, isNil } from 'lodash-es'; +import { isEmpty } from 'lodash-es'; import { MandrillConfig } from './transports/mandrill/mandrill.config.js'; import { EmailBuilderClass } from './models/EmailBuilderClass.js'; import { SendGridConfig } from './transports/sendgrid/sendgrid.config.js'; @@ -19,12 +19,13 @@ export class EmailProvider { constructor(transport: string, transportSettings: any) { if (transport === 'mailgun') { + this._transportName = 'mailgun'; const { apiKey, proxy, host } = transportSettings.mailgun; let domain = ConfigController.getInstance().config.sendingDomain; if (!isEmpty(transportSettings.mailgun.domain)) { domain = transportSettings.mailgun.domain; } - if (isNil(apiKey) || isNil(domain) || isNil(host)) { + if (isEmpty(apiKey) || isEmpty(domain) || isEmpty(host)) { throw new Error('Mailgun transport settings are missing'); } const mailgunSettings: MailgunConfig = { @@ -40,6 +41,10 @@ export class EmailProvider { this._transportName = 'smtp'; const { smtp } = transportSettings; + const { port, host } = smtp; + if (isEmpty(port) || isEmpty(host)) { + throw new Error('Smtp transport settings are missing'); + } smtp.auth.user = smtp.auth.username; smtp.auth.pass = smtp.auth.password; if (smtp.ignoreTls) { @@ -57,16 +62,23 @@ export class EmailProvider { }); } else if (transport === 'mandrill') { this._transportName = 'mandrill'; + const { apiKey } = transportSettings.mandrill.apiKey; + if (isEmpty(apiKey)) { + throw new Error('Mandrill transport settings are missing'); + } const mandrillSettings: MandrillConfig = { - auth: { - apiKey: transportSettings.mandrill.apiKey, - }, + auth: { apiKey }, }; this._transport = new MandrillProvider(mandrillSettings); } else if (transport === 'sendgrid') { this._transportName = 'sendgrid'; + const { residency, apiKey } = transportSettings.sendgrid; + if (isEmpty(apiKey) || isEmpty(residency)) { + throw new Error('Sendgrid transport settings are missing'); + } const sgSettings: SendGridConfig = { - apiKey: transportSettings['sendgrid'].apiKey, + apiKey, + residency, }; this._transport = new SendgridProvider(sgSettings); } else { diff --git a/modules/email/src/email-provider/transports/sendgrid/SendgridProvider.ts b/modules/email/src/email-provider/transports/sendgrid/SendgridProvider.ts index edca26a94..f662dc9cb 100644 --- a/modules/email/src/email-provider/transports/sendgrid/SendgridProvider.ts +++ b/modules/email/src/email-provider/transports/sendgrid/SendgridProvider.ts @@ -21,6 +21,7 @@ export class SendgridProvider extends EmailProviderClass { constructor(sgSettings: SendGridConfig) { super(createTransport(sgTransport(sgSettings))); this._sgClient = new Client(); + this._sgClient.setDataResidency(sgSettings.residency); this._sgClient.setApiKey(sgSettings.apiKey); } diff --git a/modules/email/src/email-provider/transports/sendgrid/sendgrid.config.ts b/modules/email/src/email-provider/transports/sendgrid/sendgrid.config.ts index 9e54074e9..3929e963c 100644 --- a/modules/email/src/email-provider/transports/sendgrid/sendgrid.config.ts +++ b/modules/email/src/email-provider/transports/sendgrid/sendgrid.config.ts @@ -1,3 +1,4 @@ export interface SendGridConfig { apiKey: string; + residency: string; }