From 9861a74e1e12a1e89d2c6f1cfe2eb0d0cb1674df Mon Sep 17 00:00:00 2001 From: Housemann <40449280+Housemann@users.noreply.github.com> Date: Sat, 13 Jun 2026 18:22:41 +0200 Subject: [PATCH] Fix admin AI nav bug, add rescan feature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix Blade parse error in admin AI settings (Blade was interpreting JSON braces in DEFAULT_PROMPT as template tags, breaking the navbar) — pass defaultPrompt from controller instead - Add rescan: POST /nail-polishes/{id}/rescan creates a new import for an existing nail polish and updates its fields after AI analysis - Add KI-Rescan button on collection cards (only if image exists) Co-Authored-By: Claude Sonnet 4.6 --- .../Controllers/Admin/AiSettingController.php | 5 ++- .../NailPolishImportController.php | 19 +++++++++- app/Jobs/ProcessNailPolishImage.php | 38 ++++++++++++------- resources/views/admin/ai/show.blade.php | 3 +- .../views/user-nail-polishes/index.blade.php | 10 ++++- routes/web.php | 1 + 6 files changed, 57 insertions(+), 19 deletions(-) diff --git a/app/Http/Controllers/Admin/AiSettingController.php b/app/Http/Controllers/Admin/AiSettingController.php index 561a905..322eb35 100644 --- a/app/Http/Controllers/Admin/AiSettingController.php +++ b/app/Http/Controllers/Admin/AiSettingController.php @@ -10,8 +10,9 @@ class AiSettingController extends Controller { public function show() { - $ai = AiSetting::get(); - return view('admin.ai.show', compact('ai')); + $ai = AiSetting::get(); + $defaultPrompt = AiSetting::DEFAULT_PROMPT; + return view('admin.ai.show', compact('ai', 'defaultPrompt')); } public function update(Request $request) diff --git a/app/Http/Controllers/NailPolishImportController.php b/app/Http/Controllers/NailPolishImportController.php index de2b4c1..fce76d5 100644 --- a/app/Http/Controllers/NailPolishImportController.php +++ b/app/Http/Controllers/NailPolishImportController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers; use App\Jobs\ProcessNailPolishImage; +use App\Models\NailPolish; use App\Models\NailPolishImport; use Illuminate\Http\Request; use Illuminate\Support\Facades\Storage; @@ -63,9 +64,25 @@ class NailPolishImportController extends Controller public function show(NailPolishImport $nailPolishImport) { - // Nur eigene Imports ansehen abort_if($nailPolishImport->user_id !== auth()->id(), 403); return view('nail-polish-imports.show', ['import' => $nailPolishImport->load('nailPolish.manufacturer')]); } + + public function rescan(NailPolish $nailPolish) + { + abort_unless($nailPolish->image_path, 404); + + $import = NailPolishImport::create([ + 'user_id' => auth()->id(), + 'image_path' => $nailPolish->image_path, + 'status' => 'pending', + 'nail_polish_id' => $nailPolish->id, + ]); + + ProcessNailPolishImage::dispatch($import->id); + + return redirect()->route('nail-polish-imports.show', $import) + ->with('success', 'KI-Analyse gestartet. Die Daten werden aktualisiert.'); + } } diff --git a/app/Jobs/ProcessNailPolishImage.php b/app/Jobs/ProcessNailPolishImage.php index 864e724..d6935b9 100644 --- a/app/Jobs/ProcessNailPolishImage.php +++ b/app/Jobs/ProcessNailPolishImage.php @@ -61,22 +61,32 @@ class ProcessNailPolishImage implements ShouldQueue ); } - // Nagellack-Nummer eindeutig machen falls nötig - $number = $data['number'] ?? ('import-' . $this->importId); - if (NailPolish::where('number', $number)->exists()) { - $number .= '-' . $this->importId; + // Rescan: bestehenden Lack updaten + if ($import->nail_polish_id) { + $nailPolish = NailPolish::findOrFail($import->nail_polish_id); + $nailPolish->update([ + 'name' => $data['name'] ?? $nailPolish->name, + 'number' => $data['number'] ?? $nailPolish->number, + 'manufacturer_id' => $manufacturer?->id ?? $nailPolish->manufacturer_id, + ]); + } else { + // Neuen Lack anlegen + $number = $data['number'] ?? ('import-' . $this->importId); + if (NailPolish::where('number', $number)->exists()) { + $number .= '-' . $this->importId; + } + + $nailPolish = NailPolish::create([ + 'name' => $data['name'] ?? 'Unbekannt', + 'number' => $number, + 'manufacturer_id' => $manufacturer?->id, + 'image_path' => $import->image_path, + ]); + + // Zur Sammlung des Users hinzufügen + $import->user->nailPolishes()->syncWithoutDetaching([$nailPolish->id]); } - $nailPolish = NailPolish::create([ - 'name' => $data['name'] ?? 'Unbekannt', - 'number' => $number, - 'manufacturer_id' => $manufacturer?->id, - 'image_path' => $import->image_path, - ]); - - // Zur Sammlung des Users hinzufügen - $import->user->nailPolishes()->syncWithoutDetaching([$nailPolish->id]); - $import->update([ 'status' => 'done', 'result' => $data, diff --git a/resources/views/admin/ai/show.blade.php b/resources/views/admin/ai/show.blade.php index 718d78a..5dfd58a 100644 --- a/resources/views/admin/ai/show.blade.php +++ b/resources/views/admin/ai/show.blade.php @@ -93,8 +93,9 @@ @section('scripts') @endsection diff --git a/resources/views/user-nail-polishes/index.blade.php b/resources/views/user-nail-polishes/index.blade.php index 56fd70a..882f0d8 100755 --- a/resources/views/user-nail-polishes/index.blade.php +++ b/resources/views/user-nail-polishes/index.blade.php @@ -65,7 +65,15 @@ {{ $nailPolish->manufacturer->name }} @endif -
+
+ @if($nailPolish->image_path) +
+ @csrf + +
+ @endif
@csrf diff --git a/routes/web.php b/routes/web.php index e52e1d0..48ab7e2 100755 --- a/routes/web.php +++ b/routes/web.php @@ -69,6 +69,7 @@ Route::middleware(['auth'])->group(function () { // KI Foto-Import (für alle eingeloggten User) Route::resource('nail-polish-imports', NailPolishImportController::class) ->only(['index', 'create', 'store', 'show']); + Route::post('/nail-polishes/{nailPolish}/rescan', [NailPolishImportController::class, 'rescan'])->name('nail-polishes.rescan'); }); // Fallback