import { NextResponse } from "next/server" import { createSupabaseServerClient } from "@/lib/supabase/server" import { rateLimit } from "@/lib/rate-limit" export async function GET() { const supabaseClient = await createSupabaseServerClient() const { data: { user }, } = await supabaseClient.auth.getUser() if (!user) { return NextResponse.json({ error: "not authenticated" }, { status: 401 }) } const rateLimitResult = await rateLimit(`export:${user.id}`, 5, 3_600_000) if (!rateLimitResult.success) { return NextResponse.json({ error: "too many requests" }, { status: 429 }) } const { data: profile } = await supabaseClient .from("user_profiles") .select("tier") .eq("id", user.id) .single() const tier = profile?.tier ?? "free" const { data: savedEntries } = await supabaseClient .from("user_entry_states") .select( "entries(id, title, url, author, summary, published_at, feeds(title, url))" ) .eq("user_id", user.id) .eq("saved", true) const exportData: Record = { exportedAt: new Date().toISOString(), tier, savedEntries: (savedEntries ?? []).map((row) => (row as Record).entries) ?? [], } if (tier === "pro" || tier === "developer") { const [subscriptionsResult, foldersResult, mutedKeywordsResult] = await Promise.all([ supabaseClient .from("subscriptions") .select("id, feed_id, folder_id, custom_title, feeds(title, url)") .eq("user_id", user.id), supabaseClient .from("folders") .select("id, name, position") .eq("user_id", user.id), supabaseClient .from("muted_keywords") .select("id, keyword") .eq("user_id", user.id), ]) exportData.subscriptions = subscriptionsResult.data ?? [] exportData.folders = foldersResult.data ?? [] exportData.mutedKeywords = mutedKeywordsResult.data ?? [] } const jsonString = JSON.stringify(exportData, null, 2) return new Response(jsonString, { headers: { "Content-Type": "application/json", "Content-Disposition": `attachment; filename="asa-news-export-${new Date().toISOString().slice(0, 10)}.json"`, }, }) }