Playlist Kopyalama Özelliği

Admin Paneli Geliştirme - Analiz Raporu

Playlist Yönetimi Hazır Çözüm Hızlı İşlem
Değiştirilecek Dosya
3 Dosya
Service, Component, Blade
Tahmini Süre
~15 dakika
Test dahil
Risk Seviyesi
Düşük
Mevcut kod etkilenmez

Basit Anlatım (Herkes İçin)

Ne İsteniyor?

Admin panelindeki playlist listesine bir "Kopyala" butonu eklenecek. Bu butona tıklandığında, seçili playlist'in tüm şarkılarıyla birlikte bir kopyası oluşturulacak. Kopya playlist'in adı "Kopya - [Orijinal Ad]" şeklinde olacak.

Nasıl Çalışacak?

1
Buton Görünecek: Her playlist satırında, "Düzenle" butonunun yanında "Kopyala" ikonu çıkacak
2
Kopyalama Başlar: Butona tıklandığında sistem arka planda playlist'i kopyalar
3
Yeni Playlist Oluşur: "Kopya - Rock Classics" gibi yeni bir playlist oluşur
4
Şarkılar Kopyalanır: Orijinal playlist'teki tüm şarkılar aynı sırayla yeni playlist'e eklenir
5
Bildirim Gösterilir: "Playlist başarıyla kopyalandı!" mesajı ekranda belirir

Neden Önemli?

  • Zaman Kazandırır: Benzer playlist oluşturmak için sıfırdan başlamaya gerek kalmaz
  • Hata Riskini Azaltır: Var olan playlist'i baz alarak çalışıldığı için sıfır hata
  • Esneklik Sağlar: Kopyayı özelleştirerek farklı versiyonlar oluşturulabilir

Önemli Not

Şarkı dosyaları kopyalanmayacak (sunucuda yer kaplamaz). Sadece playlist içindeki şarkı listesi (referanslar) kopyalanacak. Yani iki playlist de aynı şarkı dosyalarını kullanır.

Teknik Detaylar (Geliştiriciler İçin)

Değiştirilecek Dosyalar

1. PlaylistService.php Yeni Metod
Modules/Muzibu/App/Services/PlaylistService.php
Eklenecek: duplicatePlaylist(int $playlistId): MuzibuOperationResult
2. PlaylistComponent.php Livewire
Modules/Muzibu/App/Http/Livewire/Admin/PlaylistComponent.php
Eklenecek: duplicatePlaylist(int $id): void
3. playlist-component.blade.php UI
Modules/Muzibu/resources/views/admin/livewire/playlist-component.blade.php
Eklenecek: Kopyala butonu (Düzenle linkinin yanında)

Veritabanı Yapısı

Tablo Açıklama İşlem
muzibu_playlists Playlist ana tablosu INSERT (yeni kayıt)
muzibu_playlist_song Playlist-Şarkı ilişki tablosu (pivot) INSERT (şarkı referansları)
muzibu_songs Şarkı tablosu OKUNACAK (değişmez)
Not: Şarkı dosyaları kopyalanmaz, sadece muzibu_playlist_song tablosuna yeni referanslar eklenir.

Kopyalanan ve Kopyalanmayan Alanlar

Kopyalanacak

  • title (JSON, "Kopya - " ekli)
  • slug (JSON, çakışma önleme)
  • description (JSON)
  • media_id (cover image)
  • is_system
  • is_public
  • is_radio
  • is_active (true)
  • Şarkılar (position ile)

Kopyalanmayacak

  • is_featured (false olacak)
  • user_id (null olacak)
  • Favoriler (favorites)
  • Yorumlar (reviews)
  • Dağıtımlar (sectors/radios/genres)
  • SEO ayarları
  • Dinlenme sayıları

Kod Örneği (PlaylistService.php)

