import { NextResponse, type NextRequest } from "next/server"; import { kontenjanTurleriGetir, netlerGetir, programGecmisiGetir, programGetir, } from "@/lib/db"; import { kosulMetinleri, ogretimUyesiToplami, programOzellikGetir, type ProgramOzellik } from "@/lib/program-ozellik"; import { BOLUM_ISTIHDAM, BOLUM_ISTIHDAM_KAYNAK, BOLUM_ISTIHDAM_YIL, ISTIHDAM_ORTALAMA, type BolumIstihdam, type IstihdamDuzeyi, } from "@/lib/bolum-istihdam"; import { uniSlugFromAd } from "@/lib/katalog"; import { bolumSayfaSlug } from "@/lib/slug"; import { URAP_DONEM, URAP_TOPLAM, urapSirasiBul } from "@/lib/urap-siralama"; import { OGRENCI_BASINA_UYE_MEDYAN, YOK_ISTATISTIK_DONEM, ogrenciBasinaUye, uniIstatistikBul, } from "@/lib/yok-istatistik"; import type { KontenjanTurleri, ProgramGecmisSatiri, ProgramNetSatiri, } from "@/types/yokatlas"; /** * Program satırındaki "ayrıntı" düğmesinin verisi (program-ayrinti.tsx): * künye (özellikler), yıllara göre sıra/puan/kontenjan/yerleşen, kontenjan * türleri, son yerleşenin netleri, yerleşme koşulları, TÜİK mezun istihdamı * ve üniversitenin URAP/YÖK İstatistik özeti. Hepsi yılda bir değişen açık * veri; istemci tarafında gönül rahatlığıyla cache'lenir. */ export type ProgramAyrintisi = { program: { id: string; isim: string; universite: string; il: string | null; unitur: string | null; fakulte: string | null; sure: number | null; efektifSira: number | null; }; ozellik: ProgramOzellik | null; /** prof + doç + dr. öğr. üyesi (sunucuda hesaplanır; çekmece db modülünü import etmez) */ ogretimUyesiToplam: number | null; kosullar: { kod: string; metin: string }[]; gecmis: ProgramGecmisSatiri[]; kontenjanTurleri: KontenjanTurleri | null; netler: ProgramNetSatiri[]; istihdam: | (BolumIstihdam & { duzey: IstihdamDuzeyi; yil: number; kaynak: string; ortalama: { istihdam: number | null; isBulmaAy: number | null }; bolumSayfasi: string; }) | null; universite: { slug: string; urap: { sira: number; toplam: number; donem: string } | null; istatistik: { donem: string; ogrenci: number; ogretimUyesi: number; akademisyen: number; hocaBasinaOgrenci: number; medyan: number; } | null; } | null; }; export function GET(request: NextRequest) { const id = request.nextUrl.searchParams.get("id") ?? ""; if (!/^\d{1,12}$/.test(id)) { return NextResponse.json( { error: "Geçerli bir program kimliği gerekli." }, { status: 400 }, ); } const p = programGetir(id); if (!p) { return NextResponse.json({ error: "Program bulunamadı." }, { status: 404 }); } const ozellik = programOzellikGetir(id); const duzey: IstihdamDuzeyi = p.tur === "TYT" ? "onlisans" : "lisans"; const bolumSlug = bolumSayfaSlug(p.isim); const istihdamVeri = BOLUM_ISTIHDAM[duzey][bolumSlug] ?? null; const uniSlug = uniSlugFromAd(p.universite); const urap = uniSlug ? urapSirasiBul(uniSlug) : null; const istatistik = uniSlug ? uniIstatistikBul(uniSlug) : null; const veri: ProgramAyrintisi = { program: { id: p.id, isim: p.isim.trim(), universite: p.universite, il: p.il, unitur: p.unitur, fakulte: p.fakulte, sure: p.sure, efektifSira: p.efektifSira, }, ozellik, ogretimUyesiToplam: ozellik ? ogretimUyesiToplami(ozellik) : null, kosullar: ozellik ? kosulMetinleri(ozellik.kosulKodlari) : [], gecmis: programGecmisiGetir(id), kontenjanTurleri: kontenjanTurleriGetir(id), netler: netlerGetir(id), istihdam: istihdamVeri ? { ...istihdamVeri, duzey, yil: BOLUM_ISTIHDAM_YIL, kaynak: BOLUM_ISTIHDAM_KAYNAK, ortalama: ISTIHDAM_ORTALAMA[duzey], bolumSayfasi: `/bolum/${bolumSlug}`, } : null, universite: uniSlug ? { slug: uniSlug, urap: urap ? { sira: urap.sira, toplam: URAP_TOPLAM, donem: URAP_DONEM } : null, istatistik: istatistik ? { donem: YOK_ISTATISTIK_DONEM, ogrenci: istatistik.ogrenci, ogretimUyesi: istatistik.ogretimUyesi, akademisyen: istatistik.akademisyen, hocaBasinaOgrenci: ogrenciBasinaUye(istatistik), medyan: OGRENCI_BASINA_UYE_MEDYAN, } : null, } : null, }; return NextResponse.json(veri, { headers: { "Cache-Control": "public, max-age=86400" }, }); }