Users can upload a photo of a nail polish bottle; a background queue job sends it to Ollama (llama3.2-vision at 192.168.30.172:11434), extracts name, number and manufacturer, then creates the nail polish and adds it to the user's collection automatically. - ProcessNailPolishImage job (180s timeout, 2 tries) - NailPolishImport model + migration (status tracking) - AiSetting model + migration (Ollama URL + model, admin-configurable) - NailPolishImportController: upload, status page (auto-refresh every 5s) - Admin\AiSettingController: configure Ollama connection - Views: drag-drop upload form, live status page, import history - Navbar: "Foto importieren" link for all users - Admin dropdown: "KI-Einstellungen" - neonail-worker.conf: Supervisor config for the queue worker Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
62 lines
1.3 KiB
PHP
62 lines
1.3 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Model;
|
|
|
|
class NailPolishImport extends Model
|
|
{
|
|
protected $fillable = [
|
|
'user_id',
|
|
'image_path',
|
|
'status',
|
|
'result',
|
|
'nail_polish_id',
|
|
'error_message',
|
|
];
|
|
|
|
protected function casts(): array
|
|
{
|
|
return [
|
|
'result' => 'array',
|
|
];
|
|
}
|
|
|
|
public function user()
|
|
{
|
|
return $this->belongsTo(User::class);
|
|
}
|
|
|
|
public function nailPolish()
|
|
{
|
|
return $this->belongsTo(NailPolish::class);
|
|
}
|
|
|
|
public function isPending(): bool
|
|
{
|
|
return in_array($this->status, ['pending', 'processing']);
|
|
}
|
|
|
|
public function statusLabel(): string
|
|
{
|
|
return match ($this->status) {
|
|
'pending' => 'Warten',
|
|
'processing' => 'Verarbeitung',
|
|
'done' => 'Fertig',
|
|
'failed' => 'Fehler',
|
|
default => $this->status,
|
|
};
|
|
}
|
|
|
|
public function statusColor(): string
|
|
{
|
|
return match ($this->status) {
|
|
'pending' => 'warning',
|
|
'processing' => 'info',
|
|
'done' => 'success',
|
|
'failed' => 'danger',
|
|
default => 'secondary',
|
|
};
|
|
}
|
|
}
|