khronoz's picture
V.0.3.1 (#29)
2483bce unverified
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 });
}