<?php
namespace App\Services;
use App\Models\PlaylistFolder;
use App\Models\User;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\DB;
class PlaylistFolderService
{
public function createFolder(User $user, string $name): PlaylistFolder
{
return $user->playlistFolders()->create(['name' => $name]);
}
public function renameFolder(PlaylistFolder $folder, string $name): PlaylistFolder
{
$folder->update(['name' => $name]);
return $folder;
}
public function addPlaylistsToFolder(PlaylistFolder $folder, array $playlistIds): void
{
DB::transaction(
static function () use ($folder, $playlistIds): void {
// A playlist can only be in one folder by the user at a time
collect($playlistIds)->each(
static function (string $playlistId) use ($folder): void {
PlaylistFolder::query()
->where('user_id', $folder->user_id)
->whereHas('playlists', static fn (Builder $query) => $query->where('id', $playlistId))
->get()
->each(static fn (PlaylistFolder $folder) => $folder->playlists()->detach($playlistId));
}
);
$folder->playlists()->attach($playlistIds);
}
);
}
public function movePlaylistsToRootLevel(PlaylistFolder $folder, array $playlistIds): void
{
$folder->playlists()->detach($playlistIds);
}
}