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-manipulator ile 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.