1
0
Fork 0
mirror of https://github.com/maybe-finance/maybe.git synced 2025-08-10 07:55:21 +02:00

Merge remote-tracking branch 'upstream/main' into teller-p2-service

This commit is contained in:
Tyler Myracle 2024-01-15 19:58:39 -06:00
commit 823eab2c11
10 changed files with 40 additions and 16 deletions

View file

@ -4,6 +4,7 @@ about: Create a report to help us improve
title: '' title: ''
labels: bug labels: bug
assignees: '' assignees: ''
--- ---
**Describe the bug** **Describe the bug**

View file

@ -1,12 +1,13 @@
--- ---
name: Feature request name: Feature request or improvement
about: Suggest an idea for this project about: Suggest a new feature or improvement
title: '' title: ''
labels: '' labels: ''
assignees: '' assignees: ''
--- ---
**Is your feature request related to a problem? Please describe.** **Is your request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like** **Describe the solution you'd like**

View file

@ -57,13 +57,14 @@ Then run the following yarn commands:
``` ```
yarn install yarn install
yarn run dev:services yarn run dev:services:all
yarn prisma:migrate:dev yarn prisma:migrate:dev
yarn prisma:seed yarn prisma:seed
yarn dev yarn dev
``` ```
## Contributing ## Contributing
To contribute, please see our [contribution guide](https://github.com/maybe-finance/maybe/blob/main/CONTRIBUTING.md). To contribute, please see our [contribution guide](https://github.com/maybe-finance/maybe/blob/main/CONTRIBUTING.md).
## High-priority issues ## 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) - [Handling money](https://github.com/maybe-finance/maybe/wiki/Handling-Money)
- [REST API](https://github.com/maybe-finance/maybe/wiki/REST-API) - [REST API](https://github.com/maybe-finance/maybe/wiki/REST-API)
## Repo Activity ## 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 ## Credits

View file

@ -1,6 +1,6 @@
import { ServerClient } from 'postmark' import { ServerClient } from 'postmark'
import env from '../../env' 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 export default postmark

View file

@ -75,7 +75,7 @@ const envSchema = z.object({
NX_POSTMARK_FROM_ADDRESS: z.string().default('account@maybe.co'), NX_POSTMARK_FROM_ADDRESS: z.string().default('account@maybe.co'),
NX_POSTMARK_REPLY_TO_ADDRESS: z.string().default('support@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) const env = envSchema.parse(process.env)

View file

@ -1,6 +1,6 @@
import { ServerClient } from 'postmark' import { ServerClient } from 'postmark'
import env from '../../env' 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 export default postmark

View file

@ -29,7 +29,7 @@ const envSchema = z.object({
NX_POSTMARK_FROM_ADDRESS: z.string().default('account@maybe.co'), NX_POSTMARK_FROM_ADDRESS: z.string().default('account@maybe.co'),
NX_POSTMARK_REPLY_TO_ADDRESS: z.string().default('support@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_STRIPE_SECRET_KEY: z.string().default('sk_test_REPLACE_THIS'),
NX_CDN_PRIVATE_BUCKET: z.string().default('REPLACE_THIS'), NX_CDN_PRIVATE_BUCKET: z.string().default('REPLACE_THIS'),

View file

@ -144,6 +144,7 @@ function ProfileForm({ title, onSubmit, defaultValues }: ProfileViewProps) {
<DatePicker <DatePicker
popperPlacement="bottom" popperPlacement="bottom"
className="mt-2" className="mt-2"
minCalendarDate={DateTime.now().minus({ years: 100 }).toISODate()}
error={error?.message} error={error?.message}
{...field} {...field}
/> />

View file

@ -22,7 +22,7 @@ export interface IEmailService {
export class EmailService implements IEmailService { export class EmailService implements IEmailService {
constructor( constructor(
private readonly logger: Logger, private readonly logger: Logger,
private readonly postmark: PostmarkServerClient, private readonly postmark: PostmarkServerClient | undefined,
private readonly defaultAddresses: { from: string; replyTo?: string } private readonly defaultAddresses: { from: string; replyTo?: string }
) {} ) {}
@ -85,6 +85,11 @@ export class EmailService implements IEmailService {
message.TemplateModel 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) return await this.postmark.sendEmailWithTemplate(message)
} }
@ -94,6 +99,11 @@ export class EmailService implements IEmailService {
{ text: message.TextBody, html: message.HtmlBody } { 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) return await this.postmark.sendEmail(message)
} }
@ -108,9 +118,13 @@ export class EmailService implements IEmailService {
return ( return (
await Promise.all( await Promise.all(
chunk(messages, 500).map((chunk) => chunk(messages, 500).map((chunk) => {
this.postmark.sendEmailBatchWithTemplates(chunk) if (!this.postmark) {
) this.logger.info('Postmark API key not provided, skipping email send')
return [] as MessageSendingResponse[]
}
return this.postmark.sendEmailBatchWithTemplates(chunk)
})
) )
).flat() ).flat()
} }
@ -124,7 +138,13 @@ export class EmailService implements IEmailService {
return ( return (
await Promise.all( 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() ).flat()
} }

View file

@ -5,7 +5,7 @@
"scripts": { "scripts": {
"dev": "nx run-many --target serve --projects=client,server,workers --parallel --host 0.0.0.0 --nx-bail=true --maxParallel=100", "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": "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 -d",
"dev:workers:test": "nx test workers --skip-nx-cache --runInBand", "dev:workers:test": "nx test workers --skip-nx-cache --runInBand",
"dev:server:test": "nx test server --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", "dev:test:unit": "yarn dev:ci:test --testPathPattern='^(?!.*integration).*$' --verbose --skip-nx-cache",