59 lines
1.6 KiB
TypeScript
59 lines
1.6 KiB
TypeScript
|
|
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 });
|
||
|
|
}
|