1. Vue d'ensemble
CamerMove est une plateforme multi-services dediee a la mobilite au Cameroun. Elle connecte les voyageurs aux transporteurs, hotels, loueurs de vehicules et prestataires de services via un seul compte et un systeme de paiement unifie (Mobile Money).
Version
v.0.1-beta (Septembre 2026)
Frontend
Next.js 16, React 19, Tailwind v4, Zustand
Backend
Fastify 5, Prisma 6, PostgreSQL 16, Redis 7
Auth
JWT + Refresh Tokens + RBAC (4 roles)
API Docs
Services
6 modules operationnels
http://localhost:3002 • API: http://localhost:3000 • Swagger: http://localhost:3000/docs • Health: http://localhost:3000/health2. Architecture
2.1 Structure du monorepo
camermove/
+-- apps/
| +-- api/ # API REST Fastify (port 3000)
| +-- web/ # Frontend Next.js 16 (port 3002)
| +-- worker/ # Jobs BullMQ + Consumer Kafka
+-- packages/
| +-- config/ # Configuration Zod (loadEnv)
| +-- db/ # Schema Prisma + repositories
| +-- events/ # Types et producteurs Kafka
| +-- frontend/ # Stores Zustand, hooks, API clients
| +-- media/ # Stockage S3/MinIO
| +-- observability/ # Prometheus + OpenTelemetry
| +-- shared/ # Calculs financiers, BullMQ queues
+-- tests/ # Tests E2E Playwright
+-- docs/ # Documentation + screenshots
+-- infra/ # Docker Compose, Prometheus, Grafana
2.2 Principes directeurs
| Principe | Implementation |
|---|---|
| Statelessness | JWT dans chaque requete, pas de session serveur |
| Idempotence | Header Idempotency-Key sur POST/PUT/PATCH |
| Validation | Zod sur chaque endpoint API |
| Securite | argon2 + RBAC (4 roles) + audit logs |
| Cache | Redis TTL 60s recherche, invalidation sur ecriture |
| Rate Limiting | Double couche IP + app-wide via Redis |
| Async | Kafka evenements + BullMQ taches differees |
3. Modules (6 Services)
3.1 Transport Interurbain ACTIF
Module principal - recherche et reservation de bus interurbain.
Recherche
Origine, destination, date, nombre de passagers
Filtres
Prix, heure depart, type vehicule, places dispo
Selection siege
Carte interactive avec places disponibles/occupes
Hold
Reservation temporaire 15 min en attente paiement
Routes : /results → /trips/:id → /book/:tripId → /book/confirmation
API : GET /search, GET /trips/:id, POST /bookings
3.2 Hotels ACTIF
Recherche et reservation d'hebergements verifies.
Recherche
Par ville, dates, nombre personnes
Filtres
Prix, equipements, note
Detail
Photos, description, chambres disponibles
Reservation
Selection chambre + confirmation
Routes : /hotels → /hotels/:id → /hotels/confirmation
3.3 Location de Vehicules ACTIF
Location de vehicules avec prise en charge.
Catalogue
Vehicules par categorie (berline, SUV, utilitaire)
Disponibilite
Calendrier des reservations
Options
Prise en charge aéroport, chauffeur
Routes : /rentals → /rentals/:id → /rentals/confirmation
3.4 Transport de Colis ACTIF
Envoi et suivi de colis entre villes.
Envoi
Formulaire expediteur + destinataire + type colis
Calcul frais
Automatique selon poids et destination
Suivi
Statut en temps reel via numero tracking
Routes : /parcels (envoi/suivi) → /parcels/success → /parcels/track/:trackingNumber
3.5 Assurance Voyage ACTIF
Souscription assurance voyage (sante, bagages, rapatriement).
Devis
Calcul automatique selon destination et duree
Souscription
Formule basique, standard, premium, famille
Police
Document genere apres paiement
Routes : /insurance → /insurance/success
3.6 Billetterie Evenementielle ACTIF
Vente de billets pour concerts, matchs, festivals.
Evenements
Liste filtrable par ville, type, date
Reservation
Selection du nombre de places
Billet QR
Code QR unique verifier sur place
Routes : /events → /events/:id → /book/confirmation
4. Authentification
Systeme JWT avec 4 roles hierarchiques et refresh tokens securises.
4.1 Roles
| Role | Niveau | Permissions |
|---|---|---|
voyageur | 1 | Reserver, voir ses reservations, payer |
partenaire | 2 | Gerer ses trajets/hotels/vehicules |
admin | 3 | Gerer utilisateurs, voir statistiques |
super_admin | 4 | Acces complet + parametres systeme |
4.2 Flux complet
Login
POST /auth/login avec email + password. Retourne accessToken (15min) + refreshToken (7j).
Stockage
Cookie cm_access (SameSite=Lax, 15min). Zustand store en memoire.
Requetes
Header Authorization: Bearer <accessToken> sur chaque appel API.
Middleware
Next.js middleware verifie cookie pour routes protegees (/dashboard, /tickets, /admin).
API Guard
requireAuth(role?) verifie signature JWT + permissions en base.
Refresh
Quand access token expire, POST /auth/refresh avec refreshToken pour en obtenir un nouveau.
4.3 Securite
- Mots de passe haches avec
argon2 - Tokens JWT signe HS256, expiration 15 min
- Refresh tokens stockes en DB avec rotation (detection vol)
- Rate limiting: 5 tentatives/min sur
/auth/login - Audit logs: toutes les actions sensibles enregistrees
- Cookie
SameSite=Lax(protection CSRF)
5. Workflow de Reservation (Transport)
5.1 Etapes
Recherche /results
L'utilisateur saisit origine, destination, date, passagers. Appel API GET /api/v1/search.
Liste resultats
Affichage des trajets avec prix, horaires, places dispo. Filtrage client cote client.
Detail trajet /trips/:id
Carte des sieges interactive. WebSocket pour mise a jour temps reel des places.
Selection siege
Clic sur un siege disponible. Stockage dans Zustand booking store.
Informations passager /book/:tripId
Formulaire nom + telephone. Redirection login si non authentifie.
Confirmation
API POST /api/v1/bookings cree un hold de 15 min. Evenement Kafka booking.created.
Paiement /payments
Choix Orange Money ou MTN MoMo. Appel API POST /api/v1/payments.
Confirmation /book/confirmation
Billet QR genere. Evenements payment.completed + ticket.issued.
5.2 Diagramme
[Recherche] --> [Resultats] --> [Detail Trajet] --> [Selection Siege]
| |
v v
[Cache Redis] [Zustand Store]
|
[Confirmation] <-- [Paiement] <-- [Hold 15min] <-- [Infos Passager]
|
v
[Billet QR] --> [Dashboard] --> [Email/SMS Notification]
6. Administration
Interface d'administration reservee aux roles admin et super_admin.
| Route | Description | Role |
|---|---|---|
/admin | Tableau de bord (stats, graphiques recharts) | Admin+ |
/admin/users | Gestion utilisateurs (CRUD, changement role) | Admin+ |
/admin/trips | Gestion trajets (creation, statut, export) | Admin+ |
/admin/bookings | Gestion reservations (confirmation, annulation) | Admin+ |
/admin/payments | Suivi paiements + reconciliation | Admin+ |
/admin/transporters | Gestion transporteurs partenaires | Admin+ |
/admin/settings | Parametres (commission, hold, feature flags) | Super-Admin |
7. Espace Transporteur
| Route | Description |
|---|---|
/transporter | Dashboard transporteur |
/transporter/trips | Liste de leurs trajets |
/transporter/bookings | Reservations pour leurs trajets |
/transporter/routes | Leurs itineraires |
/transporter/vehicles | Gestion de leur flotte |
/transporter/apply | Formulaire de candidature |
8. Espace Partenaire
| Route | Description |
|---|---|
/partner | Dashboard partenaire |
/partner/hotels | Gestion de leurs hotels |
/partner/rentals | Gestion de leurs vehicules |
/partner/parcels | Gestion de leurs envois |
/partner/events | Gestion de leurs evenements |
/become-partner | Page publique de presentation |
9. API REST & Swagger
L'API REST est documentee avec OpenAPI/Swagger et accessible a http://localhost:3000/docs.
| MET | Route | Auth | Description |
|---|---|---|---|
| POST | /api/v1/auth/register | Non | Inscription |
| POST | /api/v1/auth/login | Non | Connexion (retourne tokens) |
| POST | /api/v1/auth/refresh | Non | Rafraichir access token |
| POST | /api/v1/auth/logout | Oui | Deconnexion |
| GET | /api/v1/search | Non | Recherche trajets |
| GET | /api/v1/trips/:id | Non | Detail trajet |
| POST | /api/v1/bookings | Oui | Creer reservation |
| GET | /api/v1/bookings/:id | Oui | Detail reservation |
| POST | /api/v1/bookings/:id/cancel | Oui | Annuler reservation |
| POST | /api/v1/payments | Oui | Creer paiement |
| GET | /api/v1/tickets/lookup | Non | Verification billet (public) |
| GET | /api/v1/me/bookings | Oui | Reservations utilisateur |
| GET | /api/v1/me/tickets | Oui | Billets utilisateur |
| GET | /api/v1/me/dashboard | Oui | Tableau de bord |
Authorization: Bearer <access_token>\nContent-Type: application/json\nIdempotency-Key: <uuid> # Pour POST/PUT/PATCH
10. Toutes les Routes (50+)
Pages publiques (30)
| Route | Description |
|---|---|
/ | Accueil + 6 rails services |
/results | Resultats recherche trajets |
/trips/:id | Detail trajet + selection siege |
/hotels | Liste hotels |
/hotels/:id | Detail hotel |
/hotels/confirmation | Confirmation hotel |
/rentals | Liste vehicules |
/rentals/:id | Detail vehicule |
/rentals/confirmation | Confirmation location |
/parcels | Envoi + suivi colis |
/parcels/success | Confirmation envoi |
/parcels/track/:tn | Suivi par numero |
/events | Liste evenements |
/events/:id | Detail evenement |
/insurance | Devis assurance |
/insurance/success | Confirmation assurance |
/faq | Questions frequentes |
/how-it-works | Comment ca marche |
/legal/cgu | Conditions generales |
/legal/privacy | Politique confidentialite |
/contact | Formulaire contact |
/become-partner | Devenir partenaire |
/transporter/apply | Candidature transporteur |
/login | Connexion |
/register | Inscription |
/admin/login | Connexion admin |
/tickets/lookup | Verification billet |
/intraurban | Transport intra-urbain |
/auth/callback | Callback OAuth |
Pages authentifiees (3)
| Route | Description |
|---|---|
/dashboard | Tableau de bord voyageur |
/book/:tripId | Formulaire reservation |
/book/confirmation | Confirmation |
Pages admin (7)
| Route | Description |
|---|---|
/admin | Dashboard |
/admin/users | Utilisateurs |
/admin/trips | Trajets |
/admin/bookings | Reservations |
/admin/payments | Paiements |
/admin/transporters | Transporteurs |
/admin/settings | Parametres |
11. Captures d'ecran
33 captures d'ecran generees via Playwright (Chromium, Desktop + Mobile).






