Sistem Mimarisi Analizi

Muzibu Playlist Sistemi

Mevcut Durum, Sorunlar ve Cozum Onerisi

30 Aralik 2025

KRITIK: Sistem Parcali Durumda!

Su anda IKI FARKLI SISTEM ayni anda calisiyor. Yeni playlistables tablosu olusturuldu ve veri tasindi, ancak modeller ve admin paneli hala ESKi pivot tabloLarini kullaniyor.

Eski Sistem (AKTIF)

  • muzibu_playlist_sector (71 kayit)
  • muzibu_playlist_radio (90 kayit)
  • • Admin panelden yapilan islemler BURAYA yaziliyor

Yeni Sistem (PASIF)

  • muzibu_playlistables (161 kayit)
  • • Polymorphic yapi hazir
  • • Modeller KULLANMIYOR!

🎵 Playlist Turleri

Tur Sahiplik Dagitim Gizlilik Kullanim
Sistem Playlist user_id = NULL
is_system = 1
✓ playlistables ile
Sector, Radio, Corporate
✓ Public Admin olusturur
Herkes gorur
Kisisel Playlist
(My Playlists)
user_id = X
is_system = 0
✗ Dagitilmaz
Sadece sahibine ait
✓ Ayarlanabilir
is_public
Kullanici olusturur
Kendi listesi
Kurumsal Playlist user_id = NULL
is_system = 1
✓ playlistables ile
Corporate'a ozel
✗ Private
Sadece o firma
Admin olusturur
Firma gorur

👤 Kisisel Playlist'ler: user_id mi, playlistable mi?

✓ ONERI: user_id Kullan

Kisisel playlist'ler icin user_id kullanmak DOGRU yaklasim. playlistable sistemi DAGITIM icindir, sahiplik icin degil.

✓ user_id Avantajlari

  • Basit sorgu: Playlist::where('user_id', $userId)
  • Performans: Tek tablo, direkt index
  • Semantik: Playlist'in SAHIBI belli
  • Standart: Tum platformlar boyle yapar

✗ playlistable Dezavantajlari

  • Gereksiz complexity: Polymorphic join
  • Yanlis anlam: User'a playlist DAGITMIYORSUN
  • Performans: Extra tablo + join
  • Karisiklik: Sistem/kisisel ayirt etmek zor

💡 Kisisel Playlist Yapisi

// Kisisel playlist olusturma
$playlist = Playlist::create([
    'user_id' => auth()->id(),  // ← SAHIPLIK
    'title' => ['tr' => 'Benim Listem'],
    'is_system' => false,
    'is_public' => false,       // ← Gizli
]);

// Kullanicinin playlist'lerini cekme
$myPlaylists = Playlist::where('user_id', auth()->id())->get();

// Public kisisel playlist'ler (baskalarinin gorebilecegi)
$publicPlaylists = Playlist::where('is_public', true)
    ->whereNotNull('user_id')
    ->get();

🗃 Veritabani Mimarisi


┌─────────────────────────────────────────────────────────────────────────────────┐
│                           MUZIBU PLAYLISTS                                    │
├─────────────────────────────────────────────────────────────────────────────────┤
│ playlist_id | user_id | title      | is_system | is_public | is_radio    │
├─────────────┬─────────┬────────────┬───────────┬───────────┬────────────┤
│      1      │  NULL   │ Pop Hits   │     1     │     1     │      0      │  ← Sistem
│      2      │  NULL   │ Chill Mix  │     1     │     1     │      0      │  ← Sistem
│      3      │   5    │ Gym Music  │     0     │     0     │      0      │  ← Kisisel (User 5)
│      4      │   5    │ Road Trip  │     0     │     1     │      0      │  ← Kisisel (Public)
│      5      │   8    │ Study      │     0     │     0     │      0      │  ← Kisisel (User 8)
└─────────────┴─────────┴────────────┴───────────┴───────────┴────────────┘
                                │
              ┌─────────────────┼─────────────────┐
              │                                   │
              ▼                                   ▼
