my-fullstack-ai-platform/app/api/linkedin/disconnect/route.ts

59 lines
1.6 KiB
TypeScript
Raw Normal View History

import { NextResponse } from "next/server";
import { createClient } from "@/lib/supabase/server";
export async function DELETE() {
const supabase = await createClient();
const { data: userData, error: userError } = await supabase.auth.getUser();
if (userError || !userData.user) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}
const { data: profile } = await supabase
.from("profiles")
.select("unipile_account_id")
.eq("id", userData.user.id)
.single();
if (!profile?.unipile_account_id) {
return NextResponse.json({ error: "No LinkedIn account connected" }, { status: 400 });
}
const apiKey = process.env.UNIPILE_API_KEY;
const dsn = process.env.UNIPILE_DSN;
// Try to remove from Unipile (best-effort; don't block DB cleanup if it fails)
if (apiKey && dsn) {
const unipileRes = await fetch(
`https://${dsn}/api/v1/accounts/${profile.unipile_account_id}`,
{
method: "DELETE",
headers: { "X-API-KEY": apiKey },
}
);
if (!unipileRes.ok) {
console.warn(
"Unipile delete returned non-OK:",
unipileRes.status,
await unipileRes.text()
);
}
}
// Always clear from our DB
const { error: dbError } = await supabase
.from("profiles")
.update({
unipile_account_id: null,
unipile_account_status: null,
})
.eq("id", userData.user.id);
if (dbError) {
console.error("Error clearing Unipile account from profile:", dbError);
return NextResponse.json({ error: "DB update failed" }, { status: 500 });
}
return NextResponse.json({ ok: true });
}