Skip to content

Commit c27df31

Browse files
authored
Merge pull request #113 from timlrx/v2
Add support for newsletter route handler
2 parents 19cb0ea + fd22f66 commit c27df31

File tree

11 files changed

+104
-25
lines changed

11 files changed

+104
-25
lines changed

.changeset/pre.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"neat-tables-occur",
1616
"pretty-worms-help",
1717
"proud-brooms-laugh",
18-
"unlucky-keys-join"
18+
"unlucky-keys-join",
19+
"weak-swans-heal"
1920
]
2021
}

.changeset/weak-swans-heal.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'pliny': patch
3+
---
4+
5+
Add support for newsletter route handler

packages/pliny/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# pliny
22

3+
## 0.1.0-beta.5
4+
5+
### Patch Changes
6+
7+
- 3e31a82: Add support for newsletter route handler
8+
39
## 0.1.0-beta.4
410

511
### Patch Changes

packages/pliny/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "pliny",
33
"description": "Main entry point for pliny components",
44
"homepage": "https://github.com/timlrx/pliny",
5-
"version": "0.1.0-beta.4",
5+
"version": "0.1.0-beta.5",
66
"type": "module",
77
"exports": {
88
"./*": "./*",

packages/pliny/src/newsletter/buttondown.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { NextApiRequest, NextApiResponse } from 'next'
1+
import { NextApiRequest } from 'next'
2+
import { NextRequest } from 'next/server'
23

3-
export const buttondownHandler = async (req: NextApiRequest, res: NextApiResponse) => {
4+
export const buttondownHandler = async (req: NextApiRequest | NextRequest) => {
45
const { email } = req.body
56
const API_KEY = process.env.BUTTONDOWN_API_KEY
67
const API_URL = 'https://api.buttondown.email/v1/'

packages/pliny/src/newsletter/convertkit.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { NextApiRequest, NextApiResponse } from 'next'
1+
import { NextApiRequest } from 'next'
2+
import { NextRequest } from 'next/server'
23

3-
export const convertkitHandler = async (req: NextApiRequest, res: NextApiResponse) => {
4+
export const convertkitHandler = async (req: NextApiRequest | NextRequest) => {
45
const { email } = req.body
56
const FORM_ID = process.env.CONVERTKIT_FORM_ID
67
const API_KEY = process.env.CONVERTKIT_API_KEY

packages/pliny/src/newsletter/emailOctopus.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { NextApiRequest, NextApiResponse } from 'next'
1+
import { NextApiRequest } from 'next'
2+
import { NextRequest } from 'next/server'
23

3-
export const emailOctopusHandler = async (req: NextApiRequest, res: NextApiResponse) => {
4+
export const emailOctopusHandler = async (req: NextApiRequest | NextRequest) => {
45
const { email } = req.body
56
const API_KEY = process.env.EMAILOCTOPUS_API_KEY
67
const LIST_ID = process.env.EMAILOCTOPUS_LIST_ID

packages/pliny/src/newsletter/index.ts

Lines changed: 72 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { NextApiRequest, NextApiResponse } from 'next'
2+
import { NextResponse } from 'next/server'
3+
import type { NextRequest } from 'next/server'
24
import { buttondownHandler } from './buttondown'
35
import { convertkitHandler } from './convertkit'
46
import { mailchimpHandler } from './mailchimp'
@@ -16,7 +18,7 @@ export interface NewsletterRequest extends NextApiRequest {
1618

1719
export type NewsletterResponse<T = any> = NextApiResponse<T>
1820

19-
async function NewsletterHandler(
21+
async function NewsletterAPIHandler(
2022
req: NextApiRequest,
2123
res: NextApiResponse,
2224
options: NewsletterConfig
@@ -29,22 +31,22 @@ async function NewsletterHandler(
2931
let response: Response
3032
switch (options.provider) {
3133
case 'buttondown':
32-
response = await buttondownHandler(req, res)
34+
response = await buttondownHandler(req)
3335
break
3436
case 'convertkit':
35-
response = await convertkitHandler(req, res)
37+
response = await convertkitHandler(req)
3638
break
3739
case 'mailchimp':
38-
response = await mailchimpHandler(req, res)
40+
response = await mailchimpHandler(req)
3941
break
4042
case 'klaviyo':
41-
response = await klaviyoHandler(req, res)
43+
response = await klaviyoHandler(req)
4244
break
4345
case 'revue':
44-
response = await revueHandler(req, res)
46+
response = await revueHandler(req)
4547
break
4648
case 'emailoctopus':
47-
response = await emailOctopusHandler(req, res)
49+
response = await emailOctopusHandler(req)
4850
break
4951
default:
5052
res.status(500).json({ error: `${options.provider} not supported` })
@@ -58,20 +60,79 @@ async function NewsletterHandler(
5860
}
5961
}
6062

63+
async function NewsletterRouteHandler(req: NextRequest, options: NewsletterConfig) {
64+
const res = await req.json()
65+
if (!res.email) {
66+
return NextResponse.json({ error: 'Email is required' }, { status: 400 })
67+
}
68+
try {
69+
let response: Response
70+
switch (options.provider) {
71+
case 'buttondown':
72+
response = await buttondownHandler(req)
73+
break
74+
case 'convertkit':
75+
response = await convertkitHandler(req)
76+
break
77+
case 'mailchimp':
78+
response = await mailchimpHandler(req)
79+
break
80+
case 'klaviyo':
81+
response = await klaviyoHandler(req)
82+
break
83+
case 'revue':
84+
response = await revueHandler(req)
85+
break
86+
case 'emailoctopus':
87+
response = await emailOctopusHandler(req)
88+
break
89+
default:
90+
return NextResponse.json({ error: `${options.provider} not supported` }, { status: 500 })
91+
}
92+
if (response.status == 200) {
93+
return NextResponse.json(
94+
{ message: 'Successfully subscribed to the newsletter' },
95+
{ status: response.status }
96+
)
97+
} else if (response.status >= 400) {
98+
return NextResponse.json(
99+
{ error: `There was an error subscribing to the list` },
100+
{ status: response.status }
101+
)
102+
}
103+
return NextResponse.json({ error: '' }, { status: 201 })
104+
} catch (error) {
105+
return NextResponse.json({ error: error.message || error.toString() }, { status: 500 })
106+
}
107+
}
108+
61109
export function NewsletterAPI(options: NewsletterConfig): any
110+
export function NewsletterAPI(req: NextRequest, options: NewsletterConfig): any
62111
export function NewsletterAPI(
63112
req: NextApiRequest,
64113
res: NextApiResponse,
65114
options: NewsletterConfig
66115
): any
67116

68117
export function NewsletterAPI(
69-
...args: [NewsletterConfig] | [NextApiRequest, NextApiResponse, NewsletterConfig]
118+
...args:
119+
| [NewsletterConfig]
120+
| [NextRequest, NewsletterConfig]
121+
| [NextApiRequest, NextApiResponse, NewsletterConfig]
70122
) {
71123
if (args.length === 1) {
72-
return async (req: NewsletterRequest, res: NewsletterResponse) =>
73-
await NewsletterHandler(req, res, args[0])
124+
return async (req: NewsletterRequest | NextRequest, res: NewsletterResponse) => {
125+
// For route handlers, 2nd argument contains the 'params' property instead of a response object
126+
if ('params' in res) {
127+
return await NewsletterRouteHandler(req as NextRequest, args[0])
128+
}
129+
return await NewsletterAPIHandler(req as NewsletterRequest, res, args[0])
130+
}
131+
}
132+
133+
if (args.length === 2) {
134+
return NewsletterRouteHandler(...args)
74135
}
75136

76-
return NewsletterHandler(args[0], args[1], args[2])
137+
return NewsletterAPIHandler(...args)
77138
}

packages/pliny/src/newsletter/klaviyo.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { NextApiRequest, NextApiResponse } from 'next'
1+
import { NextApiRequest } from 'next'
2+
import { NextRequest } from 'next/server'
23

3-
export const klaviyoHandler = async (req: NextApiRequest, res: NextApiResponse) => {
4+
export const klaviyoHandler = async (req: NextApiRequest | NextRequest) => {
45
const { email } = req.body
56
const API_KEY = process.env.KLAVIYO_API_KEY
67
const LIST_ID = process.env.KLAVIYO_LIST_ID

packages/pliny/src/newsletter/mailchimp.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
import { NextApiRequest, NextApiResponse } from 'next'
1+
import { NextApiRequest } from 'next'
2+
import { NextRequest } from 'next/server'
23
import mailchimp from '@mailchimp/mailchimp_marketing'
34

45
mailchimp.setConfig({
56
apiKey: process.env.MAILCHIMP_API_KEY,
67
server: process.env.MAILCHIMP_API_SERVER, // E.g. us1
78
})
89

9-
export const mailchimpHandler = async (req: NextApiRequest, res: NextApiResponse) => {
10+
export const mailchimpHandler = async (req: NextApiRequest | NextRequest) => {
1011
const { email } = req.body
1112

1213
const response = await mailchimp.lists.addListMember(process.env.MAILCHIMP_AUDIENCE_ID, {

0 commit comments

Comments
 (0)