Durum: Tenant 1 = Central sistem, yani migration duplicate değil!
Migration Stratejisi:
✓ Central DB (Tenant 1): HLS fields eklenecek
✓ Tenant DB (Tenant 1001): HLS fields eklenecek
İki ayrı tenant, iki ayrı DB → Duplicate SORUN DEĞİL!
Sonuç: V1 rapordaki "Duplicate Migration" sorunu GEÇERSİZ!
Durum: Eski DB'den 30k şarkı gelecek (şu anda MP3)
Migration Planı:
1. Eski şarkılar → file_path (MP3) ile gelecek
2. ConvertToHLSJob → Tüm şarkıları HLS'e çevirecek
3. Gelecekte → MP3 kalmayacak (sadece HLS)
✓ Fallback sistem zaten var!
Sonuç: Thumbmaker + Spatie karışımı NORMAL - eski DB uyumluluğu için!
Mevcut Durum:
DeviceService → tenant()->id != 1001 kontrolü
❌ Hardcoded tenant ID (kötü!)
Sorun: Yeni tenant eklenince kod değişecek
Çözüm:
MuzibuDeviceService (Tenant-Aware)
✓ setting('muzibu_device_limit_enabled')
✓ Otomatik aktif tenant kontrolü
Generic DeviceService korunur, Muzibu'ya özel servis ayrı!
SORUN:
DeviceController'da tenant()->id != 1001 hardcoded kontrolü var. Tenant 1002, 1003 eklenince bu kod BOZULACAK!
Sorunlu Kod (DeviceController.php:22):
if (!tenant() || tenant()->id != 1001) {
return response()->json(['limit_exceeded' => false]);
}
ÇÖZÜM: Tenant-Aware Service Pattern
Yeni Servis: MuzibuDeviceService
Modules/Muzibu/app/Services/MuzibuDeviceService.phpshouldRun() override: setting('muzibu_device_limit_enabled')Örnek Kod (MuzibuDeviceService.php):
class MuzibuDeviceService extends DeviceService
{
protected function shouldRun(): bool
{
if (!tenant()) return false;
// Setting kontrolü (tenant-aware)
return (bool) setting('muzibu_device_limit_enabled', false);
}
}
Beklenen Sonuç: Ölçeklenebilir mimari, yeni tenant'larda sorun çıkmaz
SORUN:
player-core.js içinde deviceLimit: 1 hardcoded. Premium user 5 cihaz kullanabilse bile frontend 1 gösterecek!
Sorunlu Kod (player-core.js:40):
deviceLimit: 1, // Kullanıcı cihaz limiti
Backend'de gerçek limit:
DeviceService::getDeviceLimit() → 3-tier hierarchy
ÇÖZÜM:
window.muzibuPlayerConfig.deviceLimit = {{ $user->getDeviceLimit() }}deviceLimit: config.deviceLimit || 1Beklenen Sonuç: Doğru limit gösterimi, premium user deneyimi düzelir
SORUN:
Sector modeli HasTranslations kullanıyor ama TranslatableEntity interface implement etmiyor. Song, Album, Artist'te var!
ÇÖZÜM:
use App\Contracts\TranslatableEntity; import ekleimplements HasMedia, TranslatableEntity ekleSORUN:
toSearchableArray() metodunda $this->release_date kullanılıyor ama DB'de field yok!
ÇÖZÜM (ÖNERİLEN):
add_release_date_to_muzibu_albums$table->date('release_date')->nullable();SORUN:
Guest ve non-premium user için aynı preview logic 2 kez tekrarlanıyor (satır 52-96, 100-149)
ÇÖZÜM:
getPreviewStreamResponse($song, $message)SORUN:
100+ satır state tek objede (auth, device, phone, player hepsi karışık)
ÇÖZÜM:
muzibuDeviceLimit() featureNasıl Çalışıyor?
1. Song::needsHlsConversion() kontrolü
return $this->file_path && !$this->hls_path;
2. Stream sırasında otomatik dispatch
ConvertToHLSJob::dispatch($song);
3. Conversion sırasında MP3 fallback
status: 'converting' → MP3 serve et
4. Conversion tamamlandı → HLS serve
status: 'ready' → HLS playlist
30K Şarkı İçin Strateji
Seçenek A: Lazy Conversion (Mevcut)
• İlk dinlendiğinde HLS'e çevir
• Conversion sırasında MP3 fallback
✓ Sistem zaten hazır!
Seçenek B: Bulk Conversion
• Import sonrası toplu conversion
• ProcessBulkSongHLSJob kullan
⚠️ Sunucu yükü yüksek olabilir
Seçenek C: Hybrid (ÖNERİLEN)
• Popüler şarkılar → Bulk conversion
• Az dinlenenler → Lazy conversion
✓ Balanced yük + hızlı kullanıcı deneyimi
Öneri:
Mevcut sistem zaten MP3 fallback destekliyor. 30k eski şarkı geldiğinde:
file_path (MP3) ile gelsinSonuç: Ek kod yazmaya gerek YOK! Sistem hazır!
1. Generic DeviceService (Tüm Tenant'lar)
📁 Konum: app/Services/DeviceService.php
🎯 Amaç: Generic device management (her tenant kullanabilir)
🔧 Özellik: Setting kontrolü ile aktif/pasif
shouldRun() → setting('auth_device_limit_enabled')
2. MuzibuDeviceService (Sadece Muzibu)
📁 Konum: Modules/Muzibu/app/Services/MuzibuDeviceService.php
🎯 Amaç: Muzibu'ya özel device logic (session polling, modal vb.)
🔧 Özellik: Generic DeviceService'i extend eder
shouldRun() → setting('muzibu_device_limit_enabled')
✓ Hardcoded tenant ID YOK!
✓ Setting ile kontrol
✓ Ölçeklenebilir
3. Controller Kullanımı
📁 DeviceController (Tenant 1001 için):
use Modules\Muzibu\App\Services\MuzibuDeviceService;
public function __construct(MuzibuDeviceService $deviceService)
📁 Diğer Tenant'lar:
use App\Services\DeviceService;
public function __construct(DeviceService $deviceService)
Örnek: MuzibuDeviceService.php
<?php
namespace Modules\Muzibu\App\Services;
use App\Services\DeviceService;
class MuzibuDeviceService extends DeviceService
{
/**
* Muzibu tenant için device limit aktif mi?
* Setting ile kontrol (hardcode YOK!)
*/
protected function shouldRun(): bool
{
if (!tenant()) {
return false;
}
// Muzibu-specific setting kontrolü
return (bool) setting('muzibu_device_limit_enabled', false);
}
/**
* Muzibu'ya özel ek metodlar buraya
* Örnek: Session polling interval, modal timeout vb.
*/
public function getPollingInterval(): int
{
return (int) setting('muzibu_session_polling_interval', 30);
}
}
⏱️ Süre: 30 dakika • 🎯 Etki: Ölçeklenebilir mimari
⏱️ Süre: 1-2 saat • 🎯 Etki: Tutarlılık, doğru veri
⏱️ Süre: 2 saat • 🎯 Etki: Kod kalitesi
⏱️ Süre: N/A • 🎯 Etki: Sistem çalışıyor