-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathemail.ts
More file actions
55 lines (46 loc) · 1.72 KB
/
email.ts
File metadata and controls
55 lines (46 loc) · 1.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import type { FastifyPluginAsync } from 'fastify'
import fp from 'fastify-plugin'
import { Resend } from 'resend'
import type { FakeEmailProvider } from '../../test/utils/fake-email.js'
import type { EmailProvider } from '../lib/email.js'
import { env } from '../lib/env.js'
declare module 'fastify' {
interface FastifyInstance {
emailProvider: EmailProvider
fakeEmail: FakeEmailProvider | null
}
}
const resend = new Resend(env.RESEND_API_KEY)
const emailPlugin: FastifyPluginAsync = async fastify => {
const globalTestProvider =
typeof globalThis !== 'undefined'
? ((globalThis as { __testEmailProvider?: EmailProvider }).__testEmailProvider ?? null)
: null
let fakeForTestAi: FakeEmailProvider | null = null
if (env.ALLOW_TEST && !globalTestProvider) {
const { FakeEmailProvider } = await import('../../test/utils/fake-email.js')
fakeForTestAi = new FakeEmailProvider()
}
let resolvedFake: FakeEmailProvider | null = fakeForTestAi
if (globalTestProvider) {
const { FakeEmailProvider } = await import('../../test/utils/fake-email.js')
resolvedFake =
globalTestProvider instanceof FakeEmailProvider ? globalTestProvider : fakeForTestAi
}
const composite: EmailProvider = {
emails: {
send: async options => {
if (globalTestProvider) return globalTestProvider.emails.send(options)
const isTestAi = options.to.endsWith('@test.ai')
if (env.ALLOW_TEST && isTestAi && fakeForTestAi) return fakeForTestAi.emails.send(options)
return resend.emails.send(options)
},
},
}
fastify.decorate('emailProvider', composite)
fastify.decorate('fakeEmail', resolvedFake)
}
export default fp(emailPlugin, {
name: 'email',
dependencies: [],
})