58 lines
1.9 KiB
TypeScript
58 lines
1.9 KiB
TypeScript
import { NextResponse } from 'next/server';
|
|
import { getServerSession } from 'next-auth';
|
|
import { authOptions } from '@/lib/auth/authOptions';
|
|
import { query } from '@/lib/db-postgres';
|
|
|
|
export async function POST(request: Request) {
|
|
try {
|
|
const session = await getServerSession(authOptions);
|
|
if (!session?.user?.email) {
|
|
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
|
|
}
|
|
|
|
const { projectId } = await request.json();
|
|
if (!projectId) {
|
|
return NextResponse.json({ error: 'Project ID is required' }, { status: 400 });
|
|
}
|
|
|
|
// Verify ownership
|
|
const rows = await query<{ id: string; data: any }>(`
|
|
SELECT p.id, p.data
|
|
FROM fs_projects p
|
|
JOIN fs_users u ON u.id = p.user_id
|
|
WHERE p.id = $1 AND u.data->>'email' = $2
|
|
LIMIT 1
|
|
`, [projectId, session.user.email]);
|
|
|
|
if (rows.length === 0) {
|
|
return NextResponse.json({ error: 'Project not found or unauthorized' }, { status: 404 });
|
|
}
|
|
|
|
// Unlink sessions
|
|
const sessionResult = await query(`
|
|
SELECT COUNT(*)::int AS count FROM fs_sessions WHERE data->>'projectId' = $1
|
|
`, [projectId]);
|
|
const sessionCount = sessionResult[0]?.count || 0;
|
|
|
|
await query(`
|
|
UPDATE fs_sessions
|
|
SET data = jsonb_set(
|
|
jsonb_set(data, '{projectId}', 'null'),
|
|
'{needsProjectAssociation}', 'true'
|
|
)
|
|
WHERE data->>'projectId' = $1
|
|
`, [projectId]);
|
|
|
|
// Delete the project
|
|
await query(`DELETE FROM fs_projects WHERE id = $1`, [projectId]);
|
|
|
|
return NextResponse.json({ success: true, message: 'Project deleted successfully', sessionsPreserved: sessionCount });
|
|
} catch (error) {
|
|
console.error('[POST /api/projects/delete] Error:', error);
|
|
return NextResponse.json(
|
|
{ error: 'Failed to delete project', details: error instanceof Error ? error.message : String(error) },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|