CognxSafeTrack
docs: add audit_production.md + plan_implementation_prod.md; fix admin phone field
f1a06cd Audit Complet — État de la Codebase
Date : 2026-02-22 — Commit base : c286b2d
1. Architecture globale
apps/
api/ → Fastify REST API (Railway — port 3001)
whatsapp-worker/ → BullMQ Worker (Railway — même container)
admin/ → Dashboard React (Vite + Tailwind)
web/ → Landing page + portail étudiant (Vite + Tailwind)
packages/
database/ → Prisma schema (PostgreSQL) + migrations
shared-types/ → Types TypeScript partagés
tsconfig/ → Config TS commune
ui/ → (vide)
2. Ce qui fonctionne ✅
| Composant | État |
|---|---|
| Webhook WhatsApp (GET verify + POST events) | ✅ Implémenté |
| Onboarding : INSCRIPTION → langue → secteur | ✅ |
| Menus interactifs LIST (boutons natifs) | ✅ Titre ≤ 24 chars corrigé |
| Download audio Meta Graph API (Railway) | ✅ |
Transcription Whisper via /v1/ai/transcribe |
✅ |
Feedback AI generateFeedback() + 429 fallback |
✅ |
| Timeout IA 10s (Promise.race) | ✅ |
| TTS leçon → audio R2 | ✅ |
| Personnalisation leçon par secteur | ✅ |
| SUITE / DAY_CONTINUE → jour suivant | ✅ Regex fixé |
| REPLAY → réécoute leçon | ✅ |
| EXERCISE → invite réponse | ✅ |
| Dock génération OnePager PDF + PitchDeck PPTX | ✅ |
| Paiements Stripe (checkout + webhook) | ✅ Implémenté |
| Admin dashboard (stats + enrollments + CSV export) | ✅ |
| Dockerfile combiné API + Worker (Railway) | ✅ |
| Scheduler cron leçons quotidiennes | ✅ (basique) |
Stockage audio R2 via /v1/ai/store-audio |
✅ Ajouté |
3. Problèmes identifiés ❌
3.1 Critiques (bloquants en prod)
| # | Fichier | Problème | Solution |
|---|---|---|---|
| C1 | Railway vars |
WHATSAPP_APP_SECRET non défini → HMAC skip (warning) |
Ajouter la variable |
| C2 | Railway vars |
DISABLE_WHATSAPP_SEND=true encore présent → aucun envoi |
Supprimer la variable |
| C3 | Base de données | Aucun contenu (Track/TrackDay) en production → enrollement impossible | Seed ou admin content manager |
| C4 | api/src/services/stripe.ts |
STRIPE_SECRET_KEY et STRIPE_WEBHOOK_SECRET non vérifiés au démarrage | Ajouter à Railway vars |
| C5 | Meta webhook | URL pas encore validée si container 502 | Corriger après Railway restart |
3.2 Importants (fonctionnalités incomplètes)
| # | Composant | Problème |
|---|---|---|
| I1 | apps/admin |
Pas de gestion de contenu (Tracks/TrackDays) — impossible de créer des leçons via l'interface |
| I2 | apps/admin |
env.user?.whatsappId utilisé mais le modèle User a phone (pas whatsappId) → colonne vide dans le tableau |
| I3 | apps/web |
Portail étudiant /login est factice — handleLogin fait un fake alert avec setTimeout, n'appelle aucune API |
| I4 | apps/web |
Pas de page de succès paiement Stripe (/payment/success) |
| I5 | whatsapp-worker/src/scheduler.ts |
Cron envoie les leçons mais sans logique de vérification du jour courant — risque d'envoyer à des utilisateurs déjà complétés |
| I6 | apps/api/routes/admin.ts |
Pas de route pour créer/modifier des Tracks ou TrackDays API-side |
| I7 | packages/ui |
Package vide — prévu pour composants partagés mais non utilisé |
3.3 Mineurs (dette technique)
| # | Problème |
|---|---|
| M1 | Enrollment et UserProgress sont deux tables qui trackent le même currentDay et exerciseStatus — duplication de données |
| M2 | admin/src/App.tsx ligne 108 : import lucide-react collé avec une déclaration d'interface (mauvais formatage) |
| M3 | Message modèle Prisma non utilisé nulle part dans le code (payload jamais stocké) |
| M4 | web/src n'a pas de VITE_API_URL configuré par défaut → fallback localhost:3001 en prod |
| M5 | Pas de gestion du cas où un utilisateur envoie INSCRIPTION alors qu'il est déjà inscrit à une formation active |
4. Variables d'environnement — état complet
Railway (whatsapp-worker service)
| Variable | Statut | Action |
|---|---|---|
WHATSAPP_VERIFY_TOKEN |
✅ | OK |
WHATSAPP_ACCESS_TOKEN |
✅ | OK |
WHATSAPP_PHONE_NUMBER_ID |
✅ | OK |
WHATSAPP_APP_SECRET |
⚠️ Non défini | Ajouter (Meta App → Basic Settings → App Secret) |
ADMIN_API_KEY |
✅ (confirmé) | OK |
DATABASE_URL |
✅ | OK |
REDIS_URL |
✅ | OK |
OPENAI_API_KEY |
✅ | OK |
API_URL |
✅ | OK (doit pointer vers URL Railway publique) |
DISABLE_WHATSAPP_SEND |
❌ Présent | Supprimer |
STRIPE_SECRET_KEY |
❓ Non confirmé | Ajouter si Stripe actif |
STRIPE_WEBHOOK_SECRET |
❓ Non confirmé | Ajouter si Stripe actif |
NODE_ENV |
✅ | OK |
R2_* variables |
✅ | OK |
HuggingFace (api service — inbound webhook désactivé)
| Variable | Statut |
|---|---|
DISABLE_WHATSAPP_SEND |
✅ true (correct) |
OPENAI_API_KEY |
✅ |
DATABASE_URL |
✅ |
| Autres | Même que Railway |
5. Déploiements
| Service | Plateforme | URL | État |
|---|---|---|---|
| API + Worker (webhook + BullMQ) | Railway | whatsapp-worker-production-0bc0.up.railway.app |
🟡 En restart |
| Landing + Portail | HF / Netlify ? | À confirmer | ❓ |
| Admin Dashboard | HF / Netlify ? | À confirmer | ❓ |