Planlama 6 Ocak 2026

Genre-Playlist Sistem Değişikliği

Müzik türleri (genres) sayfalarında playlist gösterimi ve Sector pattern'ine geçiş planlaması

Basit Anlatım (Herkes İçin)

Şu anki durum: Kullanıcı bir müzik türüne (mesela "Rock") tıkladığında, o türdeki tüm şarkılar liste halinde gösteriliyor. Ancak bu çok uzun ve karışık bir liste oluyor.

Yeni sistem: Artık müzik türlerine playlist atayabiliyoruz. Kullanıcı bir türe tıkladığında, o türle ilgili hazırlanmış playlistleri görecek. Bu, sektörler sayfasındaki sisteme benziyor (mesela "Alışveriş Merkezi" sektörüne tıklayınca içindeki playlistler gösteriliyor).

Playlist'e tıklayınca ne olacak? Bilgisayarda preview modda (ön izleme) açılacak. Kullanıcı playlist detaylarını görecek, şarkıları görecek ve hemen çalmaya başlayabilecek.

Özetle: "Rock müziği dinlemek istiyorum" diyen kullanıcı → Rock türüne tıklıyor → "Rock Klasikleri", "Modern Rock", "Türkçe Rock" gibi hazır playlistleri görüyor → Beğendiğine tıklıyor → Hemen dinlemeye başlıyor.

Demo/Test için: Sistemde henüz genre-playlist atamaları olmadığı için, rastgele playlistleri türlere atayacağız. Böylece sistem çalışır hale gelecek ve test edilebilecek.

Teknik Detaylar (Geliştiriciler İçin)

Mevcut Sistem Analizi

Database İlişkisi: Playlist model'inde zaten genres() ilişkisi mevcut (playlistables tablosu üzerinden polymorphic many-to-many)

Tablo: muzibu_playlistables (playlistable_type = 'genre', playlistable_id = genre_id)

Controller: GenreController::show() şu anda songs gösteriyor

View: genres/show.blade.php şu anda song-simple-row component'lerini listeliyor

Hedef Sistem (Sector Pattern)

Referans: SectorController::show() ve sectors/show.blade.php pattern'i kullanılacak

Genre Model: HasPlaylistDistribution trait eklenecek (Sector gibi)

Controller: $genre->playlists() ilişkisi ile playlist'ler çekilecek (aktif + şarkılı olanlar)

View: playlist-card component'leri grid layout ile gösterilecek (:preview="true" prop'u ile)

Etkilenecek Dosyalar

  • Modules/Muzibu/app/Models/Genre.php (HasPlaylistDistribution trait ekle)
  • Modules/Muzibu/app/Http/Controllers/Front/GenreController.php (show metodu - playlists çekimi)
  • resources/views/themes/muzibu/genres/show.blade.php (playlist grid layout)
  • resources/views/themes/muzibu/partials/genre-detail.blade.php (API için partial - güncelleme gerekebilir)

Kullanılacak Component

<x-muzibu.playlist-card :playlist="$playlist" :preview="true" />

:preview="true" prop'u sayesinde playlist'e tıklayınca PC'de preview modda açılır (mobilde normal açılır)

Yapılacaklar (Adım Adım)

1

Genre Model'e Trait Ekle

Genre.php dosyasına HasPlaylistDistribution trait'ini ekle (Sector model gibi)

use Modules\Muzibu\App\Traits\HasPlaylistDistribution;

use HasPlaylistDistribution;

Trait eklendikten sonra $genre->playlists() ilişkisi otomatik kullanılabilir hale gelir

2

GenreController::show() Güncelle

SectorController::show() pattern'ini uygula:

  • • $songs yerine $playlists çek
  • • Aktif + şarkılı playlist'leri filtrele (whereHas('songs'))
  • • songs_count ve total_duration ekle (withCount, withSum)
  • • created_at desc sıralama (en yeni playlistler önce)
  • • apiShow() metodunu da güncelle (genre-detail partial için)
3

Genre Show View Güncelle

sectors/show.blade.php pattern'ini uygula:

  • • Songs list kaldır → Playlist grid ekle
  • • Grid layout: grid-cols-2 sm:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-5
  • • Component: <x-muzibu.playlist-card :playlist="$playlist" :preview="true" />
  • • Playlist sayısı göster (header'da)
  • • Radios bölümü eklenebilir (eğer genre-radio ilişkisi varsa - opsiyonel)
4

Genre Detail Partial Güncelle

API için genre-detail.blade.php partial'ını güncelle (SPA uyumluluğu için)

  • • Aynı değişiklikleri partial'a da uygula
  • • Songs yerine Playlists göster
  • • Preview mode aktif olmalı
5

Demo İçin Rastgele Playlist Atamaları

Test ve demo için rastgele playlistleri genre'lere ata:

  • • Aktif genre'leri çek (10-15 tane)
  • • Aktif playlistleri çek (50-100 tane)
  • • Her genre'ye 3-7 arası rastgele playlist ata
  • • Database: muzibu_playlistables tablosuna INSERT (playlistable_type = 'genre')
  • • Position değerleri: 0, 1, 2, 3... (sıralama için)

// Örnek SQL

INSERT INTO muzibu_playlistables

(playlist_id, playlistable_type, playlistable_id, position)

VALUES (123, 'genre', 5, 0)

6

Test ve Cache Temizliği

Tüm değişiklikler sonrası test ve cache temizliği:

  • • php artisan view:clear
  • • php artisan responsecache:clear
  • • Browser'da genre detay sayfasını test et
  • • Playlist'e tıklayıp preview modun çalıştığını kontrol et
  • • Mobil responsive test
  • • API endpoint'lerini test et (SPA için)

Riskler ve Dikkat Edilecekler

Cache Problemi

View ve response cache'i mutlaka temizlenmeli, aksi halde eski songs listesi gösterilmeye devam eder

Preview Mode

:preview="true" prop'u sadece PC'de preview açar, mobilde normal açılır (playlist-card component'inin mantığı)

Polymorphic Type

playlistable_type değeri 'genre' olmalı (küçük harf, tekil), 'Genre' veya 'genres' değil!

Aktif + Şarkılı Playlist Filtresi

whereHas('songs') ile mutlaka filtrelenmeli, aksi halde boş playlistler gösterilir (kötü UX)

Rastgele Atama Tekrarı

Demo playlist atamaları yaparken UNIQUE constraint var, duplicate INSERT hatası alabilirsiniz (INSERT IGNORE kullanın)

Beklenen Sonuç

Genre Sayfası: Kullanıcı bir türe (örn: "Rock") tıkladığında, şarkılar yerine o türe ait playlistler grid layout ile gösterilir

Preview Mode: PC'de playlist'e tıklayınca preview modda (overlay) açılır, mobilde normal sayfa olarak açılır

Tutarlı UX: Genre sayfası, Sector sayfası ile aynı görünüm ve davranışa sahip olur (tek fark: radios bölümü olmayabilir)

Demo Hazır: Rastgele playlist atamaları sayesinde sistem test edilebilir ve kullanıcıya gösterilebilir hale gelir

API Uyumluluğu: SPA sistemi için apiShow() endpoint'i de güncellenir, genre-detail partial'ı playlist'leri gösterir