Bu belge, kullanıcı profillerinin nasıl yapılandırıldığını, gizlilik ayarlarını ve avatar yönetimini açıklar.
Profil sistemi üç ana model üzerine kuruludur:
Sisteme giriş yapan her kullanıcının temel kaydıdır.
id: Benzersiz tanımlayıcı.username: URL'lerde kullanılan benzersiz kullanıcı adı.image: Avatar dosyasının yolu (GCS key veya dış URL).role:ADMIN,TEACHER,STUDENT.
Kullanıcının gizlilik tercihlerini tutar. User ile 1-1 ilişkilidir.
profileVisibility:"public"(herkes görebilir) veya"private"(sadece izinliler).showAvatar: Avatarın halka açık olup olmadığını belirler.showEmail,showPhone: İletişim bilgilerinin görünürlüğü.
Kullanıcının rolüne özel akademik verileri tutar.
TeacherProfile: Branş, biyografi, dersler.StudentProfile: Okul numarası, veli bilgileri, sınıf seviyesi.
Avatar sistemi, gizlilik odaklı ve performanslı olacak şekilde tasarlanmıştır.
Avatarlar doğrudan GCS linki olarak verilmez. Bunun yerine bir proxy API kullanılır:
/api/avatar/[userId]?v=[version]
Bu yaklaşım şunları sağlar:
- Gizlilik Kontrolü: Sunucu tarafında
UserSettingskontrol edilerek, gizli profillerin avatarlarının yetkisiz kişilerce görülmesi engellenir. - Cache Yönetimi:
vparametresi (avatarVersion) sayesinde tarayıcı önbelleği yönetilir.
lib/utils.ts içindeki bu fonksiyon, doğru URL'i üretir:
export function getAvatarUrl(image: string | null | undefined, userId: string, version?: number) {
if (!image) return "/api/avatars/default"; // Varsayılan avatar
if (image.startsWith("http")) return image; // Google/External avatar
return `/api/avatar/${userId}${version ? `?v=${version}` : ""}`; // Dahili avatar
}Bu endpoint (app/api/avatar/[userId]/route.ts), avatar isteğini karşılar.
İşleyiş:
userIdile kullanıcı vesettingsverisi çekilir.- İstek yapan kullanıcının oturumu (
auth()) kontrol edilir. - Erişim Kontrolü:
- Kullanıcı kendi avatarını her zaman görür.
showAvatar: falseise başkası göremez.profileVisibility: "private"ise başkası göremez.
- Erişim izni varsa:
- Resim GCS'den stream edilir (
getObjectStream). - Uygun
Content-Typeheader'ı eklenir.
- Resim GCS'den stream edilir (
- Erişim izni yoksa:
403 Forbiddenveya varsayılan "gizli profil" görseli döndürülür.
Profil sayfasında veya listelerde kullanıcı bilgileri gösterilirken UserSettings tablosu dikkate alınır.
Örnek (Backend/Component seviyesinde):
// Profil görünürlük kontrolü
const canViewProfile =
user.id === sessionUser.id || // Kendisi
user.settings.profileVisibility === "public"; // Herkese açık
if (!canViewProfile) {
return <PrivateProfileView />;
}