Proje: Okul B2B App · Hub: Okul B2B App — Domain
Medya Yükleme Akışı
MediaService.ts üzerinden gerçekleşen tüm medya yükleme işlemleri.
Upload Akışı
Kullanıcı fotoğraf seçer (expo-image-picker / react-native-image-crop-picker)
↓
ImageCompressor.needsCompression(uri)
→ 10MB üzerinde: AES sıkıştırma + Toast "Görsel Hazırlanıyor"
→ 10MB altında: doğrudan devam
↓
FormData oluştur:
- media: file object (uri, type, name)
- row_id: schoolId
- role_id: GALLERY veya COVER
- name, sort, status
↓
ApiClient.uploadFile('/customer/media', formData)
↓
Başarılı → GalleryService.getPhotos() ile galeri yenilenir
Platform Farkı: Android vs iOS
Android’de FormData file object farklı yapı gerektirir:
// Android
{ uri, type, name, 'Content-Type': mimeType }
// iOS
{ uri, type, name }API Endpoint’leri (MediaService)
POST /customer/media → yükleme (FormData)
GET /customer/media/{id} → tekil medya
DELETE /customer/media/{id} → silme
PUT /customer/media/sort → sıralama güncelleme [{id, sort}]
POST /customer/media/temp → geçici yükleme
POST /customer/media/move → geçici'den kalıcıya taşıma
Media Roles (MEDIA_ROLES)
MEDIA_ROLES.GALLERY→ galeri fotoğrafıMEDIA_ROLES.COVER→ kapak fotoğrafı- Logo için ayrı endpoint kullanılır
Sıkıştırma
utils/ImageCompressor.ts:
- 10MB sınırı
expo-image-manipulatorile sıkıştırma- Başarılı compress’ten sonra boyut bilgisi Toast ile gösterilir
CDN Resize URL Dönüşümü
Yükleme sonrası API’den dönen full_url:
/schools/{id}/image.jpg → /schools/{id}/1080x0/image.jpg (1080px genişlik)
/schools/{id}/logo/image.jpg (logo için değişmez)
Video path’leri (/video/) CDN resize’dan hariç tutulur.
Related
- galeri-yonetimi — galeri domain context’i
- firma-okul-hiyerarsisi — schoolId context’i