Proje: Okul Platform · Hub: Okul Platform — Architecture

Customer.io

Config: config/services.phpcustomerio.*

İki bağımsız servis:

B2CService (app/Integrations/CustomerIO/Services/B2CService.php)

  • Veliler (User) için
  • importUser(User) — Kişiyi CIO’ya gönder
  • batchImportUsers(Collection) — Toplu
  • dispatchDeleteUser(int) — Sil
  • Feature flag: config('services.customerio.b2c_enabled')

B2BService (app/Integrations/CustomerIO/Services/B2BService.php)

  • Okul sahipleri/okullar için
  • importSchool(School, importUsers) — Okulu “object” olarak CIO’ya gönder
  • CIO’da B2B için Person + Object + Relationship yapısı kullanılıyor
  • Feature flag: config('services.customerio.b2b_enabled')

Paket: CustomerIO\ClientCustomerIO/ dizininde custom paket

  • Batch API kullanıyor
  • EU region: track-eu.customer.io / cdp-eu.customer.io

OneSignal (Push Notification)

  • Paket: laravel-notification-channels/onesignal
  • Config: services.onesignal.app_id, rest_api_key
  • Kullanım: User notifiable (hem B2C hem B2B)
  • UserNotificationId modeli — cihaz token’larını tutar

Infobip (SMS)

  • Paket: infobip/infobip-api-php-client
  • Servis: app/Services/Sms/SmsService.php
  • app()->singleton('sms', ...) — AppServiceProvider’da singleton
  • OTP gönderimi bu servis üzerinden

Typesense (Arama)

  • Paket: typesense/typesense-php + laravel/scout
  • School modeli Searchable trait’i ile indexleniyor
  • School::toSearchableArray() — Typesense’e gönderilecek alanları tanımlar
  • Arama endpoint: GET /api/search/schools (optional auth)

Sentry (Error Monitoring)

  • Paket: sentry/sentry-laravel
  • AppServiceProvider → Authenticated event’inde user context set edilir
  • Sentry’ye: id, user_type_id, user_group_type_id, name

Sonitel (Telefon/Call)

  • packages/Sonitel/ — Custom internal paketi
  • B2B’de gelen aramaları yönetir
  • POST /api/admin/call/b2b/forward — Aramayı yönlendir
  • POST /api/admin/call/b2b/hangup — Aramayı kapat
  • InboundNumberPool modeli ile numara havuzu yönetimi
  • SchoolInboundCallLog — Arama logları

Slack Logging

  • Custom SlackLogger (app/Logging/SlackLogger.php)
  • Rate limiting + retry mekanizması var
  • Fallback: lokal dosyaya yazar (Slack down olursa)
  • Belgeleme: readmes/slack-logger.md

AWS S3 (Media)

  • Paket: league/flysystem-aws-s3-v3
  • Medya yükleme: app/Services/Media/MediaService.php