Vercel React Best Practices denetimi, sunucu tarafı: - odeme: analitik olayı after() ile yanıt sonrasına alındı; ucuz ürün doğrulaması oturum turundan öne çekildi; sonuç kartında oturum+sipariş paralel okunuyor - /api/soru POST: gövde+oturum ve 3 bağımsız sorgu Promise.all'a bağlandı - rehber: prod'da globalThis cache + özetler için frontmatter fast-path (24 dosya okuma + marked.parse her render'da tekrarlanıyordu); arama kutusuna giden payload RehberAramaKaydi'ya kırpıldı (tarih serileşmiyor) - /sonuc hattı: ProgramListeSatiri (fakulte/puan2025 client'a serileşmiyor) - katalog: universite/bolum listelerinde O(n²) filtreler tek geçişe indi - sira-gerekli + katalog-arama: effect'te setState kalktı (lint yeşil) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
93 lines
2.6 KiB
TypeScript
93 lines
2.6 KiB
TypeScript
// YÖK Atlas veri tipleri ve puan türü sabiti — client ve server ortak tüketir.
|
||
// Sorgu fonksiyonları @/lib/db'de (server-only) yaşar; buraya runtime bağımlılığı
|
||
// olan hiçbir şey eklenmez.
|
||
|
||
export type Program = {
|
||
id: string;
|
||
isim: string;
|
||
universite: string;
|
||
unitur: string | null;
|
||
il: string | null;
|
||
fakulte: string | null;
|
||
tur: string;
|
||
sure: number | null;
|
||
sira2025: number | null;
|
||
sira2024: number | null;
|
||
sira2023: number | null;
|
||
sira2022: number | null;
|
||
sira2021: number | null;
|
||
puan2025: number | null;
|
||
kontenjan2025: number | null;
|
||
yerlesen2025: number | null;
|
||
};
|
||
|
||
export const PUAN_TURLERI = {
|
||
say: "SAYISAL",
|
||
ea: "EŞİT AĞIRLIK",
|
||
soz: "SÖZEL",
|
||
dil: "DİL",
|
||
tyt: "TYT",
|
||
} as const;
|
||
|
||
export type PuanTuruKey = keyof typeof PUAN_TURLERI;
|
||
|
||
export type DilimKey = "hayal" | "dengeli" | "garanti";
|
||
|
||
export type RankResults = {
|
||
hayal: Program[];
|
||
dengeli: Program[];
|
||
garanti: Program[];
|
||
/** Dilim başına pencereye düşen TOPLAM program sayısı (limit'ten bağımsız) */
|
||
toplam: Record<DilimKey, number>;
|
||
};
|
||
|
||
/**
|
||
* /sonuc ham tablosunun satırı: tablo `fakulte` ve `puan2025`'i hiç
|
||
* kullanmadığı için bu alanlar client'a serileştirilmez (satır başına en
|
||
* uzun string alanlardan biri fakulte). Katalog sayfaları tam Program kullanır.
|
||
*/
|
||
export type ProgramListeSatiri = Omit<Program, "fakulte" | "puan2025">;
|
||
|
||
export type RankResultsListe = {
|
||
hayal: ProgramListeSatiri[];
|
||
dengeli: ProgramListeSatiri[];
|
||
garanti: ProgramListeSatiri[];
|
||
toplam: Record<DilimKey, number>;
|
||
};
|
||
|
||
// Vakıf sayılan unitur değerleri (bkz. DISTINCT unitur: VAKIF, VAKIF MYO,
|
||
// YURTDISI VAKIF). Devlet dışı her şey "vakıf" grubuna girer.
|
||
export type UniturGrubu = "devlet" | "vakif";
|
||
|
||
/** netler tablosunun bir yılı: yerleşen son kişinin ders bazlı netleri. */
|
||
export type ProgramNetSatiri = {
|
||
yil: number;
|
||
puanTuru: string | null;
|
||
tabanPuan: number | null;
|
||
obp: number | null;
|
||
tytTrkNet: number | null;
|
||
tytSosNet: number | null;
|
||
tytMatNet: number | null;
|
||
tytFenNet: number | null;
|
||
aytMatNet: number | null;
|
||
aytFizNet: number | null;
|
||
aytKimNet: number | null;
|
||
aytBioNet: number | null;
|
||
aytTdeNet: number | null;
|
||
aytTrh1Net: number | null;
|
||
aytCog1Net: number | null;
|
||
aytTrh2Net: number | null;
|
||
aytCog2Net: number | null;
|
||
aytDinNet: number | null;
|
||
aytFelNet: number | null;
|
||
ydtYdilNet: number | null;
|
||
};
|
||
|
||
export type SihirbazFacetleri = {
|
||
kategoriler: { ad: string; adet: number }[];
|
||
iller: { il: string; adet: number }[];
|
||
uniturler: { grup: UniturGrubu; adet: number }[];
|
||
/** Penceredeki (filtre uygulanmamış) toplam program sayısı */
|
||
toplam: number;
|
||
};
|