import { createClient } from '@supabase/supabase-js'; import { NextRequest, NextResponse } from "next/server"; // GET request to retrieve the user's profile data export async function GET(request: NextRequest) { // Retrieve the session token from the request cookies const session = request.cookies.get('next-auth.session-token') || request.cookies.get('__Secure-next-auth.session-token'); // Create a new Supabase client const supabaseAuth = createClient( process.env.SUPABASE_URL ?? '', process.env.SUPABASE_SERVICE_ROLE_KEY ?? '', { db: { schema: 'next_auth' } }, ); const supabase = createClient( process.env.SUPABASE_URL ?? '', process.env.SUPABASE_SERVICE_ROLE_KEY ?? '', { db: { schema: 'public' } }, ); // Retrieve the user's ID from the session token const { data: sessionData, error: sessionError } = await supabaseAuth .from('sessions') .select('userId') .eq('sessionToken', session?.value) .single(); const userId = sessionData?.userId; if (sessionError) { console.error('Error fetching session from database:', sessionError.message); return NextResponse.json({ error: sessionError.message }, { status: 500 }); } // Retrieve the user's profile data const { data: userData, error: userError } = await supabase .from('users') .select('id, name, email, image') .eq('id', userId) .single(); if (userError) { console.error('Error fetching user data from database:', userError.message); return NextResponse.json({ error: userError.message }, { status: 500 }); } console.log('userData:', userData); return NextResponse.json({ userData: userData }); } // PUT request to update the user's profile data export async function PUT(request: NextRequest) { // Retrieve the session token from the request cookies const session = request.cookies.get('next-auth.session-token') || request.cookies.get('__Secure-next-auth.session-token'); // Retrieve the user's data from the request body const { userId, name, email, image } = await request.json(); // Create a new Supabase client const supabase = createClient( process.env.SUPABASE_URL ?? '', process.env.SUPABASE_SERVICE_ROLE_KEY ?? '', { db: { schema: 'public' } }, ); // Update the user's profile data const { data: updatedUserData, error: updateError } = await supabase .from('users') .update({ name, email, image }) .eq('id', userId); if (updateError) { console.error('Error updating user data in database:', updateError.message); return NextResponse.json({ error: updateError.message }, { status: 500 }); } // console.log('updatedUserData:', updatedUserData); return NextResponse.json({ updatedUserData }); } // DELETE request to delete the user's profile & all data export async function DELETE(request: NextRequest) { // Create a new Supabase client const supabaseAuth = createClient( process.env.SUPABASE_URL ?? '', process.env.SUPABASE_SERVICE_ROLE_KEY ?? '', { db: { schema: 'next_auth' } }, ); const supabase = createClient( process.env.SUPABASE_URL ?? '', process.env.SUPABASE_SERVICE_ROLE_KEY ?? '', { db: { schema: 'public' } }, ); // Retrieve the user's ID from the request body const { userId } = await request?.json(); // Retrieve the authorization token from the request headers let authorization = request.headers.get('Authorization'); // Public API key let api_key = null; // If no session, use the public API key if (authorization === null || authorization === undefined || authorization.includes('undefined')) { console.log('No authorization token found, using public API key'); api_key = process.env.BACKEND_API_KEY as string; authorization = null; // Clear the authorization token } // Fetch the collection_ids of the user's collections from the collections table in public schema const { data: collectionIds, error: collectionError } = await supabase .from('collections') .select('collection_id') .eq('id', userId); if (collectionError) { console.error('Error fetching user collections from database:', collectionError.message); return NextResponse.json({ error: collectionError.message }, { status: 500 }); } // Convert collectionIds to an array of strings with only the collection_id values const collectionIdsArray = collectionIds.map((collection: any) => collection.collection_id); // console.log('collectionIdsArray:', collectionIdsArray); // Log the request body before sending the POST request // console.log('Request Body:', JSON.stringify({ collection_ids: collectionIdsArray })); // Delete the user's collection data from vecs schema via POST request to Backend API const deleteVecsResponse = await fetch(`${process.env.DELETE_MULTI_COLLECTION_API}`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': authorization, 'X-API-Key': api_key, } as any, body: JSON.stringify({ collection_ids: collectionIdsArray }), // Send collection IDs as an array }); if (!deleteVecsResponse.ok) { console.error('Error deleting', collectionIdsArray, 'from vecs schema:', deleteVecsResponse.statusText); return NextResponse.json({ error: deleteVecsResponse.statusText }, { status: deleteVecsResponse.status }); } // Delete the user's profile data from users table in next_auth schema (and all related data via cascaded delete for tables in both public and next_auth schema) const { data: deletedUserData, error: deleteError } = await supabaseAuth .from('users') .delete() .eq('id', userId) // TODO: Delete the user's vector collection from the vecs schema if (deleteError) { console.error('Error deleting user data from database:', deleteError.message); return NextResponse.json({ error: deleteError.message }, { status: 500 }); } // console.log('deletedUserData:', deletedUserData, 'collectionIds:', collectionIdsArray, 'deleteVecsResponse:', deleteVecsResponse); return NextResponse.json({ deletedUserData }); }