Admin Paneli Geliştirme - Analiz Raporu
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.
Şarkı dosyaları kopyalanmayacak (sunucuda yer kaplamaz). Sadece playlist içindeki şarkı listesi (referanslar) kopyalanacak. Yani iki playlist de aynı şarkı dosyalarını kullanır.
Modules/Muzibu/App/Services/PlaylistService.php
duplicatePlaylist(int $playlistId): MuzibuOperationResult
Modules/Muzibu/App/Http/Livewire/Admin/PlaylistComponent.php
duplicatePlaylist(int $id): void
Modules/Muzibu/resources/views/admin/livewire/playlist-component.blade.php
| 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) |
muzibu_playlist_song tablosuna yeni referanslar eklenir.
title (JSON, "Kopya - " ekli)slug (JSON, çakışma önleme)description (JSON)media_id (cover image)is_systemis_publicis_radiois_active (true)position ile)is_featured (false olacak)user_id (null olacak)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');
}
}
<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>
/admin/muzibu/playlist sayfasında playlist listesini görür