hangerthem.com/app/api/v1/email/route.ts
2024-08-12 15:15:13 +02:00

71 lines
1.8 KiB
TypeScript

import {
successResponse,
optionsResponse,
badRequestResponse,
tooManyRequestsResponse,
internalServerErrorResponse,
} from "@/helpers/apiHelper"
import { NextRequest, NextResponse } from "next/server"
import { sendEmail } from "@/utils/emailUtils"
import rateLimit from "express-rate-limit"
const limiter = rateLimit({
windowMs: 15 * 60 * 1000,
max: 100,
message: "Too many requests, please try again later.",
})
export async function POST(req: NextRequest, res: NextResponse) {
if (process.env.NODE_ENV !== "development") {
await new Promise((resolve, reject) => {
limiter(req, res, (result: any) => {
if (result instanceof Error) {
return tooManyRequestsResponse()
}
resolve(result)
})
})
}
try {
const { email, name, message, recaptchaToken } = await req.json()
if (!email || !name || !message || !recaptchaToken) {
return badRequestResponse("Missing required fields")
}
const recaptchaResponse = await fetch(
`https://www.google.com/recaptcha/api/siteverify`,
{
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
body: `secret=${process.env.RECAPTCHA_SECRET_KEY}&response=${recaptchaToken}`,
}
)
const recaptchaData = await recaptchaResponse.json()
if (!recaptchaData.success) {
return badRequestResponse("reCAPTCHA verification failed")
}
await sendEmail({
to: process.env.CONTACT_EMAIL as string,
subject: `New message from ${name} - ${email}`,
text: message,
})
return successResponse("Email sent successfully")
} catch (e) {
console.error(e)
return internalServerErrorResponse()
}
}
export async function OPTIONS() {
return optionsResponse({
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "POST, OPTIONS",
})
}