- Program/PUAN_TURLERI/DilimKey/RankResults/UniturGrubu/ProgramNetSatiri/ SihirbazFacetleri artık src/types/yokatlas.ts'te; lib/db.ts yalnızca sorgu fonksiyonları barındırıyor - RaporSonuc/RaporKapsam/RaporParams/MaskeliRapor src/features/rapor/types/ rapor.ts'e taşındı; ölü kalan TercihSchema/RaporSchema silindi - 11 lib dosyasına import "server-only" eklendi; scripts'in düz node ile import ettiği dosyalara (db, appdb, rapor-havuzu, tadimlik-havuzu, ai/client, ai/cagri, credits) bilinçli eklenmedi - Davranış değişikliği yok; pnpm build yeşil Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
54 lines
1.8 KiB
TypeScript
54 lines
1.8 KiB
TypeScript
// 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,
|
||
};
|
||
}
|