// Paketsiz kullanıcıya giden raporun sunucu tarafı maskesi. // YÖK Atlas'ın ham program ve taban sıralaması verileri ücretsiz kalır. // Yalnızca Yapay Zeka'nın ürettiği kişisel gerekçe/risk/trend yorumu maskelenir; // böylece istemciye ücretli analiz metni hiç inmez. import "server-only"; import type { MaskeliRapor, RaporSonuc, } from "@/features/rapor/types/rapor"; export const ACIK_SATIR = 3; const SAHTE_GEREKCE = "Bu tercih için kişisel gerekçe paketle açılır."; const SAHTE_RISK = "Sıralamana özel yerleşme riski paketle açılır."; const SAHTE_TREND = "Ham trend verisi ücretsizdir; Yapay Zeka yorumu paketle açılır."; /** genelDegerlendirme'nin yalnızca ilk 1-2 cümlesini bırakır. */ function degerlendirmeKirp(metin: string): string { const cumleler = metin.match(/[^.!?]+[.!?]+/g); if (!cumleler || cumleler.length <= 2) return metin; return `${cumleler.slice(0, 2).join(" ").trim()} …`; } export function raporMaskele(rapor: RaporSonuc): MaskeliRapor { const tercihler = rapor.tercihler.map((t, i) => i < ACIK_SATIR ? t : { ...t, gerekce: SAHTE_GEREKCE, riskNotu: SAHTE_RISK, trendOzeti: SAHTE_TREND, }, ); return { tercihler, genelDegerlendirme: degerlendirmeKirp(rapor.genelDegerlendirme), // Teaser: ilk uyarı açık kalır, kalan uyarıların yalnızca sayısı iner — // kilitli metinler istemciye hiç ulaşmaz. uyarilar: rapor.uyarilar?.slice(0, 1) ?? [], kilitliUyariSayisi: Math.max(0, (rapor.uyarilar?.length ?? 0) - 1), // Program adı, üniversite ve 2021–2025 taban sıralamaları ham veridir. programlar: rapor.programlar, // Kapsam (kaç program bulundu / dağılım uyarlandı mı) dürüstlük bilgisi: // paketsiz kullanıcı da görür, maskelenmez. kapsam: rapor.kapsam, }; }