Proje: OkulUp · Hub: OkulUp — Architecture

API Client Architecture

Temel Yapı

Tek bir Axios instance: src/services/api/client.ts

baseURL: EXPO_PUBLIC_API_URL + '/api'
timeout: 30000
headers: { 'Content-Type': 'application/json', Accept: 'application/json' }

Token Yönetimi

setAuthToken(token) — Axios default header’ına Bearer token ekler/siler.

Çağrılan yerler:

  • login() → başarılı login’de
  • logout() → logout’ta null ile
  • authSlice.hydrate() → uygulama başlangıcında AsyncStorage’dan restore
  • onRehydrateStorage callback → Zustand persist rehydrate’de

Request Interceptor

Header’da Authorization yoksa store’dan token alarak ekler. (Circular dep için lazy require kullanıyor.)

Response Interceptor

401: Auth endpoint değilse otomatik logout + router.replace('/(auth)/login')

403: skipForbiddenToast: true config’i yoksa toast ile hata mesajı gösterir

Tüm hatalar: classifyError() ile typed error’a çevrilir + Sentry breadcrumb

Error Sınıfları (src/services/api/errors.ts)

SınıfHTTPMesaj
NetworkErrorİnternet bağlantınızı kontrol edin
TimeoutErrorECONNABORTEDİstek zaman aşımına uğradı
UnauthorizedError401Oturum süresi doldu
ForbiddenError403Bu işlem için yetkiniz bulunmuyor
NotFoundError404İçerik bulunamadı
ValidationError422field errors map içeriyor
ServerError5xxSunucu hatası

API Response Tipleri

ApiResponse<T>      // { data: T; message?: string }
PaginatedResponse<T> // { data: T[]; links; meta: { current_page, last_page, total, per_page } }

Servis fonksiyonlarında:

  • Listreturn response.data (PaginatedResponse döner)
  • Detail/Create/Updatereturn response.data.data (unwrap)
  • Deletevoid
  • Upload → Content-Type: multipart/form-data, createFormData() utility

Servis Dosyaları

Her resource için ayrı dosya: src/services/api/{resource}.ts

Mevcut servisler: auth, socialAuth, users, announcements, messages, notifications, events, galleries, attendances, payments, tracking, classes, appointments, media, preferences, app-config, mobile-config, dashboard, academic, assignments, reports, dailyOverview, notes, document-requests, enrollment, meal-menus

Tümü src/services/api/index.ts’ten barrel export ediliyor.