Go to file
David c35f3d7bfb feat(ia): fait valider par un administrateur toute page ecrite par l'assistant
L'assistant publiait directement dans le wiki global. La politique de contenu
ecarte la faute franche — conseil FCL, cas client, hors perimetre — mais une
heuristique ne juge pas la justesse : une page fausse mais bien ecrite la
franchissait, et se retrouvait citee comme documentation Xpeditis aupres de
tous les clients.

Domaine
- `WikiContributionStatus` : pending / published / rejected. `create()` ne
  prend pas le statut en parametre — rien ne nait publie.
- `publish(reviewerId, edits?)` valide, en acceptant une correction du
  relecteur, qui repasse la meme politique de contenu.
- `reject(reviewerId, note?)` ecarte sans supprimer : la liste des refus montre
  ou l'assistant se trompe.
- `revise()` remet une page validee en attente : sans cela, la validation
  porterait sur un texte que l'assistant a remplace depuis.

Ce qui sort du depot
- `findPublished` pour la recherche et la page publique, `findForReview` pour
  l'administration. Le statut est porte par la requete, pas filtre en memoire :
  une page en attente ne peut pas sortir par le chemin des clients.
- `revision()` ne compte que le publie, donc l'index vectoriel ne se reconstruit
  que sur une decision.

Relecture
- `GET /admin/wiki-contributions`, `POST :id/publish`, `POST :id/reject`, sous
  JwtAuthGuard + RolesGuard et @Roles('admin').
- Chaque decision est journalisee (`WIKI_CONTRIBUTION_REVIEWED`) : une page
  publiee engage la marque, on doit pouvoir dire qui l'a laissee passer.
- Ecran `/admin/wiki` : file par statut, corps complet affiche, correction et
  motif de refus facultatifs.

L'assistant
- La capacite rend `pending_review` et un message d'attente, plus d'URL : le
  modele annonce une proposition, jamais une publication. La consigne le lui
  dit explicitement.

SQL de la migration verifie sur la base locale : l'upsert sur index
d'expression met bien a jour a la casse pres, la contrainte de statut refuse
une valeur inconnue.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 12:41:28 +02:00
.agents/skills chore: ajouter les definitions d agents et le hook Codex 2026-09-07 21:40:49 +02:00
.claude chore: sync full codebase from cicd branch 2026-04-04 12:56:16 +02:00
.codex chore: ajouter les definitions d agents et le hook Codex 2026-09-07 21:40:49 +02:00
.github/workflows feat(deploy): pipeline CD et composition Docker complete 2026-09-07 21:40:50 +02:00
apps feat(ia): fait valider par un administrateur toute page ecrite par l'assistant 2026-09-18 12:41:28 +02:00
docker feat(deploy): pipeline CD et composition Docker complete 2026-09-07 21:40:50 +02:00
docs docs: documenter le serveur MCP et le registre de capacites 2026-09-07 21:40:54 +02:00
infra fix admin monter 2026-09-15 15:21:05 +02:00
postman chore: sync full codebase from cicd branch 2026-04-04 12:56:16 +02:00
scripts chore: sync full codebase from cicd branch 2026-04-04 12:56:16 +02:00
.gitignore fix 2026-04-06 13:09:03 +02:00
.prettierignore first commit 2025-10-07 18:39:32 +02:00
.prettierrc first commit 2025-10-07 18:39:32 +02:00
AGENTS.md chore: ajouter les definitions d agents et le hook Codex 2026-09-07 21:40:49 +02:00
CLAUDE.md chore: sync full codebase from cicd branch 2026-04-04 12:56:16 +02:00
INDEX.md fix celan v2 2026-05-14 21:11:54 +02:00
package-lock.json fix types check 2026-04-04 15:28:13 +02:00
package.json first commit 2025-10-07 18:39:32 +02:00
QUICK-START.md revert: restore root-level docs mistakenly deleted 2026-04-04 13:02:27 +02:00
README.md fix celan v2 2026-05-14 21:11:54 +02:00

Xpeditis — Maritime Freight Booking Platform

Plateforme B2B SaaS permettant aux transitaires de rechercher, comparer et réserver du fret maritime en temps réel.


Démarrage rapide

# 1. Installer les dépendances
npm run install:all

