import { NextResponse, type NextRequest } from "next/server"; import { dilimAra, rankWindowFacets } from "@/lib/db"; import { PUAN_TURLERI, type DilimKey, type PuanTuruKey, } from "@/types/yokatlas"; import { KATEGORILER } from "@/lib/kategoriler"; // Sihirbaz modalı için: sıralamaya uygun kategori/il/üniversite tipi // facet'leri. Kademeli filtre: `kategori` (tekrarlı) il adımını, // `kategori` + `il` (tekrarlı) üniversite tipi adımını süzer — bir önceki // adımın seçimi bir sonrakinin seçeneklerini daraltır (bkz. rankWindowFacets). export function GET(request: NextRequest) { const { searchParams } = request.nextUrl; const sira = Number.parseInt(searchParams.get("sira") ?? "", 10); const turParam = searchParams.get("tur") ?? "say"; const tur: PuanTuruKey = turParam in PUAN_TURLERI ? (turParam as PuanTuruKey) : "say"; if (!Number.isFinite(sira) || sira < 1 || sira > 4_000_000) { return NextResponse.json( { error: "Geçerli bir sıralama gerekli." }, { status: 400 }, ); } const kategoriler = [ ...new Set( searchParams .getAll("kategori") .filter((k) => (KATEGORILER as readonly string[]).includes(k)), ), ]; const iller = [ ...new Set(searchParams.getAll("il").filter((i) => i.trim().length > 0)), ].slice(0, 5); // ?dilimler=1: /meraklisina'daki canlı dilim şeridi için dilim başına // toplam sayılar da eklenir (limit 0 → yalnızca COUNT çalışır) const dilimToplam = searchParams.get("dilimler") === "1" ? Object.fromEntries( (["hayal", "dengeli", "garanti"] as DilimKey[]).map((d) => [ d, dilimAra(sira, tur, d, { limit: 0 }).toplam, ]), ) : undefined; return NextResponse.json({ facetler: rankWindowFacets(sira, tur, { kategoriler, iller }), ...(dilimToplam ? { dilimToplam } : {}), }); }