# Content Machine — Audit & Fixes (v2)

Audit complet al fluxului end-to-end. 11 probleme identificate și reparate.

---

## 🔴 Bug-uri critice (aplicația nu funcționa)

### 1. Ruta `niche` nu era montată
**Fișier:** `backend/src/index.js`
Întreg fluxul Niche Builder + Topic Approval era inaccesibil — API-ul răspundea 404 la toate cererile `/api/niche/*`.
**Fix:** Importat și montat `nicheRoutes` la `/api/niche`.

### 2. Pipeline worker ignora topicurile aprobate
**Fișier:** `backend/src/jobs/pipeline-worker.js`
Fluxul principal (client aprobă topicuri → AI generează pe ele) NU funcționa. Worker-ul rula mereu pe auto-generate, ignorând complet aprobarea clientului.
**Fix:**
- `job.data` extrage acum `approvedTopics` și `nicheId`
- Dacă există topicuri aprobate → le folosește direct
- Altfel → fallback la auto-generate (pentru rulări programate)
- `enqueuePipeline()` acceptă al treilea parametru `options`
- Topicurile sunt marcate `used_in_run_id` după finalizare
- `niche_id` salvat în `pipeline_runs`

### 3. NicheBuilder lipsea din routing frontend
**Fișier:** `frontend/src/App.jsx`
Pagina exista dar nu era accesibilă.
**Fix:** Importat + adăugată ruta `/dashboard/niche`.

### 4. Niciun link în sidebar spre Niches
**Fișier:** `frontend/src/components/layout/AppShell.jsx` + `i18n/translations.js`
**Fix:** Adăugat link cu icon Target, poziționat al doilea (după Dashboard, fiindcă inițiază fluxul). Traduceri EN ("Niches") + RO ("Nișe").

---

## 🟠 Bug-uri importante (securitate + funcționalitate)

### 5. Niciun enforcement al limitelor zilnice
**Fișier:** `backend/src/routes/pipeline.js` + nou `backend/src/utils/limits.js`
Clienții puteau rula pipeline nelimitat, ignorând planul plătit. Risc major de cost API.
**Fix:** Helper `checkPipelineAllowed()` aplică:
- Starter: 1 rulare/zi
- Pro: 3 rulări/zi
- Agency: 10 rulări/zi

### 6. Webhook Stripe nu mapa corect statusurile
**Fișier:** `backend/src/routes/stripe.js`
`customer.subscription.updated` actualiza doar la schimbare de plan, ignorând tranzițiile `past_due`, `unpaid`, `trialing`.
**Fix:** Mapare completă Stripe status → status intern.

### 7. Lipsea endpoint public pentru demo-ul din landing
**Fișier nou:** `backend/src/routes/demo.js`
Demo-ul live din landing page nu avea backend — folosea doar template-uri client-side.
**Fix:** `/api/demo/topics` cu:
- Rate-limit strict: 3 generări/10min/IP
- Model ieftin (Claude Haiku / GPT-4o-mini) pentru cost redus
- Fallback automat la template dacă AI eșuează

### 8. Stripe checkout fragil
**Fișier:** `backend/src/routes/stripe.js`
Dacă `stripe_customer_id` lipsea (race condition la register), checkout pica.
**Fix:**
- Creare lazy a customer-ului Stripe dacă lipsește
- `payment_method_collection: 'always'` (card cerut la trial, conform deciziei)
- Cancel URL corectat spre `/dashboard/billing`

### 9. Conflict de rutare Express
**Fișier:** `backend/src/routes/niche.js`
`PATCH /proposals/bulk` era prins de `PATCH /proposals/:id` cu `id="bulk"` — bulk approve nu funcționa.
**Fix:** Mutat ruta `/bulk` ÎNAINTEA rutei `/:id`.

### 10. `run-with-topics` ocolea limita zilnică
**Fișier:** `backend/src/routes/niche.js`
Clienții puteau ocoli limita rulând din NicheBuilder în loc de Dashboard.
**Fix:** Aplicat același helper `checkPipelineAllowed()` ca în `/pipeline/run`.

### 11. Migrarea 002 nu se aplica niciodată
**Fișier:** `backend/src/migrate.js`
`migrate.js` rula hardcodat doar `001_initial.sql`. Tabelele `niche_profiles` și `topic_proposals` nu se creau niciodată.
**Fix:**
- `migrate.js` rulează acum TOATE fișierele `.sql` din `migrations/` în ordine
- `002_niche_topics.sql` făcut idempotent (`IF NOT EXISTS`)

---

## ✅ Verificări trecute

- Syntax check pe toate cele 7 fișiere backend modificate
- Build frontend complet (NicheBuilder inclus) — 1994 module, fără erori
- `limits.js` se încarcă curat

---

## Fluxul corect acum (end-to-end)

```
1. Client se înregistrează → trial 14 zile
2. Client → Niches → creează profil nișă (wizard 4 pași)
3. Activează nișa → Generate Topics
4. AI propune 7 topicuri (Intel Agent + Topic Generator)
5. Client aprobă/editează/respinge fiecare
6. "Run Pipeline (N)" → /api/niche/run-with-topics
   → checkPipelineAllowed (limită zilnică + nu rulează deja)
   → enqueuePipeline cu approvedTopics
7. Worker rulează 9 agenți pe topicurile APROBATE
8. Topicurile marcate ca folosite
9. Conținutul apare în Content Library
10. Stripe webhook gestionează trial → active → past_due → canceled
```

---

## Cum aplici update-ul

```bash
# Rulează migrarea nouă (creează tabelele niche)
cd backend && npm run migrate

# Rebuild frontend
cd ../frontend && npm run build

# Restart backend
pm2 restart contentmachine-api
```