# 2. Démarrer l'infrastructure (PostgreSQL + Redis + MinIO)
docker-compose up -d

# 3. Configurer l'environnement
cp apps/backend/.env.example apps/backend/.env
cp apps/frontend/.env.example apps/frontend/.env.local

# 4. Exécuter les migrations
cd apps/backend && npm run migration:run && cd ../..

# 5. Démarrer les serveurs
npm run backend:dev    # http://localhost:4000 · Swagger: /api/docs
npm run frontend:dev   # http://localhost:3000

Structure du projet

xpeditis/
├── apps/
│   ├── backend/          # NestJS 10 — Architecture hexagonale
│   │   └── src/
│   │       ├── domain/          # Logique métier pure (TypeScript)
│   │       ├── application/     # Controllers, DTOs, Guards
│   │       └── infrastructure/  # TypeORM, Redis, S3, Email, Stripe
│   └── frontend/         # Next.js 14 App Router
│       ├── app/[locale]/        # Routing i18n (fr, en)
│       └── src/                 # Components, hooks, lib/api
├── docker-compose.yml    # PostgreSQL 15 + Redis 7 + MinIO
└── docs/                 # Documentation complète

Documentation

Sujet Fichier
Index complet docs/README.md
Architecture hexagonale + conventions CLAUDE.md
Vue d'ensemble système docs/architecture/overview.md
Schéma BDD (21 tables) docs/architecture/database.md
Démarrage rapide docs/getting-started/quick-start.md

Commandes de développement

# Backend
npm run backend:dev       # Serveur avec hot-reload
npm run backend:test      # Tests unitaires Jest
npm run backend:lint      # ESLint
npm run backend:build     # Build production

# Frontend
npm run frontend:dev      # Serveur avec hot-reload
npm run frontend:test     # Tests unitaires Jest
npm run frontend:lint     # ESLint
cd apps/frontend && npm run test:e2e  # Playwright E2E

# Qualité
npm run format            # Prettier (tous les fichiers)

# Base de données
cd apps/backend
npm run migration:generate -- src/infrastructure/persistence/typeorm/migrations/NomMigration
npm run migration:run
npm run migration:revert

Stack technique

Backend

Composant Technologie
Framework NestJS 10 + TypeScript 5 (strict)
Base de données PostgreSQL 15 + TypeORM
Cache Redis 7 (ioredis)
Auth JWT (15min) + Refresh + OAuth2 + API Keys (Argon2)
Temps réel Socket.IO
Email Nodemailer + MJML
Paiements Stripe
Stockage S3/MinIO
Logging nestjs-pino
Monitoring Sentry

Frontend

Composant Technologie
Framework Next.js 14 App Router + TypeScript
Styling Tailwind CSS + shadcn/ui (Radix UI)
State serveur TanStack Query v5
Tables TanStack Table v8 + Virtual
Formulaires react-hook-form + zod
Temps réel Socket.IO client
i18n next-intl (fr, en)
Graphiques recharts

Carriers intégrés

Carrier Code Statut
Maersk MAEU Connecteur API
MSC MSCU Connecteur API
CMA CGM CMDU Connecteur API
Hapag-Lloyd HLCU Connecteur API
ONE ONEY Connecteur API
SSC Consolidation — CSV
ECU Worldwide — CSV + API
TCC Logistics — CSV
NVO Consolidation — CSV

Fonctionnalités principales

  • Recherche tarifs : FCL (carriers API + cache Redis 15min) + LCL CSV
  • Réservation standard : workflow 4 étapes, numéro WCM-YYYY-XXXXXX
  • Réservation CSV + Portail Carrier : magic link, accept/reject
  • Dashboard : KPI, graphiques, table interactive virtuelle
  • Auth : JWT, OAuth2 (Google/Microsoft), API Keys, RBAC (5 rôles)
  • Abonnements : Stripe (FREE/BRONZE/SILVER/GOLD/PLATINIUM)
  • Notifications : WebSocket temps réel + webhooks tiers
  • GDPR : export/suppression des données utilisateur
  • Blog : gestion de contenu bilingue (fr/en)
  • Audit : journal d'audit de toutes les actions

Architecture hexagonale — NestJS 10 + Next.js 14 — PostgreSQL 15 + Redis 7