Architecture technique
Stack technique, structure du projet et principes de sécurité de la plateforme.
Structure du projet
teranga/
├── backend/ # API REST — Node.js/Express + TypeScript + Prisma + PostgreSQL
├── frontend/ # Interface Web — Next.js (App Router) + TypeScript + Tailwind CSS
├── android/ # App mobile — Kotlin + Jetpack Compose + Hilt + Room DB
├── wordpress/ # Plugins WordPress (Teranga Booking, BA Book Everything Sync)
└── docker-compose.yml
Stack technique
| Couche | Technologie |
|---|---|
| Frontend Web | Next.js, TypeScript, Tailwind CSS, React Query, Zustand, Recharts |
| Backend API | Node.js, Express, TypeScript, Zod |
| ORM / DB | Prisma + PostgreSQL |
| Cache | Redis |
| Auth | JWT (access + refresh tokens), bcryptjs, RBAC à 2 niveaux |
| Paiement | FedaPay (abonnements + gateway intégrée + WordPress), Mobile Money via QR code |
| Mobile | Kotlin, Jetpack Compose, Room DB, Retrofit, Hilt DI |
| DevOps | Docker, Docker Compose, GitHub Actions CI/CD |
Multi-tenant
Isolation par tenant_id, appliquée automatiquement par un middleware Prisma sur chaque requête — un tenant ne peut jamais accéder aux données d’un autre, y compris en cas d’erreur applicative (défense en profondeur avec Row Level Security PostgreSQL).
Sécurité
- Isolation multi-tenant via middleware Prisma + Row Level Security PostgreSQL.
- JWT signé, durée courte (15 min), refresh token en cookie HttpOnly (accepté aussi dans le body pour mobile).
- Validation Zod (whitelist) sur tous les endpoints.
- Rate limiting par IP et par tenant en production.
- Réservations anti-double-booking en transaction Serializable.
- Idempotence des opérations POS par UUID unique.
- Recalcul des montants côté serveur (anti-manipulation) — jamais de confiance dans un montant envoyé par le client.
- bcryptjs à 12 rounds, comparaison à temps constant.
- Headers de sécurité (Helmet), CORS configurable par domaine.
- Upload d’images limité en taille et en formats acceptés.
- Journalisation structurée pour audit.
Design system
- Web : terracotta, or, sauge — voir les tokens CSS partagés du site.
- Mobile (application Android) : palette dédiée inspirée du Bénin (rouge Dahomey, or béninois, vert béninois, bronze Abomey).