import { NextRequest, NextResponse } from "next/server"; import { getApiKey } from "@/lib/utils/apiKey"; import { runGoogleSerpScraper, pollRunStatus, fetchDatasetItems } from "@/lib/services/apify"; import { isSocialOrDirectory } from "@/lib/utils/domains"; import { sinkLeadsToVault } from "@/lib/services/leadVault"; function sleep(ms: number) { return new Promise(r => setTimeout(r, ms)); } export async function POST(req: NextRequest) { try { const body = await req.json() as { query: string; count: number; country: string; language: string; filterSocial: boolean; }; const { query, count, country, language, filterSocial } = body; if (!query?.trim()) return NextResponse.json({ error: "Kein Suchbegriff" }, { status: 400 }); const apifyToken = await getApiKey("apify"); if (!apifyToken) return NextResponse.json({ error: "Apify API-Key fehlt" }, { status: 400 }); const maxPages = Math.ceil(count / 10); const runId = await runGoogleSerpScraper(query, maxPages, country, language, apifyToken); let runStatus = ""; let datasetId = ""; while (runStatus !== "SUCCEEDED" && runStatus !== "FAILED" && runStatus !== "ABORTED") { await sleep(3000); const result = await pollRunStatus(runId, apifyToken); runStatus = result.status; datasetId = result.defaultDatasetId; } if (runStatus !== "SUCCEEDED") throw new Error(`Apify run ${runStatus}`); let serpResults = await fetchDatasetItems(datasetId, apifyToken); if (filterSocial) { serpResults = serpResults.filter(r => !isSocialOrDirectory(r.domain)); } // Deduplicate by domain const seen = new Set(); const unique = serpResults.filter(r => { if (!r.domain || seen.has(r.domain)) return false; seen.add(r.domain); return true; }).slice(0, count); const stats = await sinkLeadsToVault( unique.map((r, i) => ({ domain: r.domain, companyName: r.title || null, serpTitle: r.title || null, serpSnippet: r.description || null, serpRank: r.position ?? i + 1, serpUrl: r.url || null, })), "quick-serp", query, ); return NextResponse.json(stats); } catch (err) { console.error("POST /api/leads/quick-serp error:", err); return NextResponse.json({ error: err instanceof Error ? err.message : "Fehler" }, { status: 500 }); } }