refactor: güncellenmiş profil çerezi ile sonuç sayfası yönlendirmeleri
Some checks failed
Deploy / deploy (push) Has been cancelled
Some checks failed
Deploy / deploy (push) Has been cancelled
Profil çerezinin SSR'da kullanılmasını sağlayarak, sonuç sayfasındaki yönlendirmeleri güncelledik. Artık profil bilgileri URL parametreleri yerine çerezden alınarak işleniyor. Ayrıca, profil çerezi olmayan kullanıcılar için yönlendirme mantığı iyileştirildi. Çeşitli bileşenlerdeki URL oluşturma fonksiyonları güncellenerek, profil bilgileri çerezden okunacak şekilde düzenlendi. Bu değişiklikler, kullanıcı deneyimini artırmayı ve daha tutarlı bir veri akışı sağlamayı hedefliyor.
This commit is contained in:
62
src/lib/harita-ulkeler-verisi.ts
Normal file
62
src/lib/harita-ulkeler-verisi.ts
Normal file
File diff suppressed because one or more lines are too long
115
src/lib/harita-ulkeler.ts
Normal file
115
src/lib/harita-ulkeler.ts
Normal file
@@ -0,0 +1,115 @@
|
||||
// Türkiye dışındaki (KKTC ve yurtdışı) üniversitelerin ülke haritası çözümü.
|
||||
// Kontür verisi harita-ulkeler-verisi.ts'te (scripts/ulke-harita-uret.ts üretir).
|
||||
|
||||
import {
|
||||
ULKE_HARITALARI,
|
||||
type UlkeKodu,
|
||||
type UlkeHarita,
|
||||
} from "./harita-ulkeler-verisi";
|
||||
|
||||
export {
|
||||
ULKE_HARITALARI,
|
||||
ULKE_HARITA_GENISLIK,
|
||||
ULKE_HARITA_YUKSEKLIK,
|
||||
} from "./harita-ulkeler-verisi";
|
||||
export type { UlkeKodu, UlkeHarita } from "./harita-ulkeler-verisi";
|
||||
|
||||
/** Schema.org addressCountry için ISO 3166-1 alpha-2 kodları. */
|
||||
export const ULKE_ISO: Record<UlkeKodu, string> = {
|
||||
kktc: "CY",
|
||||
azerbaycan: "AZ",
|
||||
kirgizistan: "KG",
|
||||
kazakistan: "KZ",
|
||||
"bosna-hersek": "BA",
|
||||
makedonya: "MK",
|
||||
arnavutluk: "AL",
|
||||
};
|
||||
|
||||
type Sehir = { ulke: UlkeKodu; ad: string };
|
||||
|
||||
/** DB'deki il değerlerinden ve düzeltme tablosundan şehir anahtarları. */
|
||||
const SEHIRLER: Record<string, Sehir> = {
|
||||
GİRNE: { ulke: "kktc", ad: "Girne" },
|
||||
LEFKOŞA: { ulke: "kktc", ad: "Lefkoşa" },
|
||||
GAZİMAĞUSA: { ulke: "kktc", ad: "Gazimağusa" },
|
||||
GÜZELYURT: { ulke: "kktc", ad: "Güzelyurt" },
|
||||
LEFKE: { ulke: "kktc", ad: "Lefke" },
|
||||
"BAKÜ-AZERBAYCAN": { ulke: "azerbaycan", ad: "Bakü" },
|
||||
"BİŞKEK-KIRGIZİSTAN": { ulke: "kirgizistan", ad: "Bişkek" },
|
||||
"TÜRKİSTAN-KAZAKİSTAN": { ulke: "kazakistan", ad: "Türkistan" },
|
||||
"SARAYBOSNA - BOSNA - HERSEK": { ulke: "bosna-hersek", ad: "Saraybosna" },
|
||||
ÜSKÜP: { ulke: "makedonya", ad: "Üsküp" },
|
||||
TİRAN: { ulke: "arnavutluk", ad: "Tiran" },
|
||||
};
|
||||
|
||||
/**
|
||||
* Kaynak verideki gürültü için üniversite adına göre düzeltme:
|
||||
* - Uluslararası Balkan Üniversitesi Üsküp'tedir; YÖK Atlas satırlarının
|
||||
* çoğu il'i yanlışlıkla "SARAYBOSNA - BOSNA - HERSEK" der.
|
||||
* - Tiran New York Üniversitesi'nin il alanı boştur.
|
||||
* - ODTÜ ve ASBÜ'nün KKTC kampüs satırları vardır ama ana kampüs Türkiye'de;
|
||||
* null → Türkiye haritasında kalır.
|
||||
* Anahtar: uniAdiNormalize edilmiş adın tr-TR büyük harf hali.
|
||||
*/
|
||||
const UNI_DUZELTME: Record<string, keyof typeof SEHIRLER | null> = {
|
||||
"ULUSLARARASI BALKAN ÜNİVERSİTESİ": "ÜSKÜP",
|
||||
"TİRAN NEW YORK ÜNİVERSİTESİ": "TİRAN",
|
||||
"KIBRIS AYDIN ÜNİVERSİTESİ": "GİRNE", // il alanı yalnızca "KIBRIS"
|
||||
"ORTA DOĞU TEKNİK ÜNİVERSİTESİ": null,
|
||||
"ANKARA SOSYAL BİLİMLER ÜNİVERSİTESİ": null,
|
||||
};
|
||||
|
||||
/** il değeri Türkiye dışını mı gösteriyor? ("KIBRIS" genel değeri dahil) */
|
||||
const YURTDISI_IL = new Set([...Object.keys(SEHIRLER), "KIBRIS"]);
|
||||
|
||||
export type UlkeKonum = {
|
||||
ulke: UlkeKodu;
|
||||
ulkeAd: string;
|
||||
iso: string;
|
||||
harita: UlkeHarita;
|
||||
/** Şehir adı; genel "KIBRIS" gibi şehri bilinmeyen durumda null */
|
||||
sehir: string | null;
|
||||
};
|
||||
|
||||
function sehirdenKonum(anahtar: keyof typeof SEHIRLER): UlkeKonum {
|
||||
const sehir = SEHIRLER[anahtar];
|
||||
const harita = ULKE_HARITALARI[sehir.ulke];
|
||||
return {
|
||||
ulke: sehir.ulke,
|
||||
ulkeAd: harita.ad,
|
||||
iso: ULKE_ISO[sehir.ulke],
|
||||
harita,
|
||||
sehir: sehir.ad,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Üniversite Türkiye dışındaysa ülke haritası + şehir konumu döner;
|
||||
* Türkiye'deyse (veya çözülemiyorsa) null — Türkiye haritası kullanılır.
|
||||
*/
|
||||
export function uniUlkeKonum(
|
||||
universite: string,
|
||||
il: string | null,
|
||||
): UlkeKonum | null {
|
||||
const ad = universite
|
||||
.replace(/\s*\([^)]*\)\s*$/, "")
|
||||
.trim()
|
||||
.toLocaleUpperCase("tr-TR");
|
||||
|
||||
if (ad in UNI_DUZELTME) {
|
||||
const anahtar = UNI_DUZELTME[ad];
|
||||
return anahtar === null ? null : sehirdenKonum(anahtar);
|
||||
}
|
||||
if (!il || !YURTDISI_IL.has(il)) return null;
|
||||
if (il in SEHIRLER) return sehirdenKonum(il as keyof typeof SEHIRLER);
|
||||
|
||||
// il "KIBRIS": ülke bilinir, şehir bilinmez — haritayı işaretsiz göster
|
||||
const harita = ULKE_HARITALARI.kktc;
|
||||
return {
|
||||
ulke: "kktc",
|
||||
ulkeAd: harita.ad,
|
||||
iso: ULKE_ISO.kktc,
|
||||
harita,
|
||||
sehir: null,
|
||||
};
|
||||
}
|
||||
@@ -259,16 +259,23 @@ export function getAllUniversiteler(): UniOzet[] {
|
||||
const map = uniMapGetir();
|
||||
const rows = getDb()
|
||||
.prepare(
|
||||
`SELECT universite, MAX(il) AS il, MAX(unitur) AS unitur,
|
||||
COUNT(*) AS adet
|
||||
`SELECT universite, MAX(unitur) AS unitur, COUNT(*) AS adet
|
||||
FROM programs GROUP BY universite`,
|
||||
)
|
||||
.all() as {
|
||||
universite: string;
|
||||
il: string | null;
|
||||
unitur: string | null;
|
||||
adet: number;
|
||||
}[];
|
||||
// il: MAX(il) alfabetik en büyüğü seçip yanıltıyordu (ör. Ankara Sosyal
|
||||
// Bilimler'in 12 KKTC satırı 47 Ankara satırını eziyordu); üniversitenin
|
||||
// en çok programının bulunduğu il esas alınır.
|
||||
const ilRows = getDb()
|
||||
.prepare(
|
||||
`SELECT universite, il, COUNT(*) AS adet FROM programs
|
||||
WHERE il IS NOT NULL GROUP BY universite, il`,
|
||||
)
|
||||
.all() as { universite: string; il: string; adet: number }[];
|
||||
// Fakülte sayısı: aynı üniversitenin iki yazımı ("X ÜNİV." / "X ÜNİV. (İL)")
|
||||
// birleştiği için GROUP BY universite üzerinden saymak çift sayardı;
|
||||
// (slug, fakulte) çifti üzerinden kesin sayılır.
|
||||
@@ -296,9 +303,30 @@ export function getAllUniversiteler(): UniOzet[] {
|
||||
if (!slug) continue;
|
||||
const u = bySlug.get(slug)!;
|
||||
u.programSayisi += row.adet;
|
||||
if (!u.il && row.il) u.il = row.il;
|
||||
if (!u.unitur && row.unitur) u.unitur = row.unitur;
|
||||
}
|
||||
const ilAdetleri = new Map<string, Map<string, number>>();
|
||||
for (const row of ilRows) {
|
||||
const slug = slugByHam.get(row.universite);
|
||||
if (!slug) continue;
|
||||
let sayac = ilAdetleri.get(slug);
|
||||
if (!sayac) {
|
||||
sayac = new Map();
|
||||
ilAdetleri.set(slug, sayac);
|
||||
}
|
||||
sayac.set(row.il, (sayac.get(row.il) ?? 0) + row.adet);
|
||||
}
|
||||
for (const [slug, sayac] of ilAdetleri) {
|
||||
let enIyi: string | null = null;
|
||||
let enCok = 0;
|
||||
for (const [il, adet] of sayac) {
|
||||
if (adet > enCok) {
|
||||
enIyi = il;
|
||||
enCok = adet;
|
||||
}
|
||||
}
|
||||
bySlug.get(slug)!.il = enIyi;
|
||||
}
|
||||
const fakulteSetleri = new Map<string, Set<string>>();
|
||||
for (const row of fakulteRows) {
|
||||
const slug = slugByHam.get(row.universite);
|
||||
|
||||
Reference in New Issue
Block a user