Proje: Okul B2B App · Hub: Okul B2B App — Domain

Galeri Yönetimi Domain’i

Okulların fotoğraf, kapak görseli, logo ve YouTube videosu yönetimi.

Medya Türleri

Türrole_idAçıklama
Kapak FotoğrafıMEDIA_ROLES.COVEROkulun ana görseli, 1 adet
Galeri FotoğrafıMEDIA_ROLES.GALLERYOkul galeri görselleri, çok sayıda
LogoAyrı endpointOkul logosu
YouTube VideoAyrı yapıTanıtım videoları

URL Dönüşümü (CDN Resize)

Medya URL’leri yüklenirken CDN resize path’i eklenir:

/schools/{id}/filename.jpg
→ /schools/{id}/1080x0/filename.jpg   (galeri fotoğrafları)
→ /schools/{id}/logo/filename.jpg     (logo)

Video thumbnail’ları CDN resize desteklemediği için hariç tutulur (/video/ path içeriyorsa dönüşüm yapılmaz).

Sıralama (react-native-sortables)

Galeri sıralaması react-native-sortables kütüphanesi ile yapılır. Kritik kural:

<Sortable.Grid customHandle={true}>      // customHandle ZORUNLU
  <Sortable.Handle mode="fixed">         // Sabit elemanlar (ekle butonu vb.)
    <AddPhotoCard />
  </Sortable.Handle>
  <Sortable.Handle mode="draggable">     // Sürüklenebilir fotoğraflar
    <PhotoCard />
  </Sortable.Handle>
</Sortable.Grid>

customHandle={false} kullanılırsa sıralama çalışmaz.

API Endpointleri

GET  /schools/{schoolId}/media          → galeri fotoğrafları (sayfalı)
GET  /schools/{schoolId}/media/cover    → kapak fotoğrafı
POST /media/upload                      → fotoğraf yükle (FormData)
DELETE /media/{mediaId}                 → fotoğraf sil
PUT /media/sort                         → sıra güncelle [{id, sort}]

GalleryServiceMediaServiceApiClient katmanlı yapısı var.

Yükleme Akışı

  1. expo-image-picker ile fotoğraf seçilir
  2. ImageCompressor ile kalite/boyut optimize edilir
  3. FormData olarak MediaService.uploadMedia() ile POST edilir
  4. Başarılı yükleme sonrası galeri listesi refresh edilir

Sayfalama

GalleryService.getPhotos(schoolId, page, limit) kullanılır. Scroll pagination ile yeni fotoğraflar yüklenir. Status filtresi kaldırıldı (ad84be7 commit’i) — tüm durumları göster.