Dinamik Senkronizasyon 5 Ocak 2026

Spot Ayarları Dinamik Senkronizasyon

Çalma Aralığı ve Aktif/Pasif durumunu tüm cihazlarda otomatik güncelleme

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ı

1

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
2

Controller'ı Güncelle

CorporateFrontController::updateSpotSettings() - Version artırma ekle

3

API'ye Version Ekle

SpotController::settings() - Version bilgisini response'a ekle

4

JavaScript Polling Ekle

spot-player.js - checkSettingsUpdate() fonksiyonu ve interval

5

Alpine Component Güncelle

Anons toggle component - Event listener ekle

6

Test Et

Ana şubede ayarı değiştir, 30 saniye bekle, şube player'ını kontrol et

Önemli Notlar