deleteFiles($event->media()->get()); } /** * Delete the files of every media row belonging to a user, plus the * user's settings background. */ public function purgeUserMedia(User $user): void { $this->deleteFiles(EventMedia::query()->where('user_id', $user->id)->get()); $this->delete('local', ["settings-media/{$user->id}/background.jpg"]); } /** * Delete the files of a single media row. */ public function purgeMedia(EventMedia $media): void { $this->deleteFiles([$media]); } /** * @param iterable $mediaItems */ private function deleteFiles(iterable $mediaItems): void { $pathsByDisk = []; foreach ($mediaItems as $media) { $disk = $media->disk ?: 'local'; foreach ([$media->path, $media->preview_path, $media->thumbnail_path] as $path) { if (is_string($path) && $path !== '') { $pathsByDisk[$disk][] = $path; } } } foreach ($pathsByDisk as $disk => $paths) { $this->delete($disk, $paths); } } /** * @param array $paths */ private function delete(string $disk, array $paths): void { if ($paths === []) { return; } try { Storage::disk($disk)->delete($paths); } catch (\Throwable $e) { // A failed file delete must not abort the surrounding deletion — // an orphaned file is recoverable, a half-deleted account is not. Log::warning('Media cleanup failed', [ 'disk' => $disk, 'paths' => $paths, 'exception' => $e->getMessage(), ]); } } }