11import { NextRequest , NextResponse } from 'next/server'
2- import { createServerClient } from '@/lib/supabase-server'
32import { ChatPersistence } from '@/lib/chat-persistence'
3+ import { authenticateUser } from '@/lib/auth-utils'
4+
5+ export const runtime = 'nodejs'
46
57export async function GET ( request : NextRequest ) {
68 try {
7- const supabase = createServerClient ( )
8- const { data : { user } , error : authError } = await supabase . auth . getUser ( )
9-
10- if ( authError || ! user ) {
11- return NextResponse . json (
12- { error : 'Unauthorized' } ,
13- { status : 401 }
14- )
15- }
9+ const { user, error } = await authenticateUser ( )
10+ if ( error ) return error
1611
1712 const { searchParams } = new URL ( request . url )
1813 const format = searchParams . get ( 'format' ) || 'json'
@@ -26,6 +21,9 @@ export async function GET(request: NextRequest) {
2621
2722 // Export user's chat data
2823 const { sessions, messages } = await ChatPersistence . exportUserData ( user . id )
24+
25+ // Generate export date once for consistency
26+ const exportDate = new Date ( ) . toISOString ( ) . split ( 'T' ) [ 0 ]
2927
3028 if ( format === 'json' ) {
3129 const exportData = {
@@ -40,25 +38,32 @@ export async function GET(request: NextRequest) {
4038 return new NextResponse ( JSON . stringify ( exportData , null , 2 ) , {
4139 headers : {
4240 'Content-Type' : 'application/json' ,
43- 'Content-Disposition' : `attachment; filename="chat-export-${ user . id } -${ new Date ( ) . toISOString ( ) . split ( 'T' ) [ 0 ] } .json"` ,
41+ 'Content-Disposition' : `attachment; filename="chat-export-${ user . id } -${ exportDate } .json"` ,
4442 } ,
4543 } )
4644 }
4745
4846 if ( format === 'csv' ) {
47+ // Helper function to properly escape and quote CSV fields
48+ const escapeCsvField = ( field : string ) : string => {
49+ if ( ! field ) return '""'
50+ // Quote the field and escape any quotes within it
51+ return `"${ field . replace ( / " / g, '""' ) } "`
52+ }
53+
4954 // Convert to CSV format
5055 const csvLines = [ 'Session ID,Timestamp,Role,Content,Model,Template' ]
5156
5257 sessions . forEach ( session => {
5358 const sessionMessages = messages [ session . sessionId ] || [ ]
5459 sessionMessages . forEach ( message => {
5560 const csvLine = [
56- session . sessionId ,
57- message . timestamp ,
58- message . role ,
59- `" ${ message . content . replace ( / " / g , '""' ) } "` , // Escape quotes
60- message . model || '' ,
61- message . template || ''
61+ escapeCsvField ( session . sessionId ) ,
62+ escapeCsvField ( message . timestamp ) ,
63+ escapeCsvField ( message . role ) ,
64+ escapeCsvField ( message . content ) ,
65+ escapeCsvField ( message . model || '' ) ,
66+ escapeCsvField ( message . template || '' )
6267 ] . join ( ',' )
6368 csvLines . push ( csvLine )
6469 } )
@@ -69,7 +74,7 @@ export async function GET(request: NextRequest) {
6974 return new NextResponse ( csvContent , {
7075 headers : {
7176 'Content-Type' : 'text/csv' ,
72- 'Content-Disposition' : `attachment; filename="chat-export-${ user . id } -${ new Date ( ) . toISOString ( ) . split ( 'T' ) [ 0 ] } .csv"` ,
77+ 'Content-Disposition' : `attachment; filename="chat-export-${ user . id } -${ exportDate } .csv"` ,
7378 } ,
7479 } )
7580 }
0 commit comments