11import { NextRequest , NextResponse } from "next/server" ;
2- import fs from "fs/promises" ;
3- import path from "path" ;
4-
5- const submissionsDir = path . resolve ( process . cwd ( ) , "contact-submissions" ) ;
6- const submissionsFile = path . resolve ( submissionsDir , "submissions.json" ) ;
7-
8- async function ensureSubmissionsDirExists ( ) {
9- try {
10- await fs . mkdir ( submissionsDir , { recursive : true } ) ;
11- } catch ( error ) {
12- console . error ( "Error creating submissions directory:" , error ) ;
13- }
14- }
2+ import { put , list } from "@vercel/blob" ;
153
164interface Submission {
175 name : string ;
@@ -22,18 +10,34 @@ interface Submission {
2210
2311async function getSubmissions ( ) : Promise < Submission [ ] > {
2412 try {
25- await ensureSubmissionsDirExists ( ) ;
26- const data = await fs . readFile ( submissionsFile , "utf8" ) ;
27- return JSON . parse ( data ) ;
28- } catch {
13+ const { blobs } = await list ( { prefix : "submissions.json" } ) ;
14+ if ( blobs . length === 0 ) {
15+ return [ ] ;
16+ }
17+ const submissionsBlob = blobs [ 0 ] ;
18+ const response = await fetch ( submissionsBlob . url ) ;
19+ if ( ! response . ok ) {
20+ // If the blob is not found or there's an error, start fresh.
21+ if ( response . status === 404 ) {
22+ return [ ] ;
23+ }
24+ throw new Error ( `Failed to fetch submissions: ${ response . statusText } ` ) ;
25+ }
26+ const submissions = await response . json ( ) ;
27+ return submissions ;
28+ } catch ( error ) {
29+ console . error ( "Error fetching submissions from blob:" , error ) ;
30+ // In case of any error, assume no submissions exist to avoid data loss.
2931 return [ ] ;
3032 }
3133}
3234
33- async function saveSubmission ( data : Submission ) {
34- const submissions = await getSubmissions ( ) ;
35- submissions . push ( data ) ;
36- await fs . writeFile ( submissionsFile , JSON . stringify ( submissions , null , 2 ) ) ;
35+ async function saveSubmissions ( data : Submission [ ] ) {
36+ await put ( "submissions.json" , JSON . stringify ( data , null , 2 ) , {
37+ access : "private" ,
38+ addRandomSuffix : false , // Overwrite the existing blob
39+ cacheControlMaxAge : 0 , // Ensure fresh data is always read
40+ } ) ;
3741}
3842
3943export async function POST ( req : NextRequest ) {
@@ -47,14 +51,16 @@ export async function POST(req: NextRequest) {
4751 ) ;
4852 }
4953
50- const newSubmission = {
54+ const newSubmission : Submission = {
5155 name,
5256 email,
5357 message,
5458 date : new Date ( ) . toISOString ( ) ,
5559 } ;
5660
57- await saveSubmission ( newSubmission ) ;
61+ const submissions = await getSubmissions ( ) ;
62+ submissions . push ( newSubmission ) ;
63+ await saveSubmissions ( submissions ) ;
5864
5965 return NextResponse . json ( { message : "Submission saved" } , { status : 200 } ) ;
6066 } catch ( error ) {
0 commit comments