From f3ba272745609f5c5fee04eda41d039d3845a36e Mon Sep 17 00:00:00 2001 From: Tyler Myracle Date: Mon, 15 Jan 2024 17:23:05 -0600 Subject: [PATCH 1/3] 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", From 9ea4333260a354adc6052cff9f3d70d24c33208e Mon Sep 17 00:00:00 2001 From: Tyler Myracle Date: Mon, 15 Jan 2024 17:24:35 -0600 Subject: [PATCH 2/3] update README --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 396cf5b1..a3c8eca8 100644 --- a/README.md +++ b/README.md @@ -57,13 +57,14 @@ Then run the following yarn commands: ``` yarn install -yarn run dev:services +yarn run dev:services:all yarn prisma:migrate:dev yarn prisma:seed yarn dev ``` ## Contributing + To contribute, please see our [contribution guide](https://github.com/maybe-finance/maybe/blob/main/CONTRIBUTING.md). ## High-priority issues @@ -91,9 +92,9 @@ To pull market data in (for investments), you'll need a Polygon.io API key. You - [Handling money](https://github.com/maybe-finance/maybe/wiki/Handling-Money) - [REST API](https://github.com/maybe-finance/maybe/wiki/REST-API) - ## Repo Activity -![Repo Activity](https://repobeats.axiom.co/api/embed/7866c9790deba0baf63ca1688b209130b306ea4e.svg "Repobeats analytics image") + +![Repo Activity](https://repobeats.axiom.co/api/embed/7866c9790deba0baf63ca1688b209130b306ea4e.svg 'Repobeats analytics image') ## Credits From cdfed8233ff2d1070d20c2de922b3dc52525e28b Mon Sep 17 00:00:00 2001 From: Tyler Myracle Date: Mon, 15 Jan 2024 17:32:56 -0600 Subject: [PATCH 3/3] run docker in background --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 64d4aaeb..96c52336 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 docker-compose up", + "dev:services:all": "COMPOSE_PROFILES=services,ngrok docker-compose up -d", "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",