Files
SpiceManagementSystem/app/Console/Commands/ShopifyImages.php
T
2026-09-11 15:09:47 +02:00

77 lines
2.4 KiB
PHP

<?php
namespace App\Console\Commands;
use App\Models\Product;
use App\Services\ShopifyService;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
class ShopifyImages extends Command
{
protected $signature = 'shopify:images {--force : Bilder auch für Produkte neu laden die schon welche haben}';
protected $description = 'Lädt Produktbilder von Shopify herunter und speichert sie lokal';
public function handle(ShopifyService $shopify): int
{
$variants = $shopify->getAllVariants();
if (empty($variants)) {
$this->error('Keine Daten von Shopify erhalten (Details im Log).');
return self::FAILURE;
}
// Deduplizieren: pro Produkttitel nur einmal
$products = collect($variants)
->filter(fn($v) => ! empty($v['image_urls']))
->keyBy('product_title');
$this->info("Produkte mit Bildern in Shopify: {$products->count()}");
$downloaded = 0;
$skipped = 0;
foreach ($products as $title => $variant) {
$product = Product::where('title', $title)->first();
if (! $product) {
continue;
}
if (! empty($product->images) && ! $this->option('force')) {
$skipped++;
continue;
}
$paths = [];
foreach ($variant['image_urls'] as $url) {
$response = Http::get($url);
if ($response->failed()) {
$this->warn(" Bild konnte nicht geladen werden: {$url}");
continue;
}
$ext = pathinfo(parse_url($url, PHP_URL_PATH), PATHINFO_EXTENSION) ?: 'jpg';
$filename = 'product-images/' . Str::uuid() . '.' . $ext;
Storage::disk('public')->put($filename, $response->body());
$paths[] = $filename;
}
if (! empty($paths)) {
$product->update(['images' => $paths]);
$this->line(" ✓ {$title} (" . count($paths) . " Bild(er))");
$downloaded++;
}
}
$this->info("✓ {$downloaded} Produkte mit Bildern versorgt");
if ($skipped) {
$this->line(" {$skipped} übersprungen (haben bereits Bilder — nutze --force zum Überschreiben)");
}
return self::SUCCESS;
}
}