| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- <?php
- declare(strict_types=1);
- namespace App\Console\Commands;
- use App\Models\File;
- use App\Services\FileService;
- use Illuminate\Console\Command;
- use Illuminate\Support\Facades\Storage;
- class EnsurePhotoThumbnails extends Command
- {
- protected $signature = 'photos:ensure-thumbnails
- {--overwrite : Пересоздать существующие миниатюры}
- {--dry-run : Только проверить, без создания миниатюр}';
- protected $description = 'Проверяет наличие миниатюр для загруженных фотографий и создаёт отсутствующие';
- public function handle(FileService $fileService): int
- {
- $dryRun = (bool) $this->option('dry-run');
- $overwrite = (bool) $this->option('overwrite');
- $checked = 0;
- $missing = 0;
- $created = 0;
- $overwriteCandidates = 0;
- $overwritten = 0;
- $skipped = 0;
- $failed = 0;
- $missingSources = 0;
- File::query()
- ->where(function ($query): void {
- $query->where('mime_type', 'like', 'image/%')
- ->orWhere('path', 'like', '%.jpg')
- ->orWhere('path', 'like', '%.jpeg')
- ->orWhere('path', 'like', '%.png')
- ->orWhere('path', 'like', '%.webp');
- })
- ->orderBy('id')
- ->chunkById(100, function ($files) use ($fileService, $dryRun, $overwrite, &$checked, &$missing, &$created, &$overwriteCandidates, &$overwritten, &$skipped, &$failed, &$missingSources): void {
- foreach ($files as $file) {
- if (!$fileService->isImageFile($file) || !$file->path || $fileService->isThumbnailPath($file->path)) {
- $skipped++;
- continue;
- }
- $checked++;
- if (!Storage::disk('public')->exists($file->path)) {
- $skipped++;
- $missingSources++;
- if ($this->getOutput()->isVerbose()) {
- $this->warn("Нет исходного файла: #{$file->id} {$file->path}");
- }
- continue;
- }
- $thumbnailPath = $fileService->thumbnailPath($file->path);
- if (Storage::disk('public')->exists($thumbnailPath)) {
- if (!$overwrite) {
- continue;
- }
- $overwriteCandidates++;
- if ($dryRun) {
- $this->line("Будет перезаписана миниатюра: #{$file->id} {$thumbnailPath}");
- continue;
- }
- if ($fileService->ensureThumbnail($file, true)) {
- $overwritten++;
- $this->line("Перезаписана миниатюра: #{$file->id} {$thumbnailPath}");
- } else {
- $failed++;
- $this->warn("Не удалось перезаписать миниатюру: #{$file->id} {$file->path}");
- }
- continue;
- }
- $missing++;
- if ($dryRun) {
- $this->line("Нет миниатюры: #{$file->id} {$thumbnailPath}");
- continue;
- }
- if ($fileService->ensureThumbnail($file)) {
- $created++;
- $this->line("Создана миниатюра: #{$file->id} {$thumbnailPath}");
- } else {
- $failed++;
- $this->warn("Не удалось создать миниатюру: #{$file->id} {$file->path}");
- }
- }
- });
- $this->info("Проверено фото: {$checked}. Нет миниатюр: {$missing}. Создано: {$created}. К перезаписи: {$overwriteCandidates}. Перезаписано: {$overwritten}. Пропущено: {$skipped}. Нет исходников: {$missingSources}. Ошибок: {$failed}.");
- return $failed > 0 ? self::FAILURE : self::SUCCESS;
- }
- }
|