📋 Planlama

Sidebar: Popüler Playlistler & Radyolar

11 Ocak 2026 - Muzibu Anasayfa Sidebar Güncellemesi

📝 Basit Anlatım (Herkes İçin)

Anasayfa sağ tarafındaki "Yeni Şarkılar" ve "Popüler Şarkılar" bölümlerini "Popüler Playlistler" ve "Popüler Radyolar" olarak değiştireceğiz.

  • ✅ Admin'den öne çıkan olarak işaretlenen playlist'ler gösterilecek
  • ✅ Admin'den öne çıkan olarak işaretlenen radyolar gösterilecek
  • ✅ Her yenilemede farklı 20 item gösterilecek (random shuffle)
  • ✅ Performanslı olacak (cache + random selection)

💡 Neden Önemli?

Kullanıcılar her anasayfaya geldiklerinde farklı içerikler görecek. Bu da keşif deneyimini artırır ve kullanıcı etkileşimini yükseltir. Admin panelden öne çıkan içerikleri kontrol edebilirsiniz.

📊 Mevcut Durum

📍 Konum

sidebar-right.blade.php (720-755. satırlar)

📋 İçerik

2 Tab: "Yeni Şarkılar" ve "Popüler Şarkılar"

🎵 Veri

$newSongs ve $popularSongs değişkenleri

🔢 Miktar

Her tab'da 15 şarkı gösteriliyor

🎯 İstenen Değişiklikler

1️⃣ Tab Başlıkları

❌ Eski

• Yeni Şarkılar

• Popüler Şarkılar

✅ Yeni

• Popüler Playlistler

• Popüler Radyolar

2️⃣ Veri Kaynağı

is_featured = 1 olan playlist ve radyolar

3️⃣ Miktar

Her tab'da 20 item (15'ten 20'ye çıkacak)

4️⃣ Sıralama

Her yenilemede random shuffle (farklı 20 item)

Performans Seçenekleri (Karşılaştırma)

Seçenek 1: Database RAND() (En Basit)

❌ Önerilmez
Playlist::featured()->active()->inRandomOrder()->limit(20)->get()

✅ Avantajlar:

  • • Kod çok basit (1 satır)
  • • Her yüklemede gerçek random

❌ Dezavantajlar:

  • • ORDER BY RAND() çok yavaş
  • • Her request'te 2 DB sorgusu
  • • Büyük tablolarda performans sorunu
  • • Cache yapılamaz (her seferinde farklı)

Performans: 100+ featured item varsa her request 50-200ms ekstra süre

Seçenek 2: Simple Cache (Orta)

⚠️ Orta
Cache::remember('featured_playlists', 3600, function() {
  return Playlist::featured()->active()->get();
})->shuffle()->take(20);

