aethex-forge/api/user/delete-account.ts
Builder.io 9e6adcd36e Fix type casting in delete account endpoint
cgen-20760d2558004c7bb85ec8501c10b42d
2025-11-16 07:08:46 +00:00

140 lines
3.8 KiB
TypeScript

import { getAdminClient } from "../_supabase.js";
export default async (req: Request) => {
const { method, headers } = req;
if (method !== "DELETE") {
return new Response(JSON.stringify({ error: "Method not allowed" }), {
status: 405,
headers: { "Content-Type": "application/json" },
});
}
try {
const adminToken =
headers.get("Authorization")?.replace("Bearer ", "") || "";
if (adminToken !== "mrpiglr-admin-token") {
return new Response(JSON.stringify({ error: "Unauthorized" }), {
status: 401,
headers: { "Content-Type": "application/json" },
});
}
const { email } = (await req.json()) as { email?: string };
if (!email) {
return new Response(
JSON.stringify({ error: "Missing email parameter" }),
{
status: 400,
headers: { "Content-Type": "application/json" },
},
);
}
const supabase = getAdminClient();
// Get the user by email
const { data: profile, error: profileError } = await supabase
.from("user_profiles")
.select("user_id, email")
.eq("email", email)
.single();
if (profileError || !profile) {
return new Response(
JSON.stringify({
error: "User not found",
details: profileError?.message,
}),
{
status: 404,
headers: { "Content-Type": "application/json" },
},
);
}
const userId = profile.user_id;
// Delete from various tables
// 1. Delete achievements
await supabase.from("achievements_earned").delete().eq("user_id", userId);
// 2. Delete applications
await supabase.from("applications").delete().eq("user_id", userId);
// 3. Delete creator profiles
await supabase.from("creator_profiles").delete().eq("user_id", userId);
// 4. Delete projects
await supabase.from("projects").delete().eq("user_id", userId);
// 5. Delete social posts
await supabase.from("social_posts").delete().eq("user_id", userId);
// 6. Delete linked emails
await supabase.from("user_email_links").delete().eq("user_id", userId);
// 7. Delete Discord links
await supabase.from("discord_links").delete().eq("user_id", userId);
// 8. Delete web3 wallets
await supabase.from("web3_wallets").delete().eq("user_id", userId);
// 9. Delete user profile
const { error: profileDeleteError } = await supabase
.from("user_profiles")
.delete()
.eq("user_id", userId);
if (profileDeleteError) {
return new Response(
JSON.stringify({
error: "Failed to delete user profile",
details: profileDeleteError.message,
}),
{
status: 500,
headers: { "Content-Type": "application/json" },
},
);
}
// 10. Delete from Supabase auth (this is a special call)
// Note: This requires admin access and will remove the auth user
const { error: authError } = await (supabase.auth.admin as any).deleteUser(
userId,
);
if (authError) {
console.error("Auth deletion error:", authError);
// Don't fail the entire operation if auth deletion fails
// The profile is already deleted
}
return new Response(
JSON.stringify({
success: true,
message: `User account ${email} has been successfully deleted`,
userId,
}),
{
status: 200,
headers: { "Content-Type": "application/json" },
},
);
} catch (error: any) {
console.error("Error deleting user:", error);
return new Response(
JSON.stringify({
error: "Internal server error",
message: error?.message,
}),
{
status: 500,
headers: { "Content-Type": "application/json" },
},
);
}
};