# NYVAL IA

SaaS pour e-commerçants Shopify : générer, modifier et gérer des **visuels marketing IA** (mannequins, photos produit, bannières, lifestyle), avec **dashboard financier intelligent** (marges réelles + optimisées IA, prévisions).

- **Frontend** : React (JSX) + SCSS + Vite + React Query
- **Backend** : Node.js + Express
- **Base de données** : PostgreSQL (migrations + seed via Knex)
- **Auth** : JWT + refresh token, RBAC, **une seule session active par boutique**
- **Architecture multi-boutiques** : toutes les données sont rattachées à la **boutique** (jamais à l'utilisateur)
- **IA** : Claude (analyse + reformulation des prompts, finances) → routage automatique → **Nano Banana 2** (images)

---

## 1. Démarrage le plus simple — Docker (recommandé)

> Tout (base de données + backend + frontend) démarre avec une seule commande. Il faut **Docker Desktop** installé et lancé.

### Étape 1 — créer le fichier de configuration

Copiez le modèle `.env` :

```
cp .env.example .env
```

### Étape 2 — générer une clé de chiffrement

```
openssl rand -hex 32
```

Collez la valeur obtenue dans `.env` à la ligne `API_KEY_ENCRYPTION_KEY=`. Mettez aussi des valeurs longues et aléatoires dans `JWT_ACCESS_SECRET=` et `JWT_REFRESH_SECRET=`.

### Étape 3 — tout lancer

```
docker compose up --build
```

C'est prêt :

- Application : **http://localhost:5173**
- API : **http://localhost:8000**

> Au premier démarrage, les migrations et le **seed de démonstration** sont exécutés automatiquement.

### Connexion de démonstration

- **Email** : `nyval.ship@outlook.com`
- **Mot de passe** : `NyvalAdmin2026!`

---

## 2. Démarrage manuel (sans Docker)

> À utiliser si vous ne voulez pas Docker. Il faut **Node.js 20+** et **PostgreSQL** installés.

### Backend

Une commande à la fois :

```
cd backend
```

```
npm install
```

```
cp .env.example .env
```

```
openssl rand -hex 32
```

(Collez la valeur dans `backend/.env` → `API_KEY_ENCRYPTION_KEY=`, et renseignez les accès PostgreSQL.)

```
npm run migrate
```

```
npm run seed
```

```
npm run dev
```

### Frontend (dans un second terminal)

```
cd frontend
```

```
npm install
```

```
npm run dev
```

Ouvrez **http://localhost:5173**.

---

## 3. Activer la génération IA

L'application fonctionne sans clés (avec une optimisation de prompt « heuristique »), mais pour **générer de vraies images** et utiliser **Claude**, ajoutez les clés API **dans l'app** :

1. Connectez-vous, allez dans **Paramètres**.
2. Section **Clés API** :
   - **Nano Banana 2** (génération d'images)
   - **Claude (Anthropic)** (analyse + reformulation des prompts)

Les clés sont **chiffrées** (AES-256-GCM) et stockées **au niveau de la boutique** — jamais exposées au frontend.

---

## 4. Connecter Shopify

1. **Boutiques** → saisir le domaine `maboutique.myshopify.com` → **Connecter Shopify (OAuth)**.
2. Les identifiants Shopify (`SHOPIFY_CLIENT_ID`, `SHOPIFY_CLIENT_SECRET`) doivent être renseignés dans `.env` côté serveur (jamais dans le frontend).
3. Une fois connecté : bouton **Synchroniser** pour importer produits + commandes.

---

## 5. Le workflow IA (obligatoire pour tous les prompts)

1. Vous saisissez un prompt.
2. **Claude analyse** le prompt.
3. **Claude reformule** pour le meilleur résultat.
4. L'app affiche **Prompt utilisateur** + **Prompt optimisé**.
5. Question : « **Souhaitez-vous utiliser ce prompt optimisé ?** »
6. Après validation : **routage automatique** (image → Nano Banana 2 ; texte/finance → Claude).

---

## 6. Structure du projet

```
NYVAL AI/
├── docker-compose.yml        # Postgres + backend + frontend
├── .env.example              # variables d'environnement (modèle)
├── backend/
│   ├── src/
│   │   ├── config/           # config centralisée + connexion DB
│   │   ├── db/migrations/    # schéma SQL (toutes les tables, shop_id partout)
│   │   ├── db/seeds/         # seed de démonstration
│   │   ├── middleware/       # auth JWT, RBAC, validation, rate limit, erreurs
│   │   ├── services/         # claude, nanobanana, shopify, finance, auth, clés API
│   │   ├── controllers/      # logique des routes
│   │   ├── routes/           # API REST
│   │   └── utils/            # crypto (chiffrement clés), jwt, storage, logger
│   └── tests/                # tests unitaires + intégration (vitest)
└── frontend/
    └── src/
        ├── api/              # client axios + refresh token
        ├── context/          # AuthContext
        ├── components/       # Layout, Sidebar, PromptWorkflow, Modal, BarChart
        ├── pages/            # Dashboard, Produits, Mannequins, Visuels, Finances, Boutiques, Paramètres
        └── styles/           # SCSS
```

---

## 7. Commandes utiles (backend)

| Commande | Effet |
|---|---|
| `npm run dev` | Démarre l'API en mode développement |
| `npm run migrate` | Applique les migrations SQL |
| `npm run seed` | Insère les données de démonstration |
| `npm run db:reset` | Réinitialise complètement la base (rollback + migrate + seed) |
| `npm test` | Lance les tests |

---

## 8. Sécurité

- JWT (access) + refresh token, sessions stockées en base.
- **Une seule session active par boutique** (verrou de connexion unique).
- Clés API **chiffrées** (AES-256-GCM) au niveau boutique.
- RBAC (owner / admin / editor / viewer).
- Validation serveur (Zod), Helmet, CORS, rate limiting.
- Secrets Shopify uniquement côté serveur (jamais dans le frontend).

---

## 9. Base de données — tables principales

`users`, `shops`, `shop_members`, `shop_sessions`, `api_keys`, `products`, `product_versions`,
`models`, `model_versions`, `visuals`, `visual_versions`, `financial_transactions`,
`financial_forecasts`, `subscriptions`, `shopify_orders`, `activity_logs`.

Toutes les tables métier contiennent `shop_id` pour garantir l'**isolation des données par boutique**.
