From f3ba272745609f5c5fee04eda41d039d3845a36e Mon Sep 17 00:00:00 2001 From: Tyler Myracle Date: Mon, 15 Jan 2024 17:23:05 -0600 Subject: [PATCH] noop postmark sends if API key is not defined --- apps/server/src/app/lib/postmark.ts | 2 +- apps/server/src/env.ts | 2 +- apps/workers/src/app/lib/postmark.ts | 2 +- apps/workers/src/env.ts | 2 +- .../features/src/email/email.service.ts | 30 +++++++++++++++---- package.json | 2 +- 6 files changed, 30 insertions(+), 10 deletions(-) diff --git a/apps/server/src/app/lib/postmark.ts b/apps/server/src/app/lib/postmark.ts index 48eddf1b..ff0e87c6 100644 --- a/apps/server/src/app/lib/postmark.ts +++ b/apps/server/src/app/lib/postmark.ts @@ -1,6 +1,6 @@ import { ServerClient } from 'postmark' import env from '../../env' -const postmark = new ServerClient(env.NX_POSTMARK_API_TOKEN) +const postmark = env.NX_POSTMARK_API_TOKEN ? new ServerClient(env.NX_POSTMARK_API_TOKEN) : undefined export default postmark diff --git a/apps/server/src/env.ts b/apps/server/src/env.ts index e69f5f4d..fabdc7d2 100644 --- a/apps/server/src/env.ts +++ b/apps/server/src/env.ts @@ -74,7 +74,7 @@ const envSchema = z.object({ NX_POSTMARK_FROM_ADDRESS: z.string().default('account@maybe.co'), NX_POSTMARK_REPLY_TO_ADDRESS: z.string().default('support@maybe.co'), - NX_POSTMARK_API_TOKEN: z.string().default('REPLACE_THIS'), + NX_POSTMARK_API_TOKEN: z.string().optional(), }) const env = envSchema.parse(process.env) diff --git a/apps/workers/src/app/lib/postmark.ts b/apps/workers/src/app/lib/postmark.ts index 48eddf1b..ff0e87c6 100644 --- a/apps/workers/src/app/lib/postmark.ts +++ b/apps/workers/src/app/lib/postmark.ts @@ -1,6 +1,6 @@ import { ServerClient } from 'postmark' import env from '../../env' -const postmark = new ServerClient(env.NX_POSTMARK_API_TOKEN) +const postmark = env.NX_POSTMARK_API_TOKEN ? new ServerClient(env.NX_POSTMARK_API_TOKEN) : undefined export default postmark diff --git a/apps/workers/src/env.ts b/apps/workers/src/env.ts index c41d9692..df560b4e 100644 --- a/apps/workers/src/env.ts +++ b/apps/workers/src/env.ts @@ -29,7 +29,7 @@ const envSchema = z.object({ NX_POSTMARK_FROM_ADDRESS: z.string().default('account@maybe.co'), NX_POSTMARK_REPLY_TO_ADDRESS: z.string().default('support@maybe.co'), - NX_POSTMARK_API_TOKEN: z.string().default('REPLACE_THIS'), + NX_POSTMARK_API_TOKEN: z.string().optional(), NX_STRIPE_SECRET_KEY: z.string().default('sk_test_REPLACE_THIS'), NX_CDN_PRIVATE_BUCKET: z.string().default('REPLACE_THIS'), diff --git a/libs/server/features/src/email/email.service.ts b/libs/server/features/src/email/email.service.ts index 6c908985..b8b1d3b7 100644 --- a/libs/server/features/src/email/email.service.ts +++ b/libs/server/features/src/email/email.service.ts @@ -22,7 +22,7 @@ export interface IEmailService { export class EmailService implements IEmailService { constructor( private readonly logger: Logger, - private readonly postmark: PostmarkServerClient, + private readonly postmark: PostmarkServerClient | undefined, private readonly defaultAddresses: { from: string; replyTo?: string } ) {} @@ -85,6 +85,11 @@ export class EmailService implements IEmailService { message.TemplateModel ) + if (!this.postmark) { + this.logger.info('Postmark API key not provided, skipping email send') + return undefined as unknown as MessageSendingResponse + } + return await this.postmark.sendEmailWithTemplate(message) } @@ -94,6 +99,11 @@ export class EmailService implements IEmailService { { text: message.TextBody, html: message.HtmlBody } ) + if (!this.postmark) { + this.logger.info('Postmark API key not provided, skipping email send') + return undefined as unknown as MessageSendingResponse + } + return await this.postmark.sendEmail(message) } @@ -108,9 +118,13 @@ export class EmailService implements IEmailService { return ( await Promise.all( - chunk(messages, 500).map((chunk) => - this.postmark.sendEmailBatchWithTemplates(chunk) - ) + chunk(messages, 500).map((chunk) => { + if (!this.postmark) { + this.logger.info('Postmark API key not provided, skipping email send') + return [] as MessageSendingResponse[] + } + return this.postmark.sendEmailBatchWithTemplates(chunk) + }) ) ).flat() } @@ -124,7 +138,13 @@ export class EmailService implements IEmailService { return ( await Promise.all( - chunk(messages, 500).map((chunk) => this.postmark.sendEmailBatch(chunk)) + chunk(messages, 500).map((chunk) => { + if (!this.postmark) { + this.logger.info('Postmark API key not provided, skipping email send') + return [] as MessageSendingResponse[] + } + return this.postmark.sendEmailBatch(chunk) + }) ) ).flat() } diff --git a/package.json b/package.json index 4a99fc2b..64d4aaeb 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "dev": "nx run-many --target serve --projects=client,server,workers --parallel --host 0.0.0.0 --nx-bail=true --maxParallel=100", "dev:services": "COMPOSE_PROFILES=services docker-compose up -d", - "dev:services:all": "COMPOSE_PROFILES=services,ngrok,stripe docker-compose up", + "dev:services:all": "COMPOSE_PROFILES=services,ngrok docker-compose up", "dev:workers:test": "nx test workers --skip-nx-cache --runInBand", "dev:server:test": "nx test server --skip-nx-cache --runInBand", "dev:test:unit": "yarn dev:ci:test --testPathPattern='^(?!.*integration).*$' --verbose --skip-nx-cache",