@@ -7,23 +7,46 @@ const allowedOrigins = ["https://roamresearch.com", "http://localhost:3000"];
77
88const resend = new Resend ( process . env . RESEND_API_KEY ) ;
99
10- export async function POST ( request : Request ) {
11- try {
12- const origin = request . headers . get ( "origin" ) ;
13- const isAllowedOrigin = origin && allowedOrigins . includes ( origin ) ;
10+ const createCorsResponse = (
11+ data : unknown ,
12+ status : number ,
13+ origin : string | null ,
14+ ) : Response => {
15+ const response = NextResponse . json ( data , { status } ) ;
16+ const isAllowedOrigin = origin && allowedOrigins . includes ( origin ) ;
17+
18+ if ( isAllowedOrigin ) {
19+ response . headers . set ( "Access-Control-Allow-Origin" , origin ) ;
20+ response . headers . set ( "Access-Control-Allow-Methods" , "POST, OPTIONS" ) ;
21+ response . headers . set ( "Access-Control-Allow-Headers" , "Content-Type" ) ;
22+ }
1423
15- const body = await request . json ( ) ;
24+ return response ;
25+ } ;
26+
27+ export const POST = async ( request : Request ) => {
28+ const origin = request . headers . get ( "origin" ) ;
29+
30+ try {
31+ const body = ( await request . json ( ) ) as ErrorEmailProps ;
1632 const {
1733 errorMessage,
1834 errorStack,
1935 type,
2036 app,
2137 graphName,
38+ username,
39+ version,
40+ buildDate,
2241 context = { } ,
23- } = body as ErrorEmailProps ;
42+ } = body ;
2443
2544 if ( ! errorMessage ) {
26- return Response . json ( { error : "Missing error message" } , { status : 400 } ) ;
45+ return createCorsResponse (
46+ { error : "Missing error message" } ,
47+ 400 ,
48+ origin ,
49+ ) ;
2750 }
2851
2952 const { data, error : resendError } = await resend . emails . send ( {
@@ -37,32 +60,30 @@ export async function POST(request: Request) {
3760 type,
3861 app,
3962 graphName,
63+ // ?: Why is username assignment unsafe and graphName,version,buildDate are not?
64+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
65+ username,
66+ version,
67+ buildDate,
4068 context,
4169 } ) ,
4270 } ) ;
4371
4472 if ( resendError ) {
45- return Response . json ( { error : resendError } , { status : 500 } ) ;
46- }
47-
48- const response = NextResponse . json ( { success : true , data } ) ;
49-
50- if ( isAllowedOrigin ) {
51- response . headers . set ( "Access-Control-Allow-Origin" , origin ) ;
52- response . headers . set ( "Access-Control-Allow-Methods" , "POST, OPTIONS" ) ;
53- response . headers . set ( "Access-Control-Allow-Headers" , "Content-Type" ) ;
73+ return createCorsResponse ( { error : resendError } , 500 , origin ) ;
5474 }
5575
56- return response ;
76+ return createCorsResponse ( { success : true , data } , 200 , origin ) ;
5777 } catch ( error ) {
58- return Response . json (
78+ return createCorsResponse (
5979 { error : error instanceof Error ? error . message : "Unknown error" } ,
60- { status : 500 } ,
80+ 500 ,
81+ origin ,
6182 ) ;
6283 }
63- }
84+ } ;
6485
65- export async function OPTIONS ( request : Request ) {
86+ export const OPTIONS = ( request : Request ) => {
6687 const origin = request . headers . get ( "origin" ) ;
6788
6889 const isAllowedOrigin = origin && allowedOrigins . includes ( origin ) ;
@@ -78,4 +99,4 @@ export async function OPTIONS(request: Request) {
7899 }
79100
80101 return response ;
81- }
102+ } ;
0 commit comments