# SuperSeller3000 Admin middleware for managing and selling refurbished IT hardware. Handles article ingestion via AI pipeline (photo → vision → specs → eBay text), multi-channel publishing (eBay), and order processing with Frappe ERP invoicing. **Live:** `https://ss3k.schaunwama.de/admin` **Full design doc:** `docs/superpowers/specs/2026-05-13-superseller3000-design.md` --- ## Quick Start ```bash cp .env .env.local # fill in secrets (DB, Redis, AI keys, eBay, Frappe) docker compose up -d docker compose exec app php bin/console doctrine:migrations:migrate --env=prod docker compose exec app php bin/console app:users:create --env=prod ``` Workers start automatically via Docker Compose (`worker-ai`, `worker-orders`, `worker-channel`). --- ## Tech Stack | Layer | Technology | |---|---| | Language / Framework | PHP 8.4 · Symfony 8.4 | | ORM | Doctrine ORM | | Database | PostgreSQL 17 — schemas: `app`, `logs`, `logs_archive` | | Queue | Symfony Messenger + Redis Streams | | AI | Ollama (local, SSH-tunnel) **or** Mistral Cloud API — alias-switchable in `services.yaml` | | Web Search | Tavily API (`TAVILY_API_KEY`) | | Admin | EasyAdmin 5 | | Auth | Symfony Security + TOTP 2FA (scheb/2fa-totp) | | Proxy | Caddy 2 (Auto-HTTPS) | --- ## Running Tests ```bash # Unit tests (fast, no external deps) docker compose exec app php vendor/bin/phpunit tests/Unit/ --testdox # Integration tests (requires staging credentials in .env.local) bin/test-integration # Single integration file bin/test-integration tests/Integration/path/to/Test.php # Static analysis + code style docker compose exec app composer phpstan docker compose exec app composer cs-check ``` --- ## AI Backend Switch between Ollama and Mistral in `config/services.yaml`: ```yaml # Ollama (default — local via SSH tunnel) App\Infrastructure\AI\OllamaClientInterface: alias: App\Infrastructure\AI\OllamaClient # Mistral Cloud App\Infrastructure\AI\OllamaClientInterface: alias: App\Infrastructure\AI\MistralClient ``` Set models via env vars: `AI_TEXT_MODEL`, `AI_VISION_MODEL`. After switching: `docker compose exec app php bin/console cache:clear`. --- ## Admin Panel Features - **Articles** — list (click row → detail view, Edit as action), ingest form with stock quantity, attribute validation with required-field highlighting - **AI Pipeline** — per-job progress view with step tracking; failed jobs show the real error; re-run AI from article detail - **Article Types** — configurable attribute schemas (name, type, unit, options, required flag); attributes drive specs-research field list - **Users** — permission checkboxes per user (`ARTICLES_MANAGE`, `PIPELINE_RUN`, `ORDERS_MANAGE`, etc.) - **Orders / Customers / Invoices** — full read/manage view - **Prompt Templates** — editable via admin (DB-backed, `{{variable}}` substitution) --- ## Manual Article Ingest Admin → **New Article** (or via API): ```bash curl -X POST https://ss3k.schaunwama.de/api/pipeline/photo-upload \ -H "X-Api-Key: " \ -F "articleTypeId=" \ -F "condition=good" \ -F "stock=1" \ -F "photo=@/path/to/photo.jpg" ``` Pipeline: Photo → OllamaVision (model number) → **DB model cache check** → *(cache hit: copy + done)* / *(cache miss: Tavily search → JsonCoding → Validation → Draft → eBay text)* --- ## API Keys Generated via console only (raw key shown once): ```bash docker compose exec app php bin/console app:api-keys:create --env=prod ``` Use as `X-Api-Key: ` header. --- ## Architecture Hexagonal (Domain / Application / Infrastructure). See design doc for full details. ``` src/ Domain/ # Pure PHP — Article, ArticleType, Order, Customer, AIPipelineJob … Application/ # Use cases, orchestration via interfaces Infrastructure/ AI/ # OllamaClient, MistralClient, 4 AI agents Channel/ # EbayAdapter, FrappeErpAdapter Search/ # TavilyWebSearch Persistence/ # Doctrine repositories (PostgreSQL) Messenger/ # Message classes + handlers (3 queues: ai_pipeline, orders, channel_sync) Http/ # Symfony controllers, EasyAdmin CRUD, webhooks ``` All plans (1–6) complete. Active development tracked via Claude Code sessions.