140 lines
3.8 KiB
TypeScript
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" },
|
|
},
|
|
);
|
|
}
|
|
};
|