✅ Avantajlar:

  • • Hızlı (cache'den okur)
  • • Shuffle ile random
  • • Kod basit

❌ Dezavantajlar:

  • • Tüm featured'ları cache'e alır (gereksiz)
  • • 500+ item varsa memory kullanımı artar
  • • Shuffle her seferinde PHP'de yapılır

Performans: İlk request ~50ms, sonraki requestler ~5ms

Seçenek 3: ID Pool Cache (İyi)

👍 İyi
// Cache: Sadece ID'leri sakla (hafif)
$ids = Cache::remember('featured_playlist_ids', 3600, function() {
  return Playlist::featured()->active()->pluck('playlist_id')->toArray();
});

// Random 20 ID seç
$randomIds = collect($ids)->shuffle()->take(20);

// DB'den sadece seçilen 20'yi getir
Playlist::whereIn('playlist_id', $randomIds)->get();

✅ Avantajlar:

  • • Cache hafif (sadece ID'ler)
  • • DB'den sadece 20 item çekilir
  • • Her yüklemede farklı random
  • • Memory verimli

❌ Dezavantajlar:

  • • 2 adımlı işlem (ID cache + whereIn)
  • • Kod biraz daha uzun

Performans: İlk request ~30ms, sonraki requestler ~10ms

Seçenek 4: Smart Cache Pool (EN İYİ) ⭐

✅ ÖNERİLEN
// Cache: 100 featured item (ID + temel bilgiler)
$pool = Cache::remember('featured_playlists_pool', 3600, function() {
  return Playlist::featured()->active()
    ->with('sectors:sector_id,title') // Eager load
    ->limit(100) // Pool size
    ->get(['playlist_id', 'title', 'slug', 'is_radio']);
});

// Random 20 seç (collection'dan, DB yok)
$randomPlaylists = $pool->shuffle()->take(20);

✅ Avantajlar:

  • EN HIZLI (cache'den direk okur)
  • • Pool size kontrollü (max 100 item)
  • • Eager load ile N+1 yok
  • • Her yüklemede farklı random
  • • Memory optimal (sadece gerekli fieldlar)
  • • DB yükü minimum (1 saat 1 sorgu)

❌ Dezavantajlar:

  • • Kod biraz daha uzun
  • • Cache invalidation gerekli (admin update'te)

🚀 Performans:

  • • İlk request: ~40ms (DB query + cache write)
  • • Sonraki requestler: ~2ms (sadece cache read + shuffle)
  • • 1 saat boyunca DB'ye tekrar gitmez
  • • Admin panel'den update → cache otomatik yenilenir

💡 Neden En İyi: 100 item pool'dan 20 random seçmek, her seferinde DB'den 20 random item çekmekten 20-50x daha hızlı. Cache sayesinde sunucu yükü minimal.

🏗️ Önerilen Mimari (Seçenek 4 Detayı)

📦 Cache Stratejisi

Cache Key'ler:

  • featured_playlists_pool (100 playlist)
  • featured_radios_pool (100 radio)

Cache Süresi:

1 saat (3600 saniye)

Cache Invalidation:

Admin panelden playlist/radio update edilince cache temizlenir

🎨 View Composer

// app/Providers/ViewServiceProvider.php
View::composer('themes.muzibu.components.sidebar-right', function ($view) {
  $featuredPlaylists = app(MuzibuService::class)->getFeaturedPlaylistsForSidebar();
  $featuredRadios = app(MuzibuService::class)->getFeaturedRadiosForSidebar();
  
  $view->with(compact('featuredPlaylists', 'featuredRadios'));
});

⚙️ Service Method

// MuzibuService::getFeaturedPlaylistsForSidebar()
public function getFeaturedPlaylistsForSidebar(int $count = 20): Collection
{
  // Cache pool (100 item)
  $pool = Cache::remember('featured_playlists_pool', 3600, function() {
    return Playlist::featured()->active()
      ->where('is_radio', 0) // Sadece playlist
      ->limit(100)
      ->get(['playlist_id', 'title', 'slug']);
  });

  // Random 20 seç
  return $pool->shuffle()->take($count);
}

🔄 Cache Invalidation (Admin Update)

// PlaylistService::toggleFeatured() veya update()
public function update($id, $data)
{
  // ... update işlemi ...

  // Cache'i temizle
  Cache::forget('featured_playlists_pool');

  return $playlist;
}

📋 Yapılacaklar (Adım Adım)

1

MuzibuService'e Method Ekle

getFeaturedPlaylistsForSidebar() ve getFeaturedRadiosForSidebar()

2

ViewServiceProvider Güncelle

sidebar-right için view composer ekle

3

sidebar-right.blade.php Güncelle

Şarkı tablarını playlist/radio tablarına çevir

4

Component Oluştur (isteğe bağlı)

x-muzibu.playlist-simple-card ve x-muzibu.radio-simple-card

5

Translation Ekle

Popüler Playlistler, Popüler Radyolar metinleri

6

Cache Invalidation Ekle

PlaylistService ve RadioService'e cache temizleme

7

Test

Anasayfayı yenile, farklı içerikler göründüğünü kontrol et

🧪 Test Senaryoları

✅ Test 1: Random Shuffle

Anasayfayı 5 kez yenile → Her seferinde farklı 20 playlist/radio görmeli

✅ Test 2: Featured Toggle

Admin panelden bir playlist'i featured yap → 1 dakika içinde sidebar'da görünmeli

✅ Test 3: Performance

Chrome DevTools → Network → sidebar render süresi < 50ms olmalı

✅ Test 4: Empty State

Hiç featured yoksa → Boş durum mesajı göstermeli

🎯 Sonuç ve Öneriler

✅ Önerilen Çözüm

Seçenek 4: Smart Cache Pool - En hızlı ve en verimli yöntem

📊 Beklenen Performans

  • • İlk yükleme: ~40ms
  • • Cache'li yükleme: ~2ms
  • • DB yükü: 1 saat 1 sorgu
  • • Memory: ~50KB (100 item pool)

🎨 Kullanıcı Deneyimi

  • • Her yenilemede farklı içerik
  • • Keşif deneyimi artışı
  • • Sayfa yükleme hızı korunur
  • • Admin kontrolü kolay