Improve image import logging and move HTTP downloads out of DB transaction
Deploy / deploy (push) Successful in 16s

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Malek TellissiandClaude Sonnet 4.6 committed 2026-09-12 04:16:12 +02:00
1 parent 02c17d6984
commit 822790bfc0
3 files changed
+63 -10

No files matched your search

+33 -6
View File
@@ -24,19 +24,29 @@ class ShopifyImages extends Command
}
// Deduplizieren: pro Produkttitel nur einmal
$products = collect($variants)
$shopifyProducts = collect($variants)
->filter(fn($v) => ! empty($v['image_urls']))
->keyBy('product_title');
$this->info("Produkte mit Bildern in Shopify: {$products->count()}");
$totalInShopify = collect($variants)->pluck('product_title')->unique()->count();
$this->info("Shopify-Produkte gesamt: {$totalInShopify}");
$this->info("Davon mit Bild-URLs: {$shopifyProducts->count()}");
if ($shopifyProducts->isEmpty()) {
$this->warn('Kein Shopify-Produkt hat Bild-URLs — Import nicht möglich.');
return self::SUCCESS;
}
$downloaded = 0;
$skipped = 0;
$notFound = 0;
foreach ($products as $title => $variant) {
foreach ($shopifyProducts as $title => $variant) {
$product = Product::where('title', $title)->first();
if (! $product) {
$this->warn(" Nicht lokal gefunden: \"{$title}\"");
$notFound++;
continue;
}
@@ -47,15 +57,27 @@ class ShopifyImages extends Command
$paths = [];
foreach ($variant['image_urls'] as $url) {
$response = Http::get($url);
try {
$response = Http::timeout(30)->get($url);
} catch (\Exception $e) {
$this->warn(" Verbindungsfehler für {$url}: {$e->getMessage()}");
continue;
}
if ($response->failed()) {
$this->warn(" Bild konnte nicht geladen werden: {$url}");
$this->warn(" HTTP {$response->status()} für: {$url}");
continue;
}
$body = $response->body();
if (empty($body)) {
$this->warn(" Leere Antwort für: {$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());
Storage::disk('public')->put($filename, $body);
$paths[] = $filename;
}
@@ -63,6 +85,8 @@ class ShopifyImages extends Command
$product->update(['images' => $paths]);
$this->line(" ✓ {$title} (" . count($paths) . " Bild(er))");
$downloaded++;
} else {
$this->warn(" Keine Bilder gespeichert für: \"{$title}\"");
}
}
@@ -70,6 +94,9 @@ class ShopifyImages extends Command
if ($skipped) {
$this->line(" {$skipped} übersprungen (haben bereits Bilder — nutze --force zum Überschreiben)");
}
if ($notFound) {
$this->warn(" {$notFound} Shopify-Produkte lokal nicht gefunden (Titelabweichung?)");
}
return self::SUCCESS;
}