public function duplicatePlaylist(int $playlistId): MuzibuOperationResult
{
    try {
        // 1. Orijinal playlist'i bul
        $sourcePlaylist = Playlist::with('songs')->find($playlistId);

        if (!$sourcePlaylist) {
            return new MuzibuOperationResult(false, 'Playlist bulunamadı', 'error');
        }

        DB::beginTransaction();

        // 2. Çok dilli başlık oluştur
        $newTitle = [];
        $titleData = json_decode($sourcePlaylist->getRawOriginal('title'), true);
        foreach ($titleData as $locale => $value) {
            $newTitle[$locale] = "Kopya - " . $value;
        }

        // 3. Yeni playlist oluştur
        $newPlaylist = new Playlist();
        $newPlaylist->title = json_encode($newTitle, JSON_UNESCAPED_UNICODE);
        $newPlaylist->slug = $sourcePlaylist->slug; // Auto-generated unique
        $newPlaylist->description = $sourcePlaylist->description;
        $newPlaylist->media_id = $sourcePlaylist->media_id;
        $newPlaylist->is_system = $sourcePlaylist->is_system;
        $newPlaylist->is_public = $sourcePlaylist->is_public;
        $newPlaylist->is_radio = $sourcePlaylist->is_radio;
        $newPlaylist->is_featured = false;
        $newPlaylist->is_active = true;
        $newPlaylist->save();

        // 4. Şarkıları kopyala (cache-aware)
        foreach ($sourcePlaylist->songs as $song) {
            $newPlaylist->attachSongWithCache($song, [
                'position' => $song->pivot->position,
            ]);
        }

        DB::commit();

        return new MuzibuOperationResult(
            true,
            'Playlist başarıyla kopyalandı',
            'success',
            $newPlaylist
        );
    } catch (\Exception $e) {
        DB::rollBack();
        Log::error('Playlist kopyalama hatası', ['error' => $e->getMessage()]);
        return new MuzibuOperationResult(false, 'Kopyalama başarısız', 'error');
    }
}

UI Değişikliği (Blade Template)

<td class="text-center align-middle">
    <div class="d-flex align-items-center gap-3 justify-content-center">
        <!-- Düzenle Butonu -->
        <a href="{{ route('admin.muzibu.playlist.manage', $playlist->playlist_id) }}"
           data-bs-toggle="tooltip" title="Düzenle">
            <i class="fa-solid fa-pen-to-square link-secondary fa-lg"></i>
        </a>

        <!-- Kopyala Butonu (YENİ) -->
        <a href="javascript:void(0);"
           wire:click="duplicatePlaylist({{ $playlist->playlist_id }})"
           data-bs-toggle="tooltip" title="Playlist'i Kopyala"
           style="min-height: 24px; display: inline-flex; align-items: center;">
            <i class="fas fa-copy link-secondary fa-lg"></i>
        </a>

        <!-- Şarkı Yönetimi Butonu -->
        <a href="{{ route('admin.muzibu.playlist.songs', $playlist->playlist_id) }}"
           data-bs-toggle="tooltip" title="Şarkı Yönetimi">
            <i class="fas fa-music link-secondary fa-lg"></i>
        </a>

        <!-- ... Dropdown menü ... -->
    </div>
</td>

Güvenlik ve Performans

Güvenlik

  • Permission kontrolü (muzibu.create)
  • Database transaction (rollback garantisi)
  • Playlist ID validasyonu
  • SQL Injection koruması (Eloquent)

Performans

  • Eager loading (with('songs'))
  • Cache-aware metod kullanımı
  • Dosya kopyalama yok (hızlı)
  • Batch insert (toplu ekleme)

Kullanıcı Akışı

1
Admin Listede
Kullanıcı /admin/muzibu/playlist sayfasında playlist listesini görür
2
Kopyala Butonuna Tıklar
"Rock Classics" playlist'inin yanındaki ikonuna tıklar
3
Livewire İşlem
Sayfa yenilenmeden, arka planda kopyalama işlemi gerçekleşir (loading göstergesi)
4
Başarılı Toast
Ekranda "Playlist başarıyla kopyalandı!" bildirim mesajı görünür
5
Liste Güncellenir
Yeni "Kopya - Rock Classics" playlist listede görünür, tüm şarkılar kopyalanmış halde

Test Planı

✓ Temel Fonksiyon Testi
  • → Boş playlist kopyalama
  • → 1 şarkılı playlist kopyalama
  • → 100+ şarkılı playlist kopyalama
  • → Çok dilli başlık kontrolü
✓ Veri Bütünlüğü Testi
  • → Şarkı sıralaması korunuyor mu?
  • → Cover image kopyalanıyor mu?
  • → Cache count'lar doğru mu?
  • → is_featured = false mi?
✓ Hata Yönetimi Testi
  • → Olmayan playlist ID kopyalama
  • → Permission yetkisi olmadan kopyalama
  • → Database hatası durumu (rollback)

Sonraki Adımlar

Adım 1
Service Metodu
PlaylistService.php'ye duplicatePlaylist() metodu ekle
Adım 2
Livewire Metodu
PlaylistComponent.php'ye duplicatePlaylist() metodu ekle
Adım 3
UI Güncellemesi
Blade template'e Kopyala butonunu ekle
23 Şubat 2026 • Muzibu.com