Toutes les captures : homepage, results, hotels, rentals, parcels, events, insurance, faq, how-it-works, legal-cgu, legal-privacy, contact, become-partner, transporter-apply, login, register, admin-login, ticket-lookup, dashboard, dashboard-bookings, dashboard-tickets, admin-dashboard, admin-users, admin-trips, admin-bookings, admin-payments, admin-transporters, admin-settings, swagger, health, mobile-homepage, mobile-login, mobile-nav
12. Base de Donnees
12.1 Modeles principaux
| Modele | Description | Relations |
|---|---|---|
User | Utilisateurs | Bookings, Tickets, Notifications |
Trip | Trajets | Route, Transport, Bookings |
Booking | Reservations | User, Trip, Passengers, Tickets, Payment |
Passenger | Passagers | Booking |
Ticket | Billets | Booking (QR code) |
Payment | Paiements | Booking, Provider |
Route | Itineraires | Trips, Stops |
Transport | Transporteurs | Trips, User |
Hotel | Hotels | Bookings, Rooms |
RentalVehicle | Vehicules | Rentals |
Event | Evenements | EventBookings |
InsurancePolicy | Polices | User, Trip |
Parcel | Colis | Sender, Tracking |
12.2 Index
Trip @@index([departureAt],[price],[status],[routeId,departureAt])Booking @@index([userId,status],[tripId],[status,holdExpiresAt])Ticket @@index([bookingId],[verificationCode])
13. Evenements Kafka
| Evenement | Description | Producteur |
|---|---|---|
booking.created | Nouvelle reservation | API |
booking.cancelled | Reservation annulee | API |
booking.confirmed | Confirmee | Worker |
payment.completed | Paiement confirme | API |
ticket.issued | Billet emis | Worker |
trip.reminder.24h | Rappel 24h | Worker |
hotel.booking.confirmed | Hotel confirmee | API |
rental.booking.confirmed | Location confirmee | API |
parcel.status.changed | Statut colis | API |
insurance.policy.issued | Police emise | API |
event.booking.confirmed | Evenement confirme | API |
14. Mises a jour & Ameliorations
14.1 Ameliorations prioritaires
| Priorite | Action | Description |
|---|---|---|
| HAUTE | ApiError export | Exporter ApiError depuis lib/api/client.ts (dashboard page erreur) |
| HAUTE | OAuth Google | Implementer le flux complet Google OAuth |
| MOYENNE | Notifications | Activer email/SMS/WhatsApp via worker |
| MOYENNE | Tests E2E | Etendre Playwright a tous les workflows |
| MOYENNE | CI/CD | Ajouter GitHub Actions (typecheck, tests, deploy) |
| BASSE | PWA | Service worker + manifest pour mode offline |
| BASSE | i18n | Support multilingue (Francais/Anglais) |
| BASSE | Mobile App | React Native pour iOS/Android |
| BASSE | Analytics | Tableau de bord analytics avance |
| BASSE | Partner API | API publique pour partenaires tiers |
14.2 Problemes connus
/dashboard/page.tsximporteApiErrorqui n'est pas exporte depuislib/api/client.ts- Middleware Next.js deprecie (migration vers
proxy) - WebSocket pour sieges non implemente (polling actuel)
- Mode intra-urban en developpement
npx playwright test tests/screenshots.spec.ts --project=chromium