Basit Anlatım (Herkes İçin)
Şu anda ne sorun var?
- Ana şube "Kaç şarkıda bir anons çalsın?" ayarını değiştiriyor (örn: 10 → 15 şarkı)
- Şubeler ve ana şube player'ları eski ayarı kullanmaya devam ediyor
- Değişiklik için sayfa yenileme (F5) gerekiyor
- 10 şube var? 10 yerde F5 basmak gerekiyor!
Ne yapacağız?
- Ana şube ayarı değiştirdiğinde → Tüm şubeler otomatik algılayacak
- Sayfa yenileme yok! Arka planda sessizce güncellenir
- Hem "Çalma Aralığı" hem "Anons Aktif/Pasif" durumu dinamik
- 30 saniyede bir kontrol eder (hafif, server'ı yormaz)
Örnek Senaryo:
Ana şube "10 şarkıda bir" ayarını "15 şarkıda bir" yapar. 30 saniye içinde tüm şubeler yeni ayarı alır. Kimsenin sayfa yenilemesine gerek kalmaz!
Teknik Detaylar (Geliştiriciler İçin)
Mevcut Sistem (Sorunlu)
Player Init (spot-player.js:50-68)
async function init() {
loadCounter(); // localStorage'dan sayaç yükle
await fetchSettings(); // API'den ayarları ÇEK (1 kez!)
}
async function fetchSettings() {
const data = await fetch('/api/spot/settings').json();
state.songsBetween = data.songs_between || 10; // ← Bir kez ayarlanıyor!
// ❌ SORUN: Ayarlar değişse bile player tekrar kontrol etmiyor
}
Sorun: Player init sırasında ayarları 1 kez alıyor, bir daha kontrol etmiyor!
Yeni Sistem (Çözüm)
1. Database: Settings Version Ekle
Dosya: Modules/Muzibu/database/migrations/tenant/YYYY_MM_DD_add_spot_settings_version.php
Schema::table('muzibu_corporate_accounts', function (Blueprint $table) {
$table->unsignedInteger('spot_settings_version')->default(1)
->after('spot_is_paused')
->comment('Ayarlar her değiştiğinde artırılır');
});
2. Controller: Version'ı Artır
Dosya: Modules/Muzibu/app/Http/Controllers/Front/CorporateFrontController.php:1726
public function updateSpotSettings(Request $request)
{
// ... (mevcut kod)
if ($request->has('spot_songs_between') || $request->has('spot_enabled')) {
// ✅ YENİ: Ayarlar değişti, versiyonu artır!
$data['spot_settings_version'] = DB::raw('spot_settings_version + 1');
}
$account->update($data);
return response()->json([
'success' => true,
'settings' => [
'spot_enabled' => $account->spot_enabled,
'spot_songs_between' => $account->spot_songs_between,
'spot_settings_version' => $account->spot_settings_version // ✅ Dön!
]
]);
}
3. API: Version Bilgisini Ekle
Dosya: Modules/Muzibu/app/Http/Controllers/Api/SpotController.php
public function settings(Request $request)
{
// ... (mevcut kod)
return response()->json([
'enabled' => $effectiveEnabled,
'songs_between' => $parentAccount->spot_songs_between ?? 10,
'corporate_id' => $parentAccount->id,
'branch_id' => $account->id,
'spot_is_paused' => $account->spot_is_paused,
'spot_settings_version' => $parentAccount->spot_settings_version ?? 1, // ✅ YENİ!
]);
}
4. JavaScript: Periyodik Kontrol
Dosya: public/themes/muzibu/js/player/features/spot-player.js:20-40
const state = {
enabled: false,
songsBetween: 10,
songsPlayed: 0,
currentVersion: 1, // ✅ YENİ: Mevcut versiyon
checkInterval: null, // ✅ YENİ: Interval ID
};
async function init() {
await fetchSettings();
// ✅ YENİ: Her 30 saniyede bir ayarları kontrol et
state.checkInterval = setInterval(checkSettingsUpdate, 30000);
}
// ✅ YENİ: Ayarlar değişmiş mi kontrol et
async function checkSettingsUpdate() {
try {
const response = await fetch('/api/spot/settings');
const data = await response.json();
// Version farklıysa güncelle!
if (data.spot_settings_version !== state.currentVersion) {
console.log('🎙️ SpotPlayer: Settings updated! Refreshing...');
state.songsBetween = data.songs_between || 10;
state.enabled = data.enabled;
state.isPaused = data.spot_is_paused;
state.currentVersion = data.spot_settings_version;
// Sayacı sıfırla (yeni aralık için)
resetCounter();
// ✅ UI'ı güncelle (Alpine.js event)
window.dispatchEvent(new CustomEvent('spot-settings-updated', {
detail: { songsBetween: state.songsBetween, enabled: state.enabled }
}));
}
} catch (e) {
console.error('🎙️ SpotPlayer: Failed to check settings', e);
}
}
5. Alpine.js: UI Senkronizasyonu
Dosya: Player footer'daki anons toggle component
<div x-data="{
spotEnabled: true,
init() {
// ✅ YENİ: Spot settings update event'ini dinle
window.addEventListener('spot-settings-updated', (e) => {
this.spotEnabled = e.detail.enabled && !window.MuzibuSpotPlayer.isPaused();
console.log('🎨 UI: Spot settings updated!', e.detail);
});
// Başlangıç senkronizasyonu
const syncState = () => {
if (window.MuzibuSpotPlayer) {
this.spotEnabled = !window.MuzibuSpotPlayer.isPaused();
}
};
setTimeout(syncState, 500);
},
toggle() { /* ... mevcut kod ... */ }
}">
<!-- Anons toggle UI -->
</div>
Çözüm Seçenekleri
| Çözüm | Avantajlar | Dezavantajlar | Öneri |
|---|---|---|---|
|
Seçildi Settings Version + Polling |
• Basit implementasyon • Ek teknoloji yok • Hafif (30s polling) • Laravel cache entegre |
• Gerçek zamanlı değil (30s gecikme) • Minimal API yükü |
|
| WebSocket/Pusher |
• Anında güncelleme • Gerçek zamanlı • Polling yok |
• Pusher ücreti • Server konfigürasyonu • Karmaşık implementasyon |
|
| Redis Pub/Sub |
• Hafif • Laravel entegre |
• Yine polling gerekir • Settings version'dan farkı yok |
Uygulama Adımları
Migration Oluştur ve Çalıştır
Database'e spot_settings_version field ekle
php artisan make:migration add_spot_settings_version_to_corporate_accounts --path=Modules/Muzibu/database/migrations/tenant
php artisan tenants:migrate
Controller'ı Güncelle
CorporateFrontController::updateSpotSettings() - Version artırma ekle
API'ye Version Ekle
SpotController::settings() - Version bilgisini response'a ekle
JavaScript Polling Ekle
spot-player.js - checkSettingsUpdate() fonksiyonu ve interval
Alpine Component Güncelle
Anons toggle component - Event listener ekle
Test Et
Ana şubede ayarı değiştir, 30 saniye bekle, şube player'ını kontrol et
Önemli Notlar
-
30 Saniye Gecikme:
Bu normal ve kabul edilebilir. Anons sistemi için gerçek zamanlı olması kritik değil.
-
localStorage Temizleme:
Version değişince localStorage'daki sayaç sıfırlanır (yeni aralık için).
-
Server Yükü:
30 saniyede 1 API çağrısı = saatte 120 istek = hafif (cache'lenebilir).
-
Tüm Ayarlar Kapsanıyor:
Hem "Çalma Aralığı" hem "Anons Aktif/Pasif" durumu dinamik çalışacak.