option('execute'); $inactive = [PressReleaseStatus::Rejected->value, PressReleaseStatus::Archived->value, PressReleaseStatus::Draft->value]; $query = PressReleaseImage::query() ->whereNotNull('press_release_images.legacy_id') ->whereNull('press_release_images.rules_version') ->whereHas('pressRelease', fn ($q) => $q->withoutGlobalScope(PortalScope::class)->whereIn('press_releases.status', $inactive)); $byStatus = (clone $query) ->join('press_releases', 'press_releases.id', '=', 'press_release_images.press_release_id') ->selectRaw('press_releases.status as status, count(*) as c') ->groupBy('press_releases.status') ->pluck('c', 'status') ->all(); $total = array_sum($byStatus); $this->info(($execute ? 'Lösche' : 'Trockenlauf:').' Legacy-Bilder an inaktiven Meldungen: '.$total); foreach ($byStatus as $status => $count) { $this->line(sprintf(' %-10s %d', $status, $count)); } if (! $execute || $total === 0) { return self::SUCCESS; } $deleted = 0; $bytes = 0; $query->with('pressRelease')->chunkById((int) $this->option('chunk'), function ($images) use (&$deleted, &$bytes): void { foreach ($images as $image) { $bytes += $this->sizeOf($image); $this->imageService->deletePressReleaseImage($image->disk, $image->path, $image->variants); $image->forceDelete(); $deleted++; } }); $this->info(sprintf('Gelöscht: %d Bilder, etwa %s MB freigegeben.', $deleted, number_format($bytes / 1048576, 1, ',', '.'))); return self::SUCCESS; } private function sizeOf(PressReleaseImage $image): int { $disk = Storage::disk($image->disk); $size = 0; foreach (array_filter([$image->path, ...array_values($image->variants ?? [])]) as $path) { if (is_string($path) && $disk->exists($path)) { $size += (int) $disk->size($path); } } return $size; } }