┌───────────────────────────────┐   ┌───────────────────────────────┐
│   PLAYLISTABLES (DAGITIM)      │   │   PLAYLIST_SONG (SARKILAR)    │
├───────────────────────────────┤   ├───────────────────────────────┤
│ playlist_id │ type     │ id   │   │ playlist_id │ song_id │ pos │
├─────────────┼──────────┼──────┤   ├─────────────┼─────────┼─────┤
│      1      │ sector   │  2   │   │      1      │   101   │  1  │
│      1      │ sector   │  5   │   │      1      │   102   │  2  │
│      1      │ radio    │  3   │   │      1      │   103   │  3  │
│      2      │ corporate│  1   │   │      3      │   201   │  1  │
└─────────────┴──────────┴──────┘   └─────────────┴─────────┴─────┘

Sistem playlist (1,2) → playlistables ile DAGITILIR
Kisisel playlist (3,4,5) → user_id ile SAHIPLIK belirlenir
                

Admin Panel Durumu

⚠ Admin Paneli GUNCELLENMEDI!

Modeller hala eski pivot tablolarini kullaniyor. Admin'den yapilan islemler playlistables'a YAZILMIYOR.

Dosya Mevcut Durum Kullanilan Tablo Aksiyon
Sector.php ✗ Eski sistem muzibu_playlist_sector HasPlaylistDistribution trait ekle
Radio.php ✗ Eski sistem muzibu_playlist_radio HasPlaylistDistribution trait ekle
MuzibuCorporateAccount.php ? Kontrol gerekli ? HasPlaylistDistribution trait ekle
SectorManageComponent.php ✓ Calisiyor Model'e bagli Model guncellenince otomatik calisir
RadioManageComponent.php ✓ Calisiyor Model'e bagli Model guncellenince otomatik calisir

🔮 Gelecek Entity'ler (playlistable)

💜

Mood (Ruh Hali)

Mutlu, Huzunlu, Enerjik, Romantik vb. Playlist'ler mood'a gore kategorize edilir.

'mood' => Mood::class
🎶

Genre (Tur)

Pop, Rock, Jazz, Elektronik vb. Genre sayfalarina ozel playlist onerileri.

'genre' => Genre::class

Time Slot (Zaman)

Sabah, Ogle, Aksam, Gece. Saate gore otomatik playlist onerileri.

'time_slot' => TimeSlot::class
🎄

Event (Etkinlik)

Yilbasi, Sevgililer Gunu, Bayram vb. Ozel gunlere playlist dagitimi.

'event' => Event::class
🏃

Activity (Aktivite)

Spor, Calisma, Meditasyon, Yolculuk. Aktiviteye uygun playlist'ler.

'activity' => Activity::class
🏢

Venue (Mekan)

Ozel mekanlar, zincirlere ozel playlist dagitimi. (Kurumsal++)

'venue' => Venue::class

🛠 Gec Adimlari

1

Sector Model'i Guncelle

Eski playlists() metodunu kaldir, HasPlaylistDistribution trait ekle.

// Sector.php
use HasPlaylistDistribution;

// Eski metodu SIL:
// public function playlists() { ... }
2

Radio Model'i Guncelle

Ayni islem Radio icin de yapilmali.

// Radio.php
use HasPlaylistDistribution;

// Eski metodu SIL:
// public function playlists() { ... }
3

Corporate Model'i Kontrol Et

MuzibuCorporateAccount modelinde HasPlaylistDistribution trait varmi kontrol et.

4

Test Et

Admin panelden Sector/Radio duzenle, playlist ekle/cikar, kayitlarin playlistables tablosuna gitmesini dogrula.

5

Eski Tablolari Kaldir (Opsiyonel)

Her sey calistiginda eski pivot tablolarini silebilirsin:

DROP TABLE muzibu_playlist_sector;
DROP TABLE muzibu_playlist_radio;