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ür | role_id | Açıklama |
|---|---|---|
| Kapak Fotoğrafı | MEDIA_ROLES.COVER | Okulun ana görseli, 1 adet |
| Galeri Fotoğrafı | MEDIA_ROLES.GALLERY | Okul galeri görselleri, çok sayıda |
| Logo | Ayrı endpoint | Okul logosu |
| YouTube Video | Ayrı 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}]
GalleryService → MediaService → ApiClient katmanlı yapısı var.
Yükleme Akışı
expo-image-pickerile fotoğraf seçilirImageCompressorile kalite/boyut optimize edilir- FormData olarak
MediaService.uploadMedia()ile POST edilir - 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.
Related
- firma-okul-hiyerarsisi — okul context’i
- medya-yukleme-akisi — detaylı yükleme akışı