<?php
namespace App\Observers;
use App\Facades\Dispatcher;
use App\Jobs\GenerateAlbumThumbnailJob;
use App\Models\Album;
use Illuminate\Support\Facades\File;
class AlbumObserver
{
public function saved(Album $album): void
{
if ($album->cover && !File::exists(image_storage_path($album->thumbnail))) {
Dispatcher::dispatch(new GenerateAlbumThumbnailJob($album));
}
}
public function updating(Album $album): void
{
if (!$album->isDirty('cover')) {
return;
}
$oldCover = $album->getRawOriginal('cover');
// If the cover is being updated, delete the old cover and thumbnail files
rescue_if(
$oldCover,
static function () use ($oldCover): void {
$oldCoverPath = image_storage_path($oldCover);
$parts = pathinfo($oldCoverPath);
$oldThumbnail = sprintf('%s_thumb.%s', $parts['filename'], $parts['extension']);
File::delete([$oldCoverPath, image_storage_path($oldThumbnail)]);
},
);
}
public function updated(Album $album): void
{
$changes = $album->getChanges();
if (array_key_exists('name', $changes)) {
// Keep the artist name in sync across songs and albums, but only if it actually changed.
$album->songs()->update(['album_name' => $changes['name']]);
}
}
public function deleted(Album $album): void
{
$coverPath = image_storage_path($album->cover);
$thumbnailPath = image_storage_path($album->thumbnail);
rescue_if($coverPath || $thumbnailPath, static fn () => File::delete([$coverPath, $thumbnailPath]));
}
}