Vue d'ensemble·6 min de lecture·1,069 mots

Vue d'ensemble du projet

wari.pro — Project Overview

Pitch

wari.pro — l'index officiel et action-able du commerce ouest-africain, formel et informel.

Marketplace SaaS B2B2C pour le Burkina Faso et l'Afrique de l'Ouest. Modèle business : abonnements vendus aux prestataires (gérants) qui gèrent leur vitrine et servent leurs clients finaux via le web ou l'app mobile.

3 piliers de la promesse produit :

  1. Découverte garantie — sortir du bouche-à-oreille Snapchat / WhatsApp.
  2. Action garantie — réservation ferme, commande livrée avec suivi.
  3. Notifications qui convertissent — Stories vitrines + push abonnés.

Repository structure

Monorepo logique (mais sans tool monorepo : pas de workspaces npm, pas de Turbo). Deux parts indépendantes au build :

PartPathTypeStack
backendapp/web (full-stack Next.js)Next.js 16.2 + Prisma 7.6 + PostgreSQL 15 + Redis + MinIO
mobilemobile-staging/mobile (Expo)Expo SDK 54 + RN 0.81 + Expo Router v6

⚠️ mobile-staging/ sur le VPS est un miroir de la source de vérité dev ~/DEVELOPPEMENT/ sur la machine fabrice (192.168.1.152, accessible via reverse SSH tunnel port 2222). Les commits mobile (wari-mobile GitHub repo) partent de cette machine.

À la racine cohabitent aussi :

  • docker-compose.yml — orchestration prod/staging (postgres + redis + minio + nextjs + typesense)
  • _bmad/ + _bmad-output/ — framework agile BMAD (44 skills .claude/skills/bmad-*)
  • tests-pratiques/ — fixtures sessions QA TestFlight (ex. cils-et-or/)
  • Captures/ — screenshots / artifacts visuels
  • docs/ — la documentation projet (ce dossier)

Tech stack résumée

Backend (app/)

CoucheChoix
FrameworkNext.js 16.2.2 — App Router, Turbopack
LangageTypeScript strict
ORMPrisma 7.6 + PostgreSQL 15
AuthJWT custom avec josePAS NextAuth (le pkg next-auth@5.0.0-beta.30 est listé mais non utilisé pour les flows auth)
CacheRedis 7
Stockage médiasMinIO self-hosted, proxié via Nginx sur /medias/
EmailResend
SMSVonage (partiel)
Pushexpo-server-sdk + FCM
SearchTypesense 0.25.2 (Docker) + embeddings CLIP (HuggingFace)
AIGoogle Generative AI (@google/generative-ai Gemini) + Anthropic Vision (recherche image V1)
AnalyticsPostHog Cloud
MonitoringSentry (@sentry/nextjs)
State builderZustand 5 + Immer
Drag & drop@dnd-kit
ValidationZod 4
TestsVitest 3
InfraDocker Compose, Nginx, VPS Debian 13

Mobile (mobile-staging/)

CoucheChoix
PlateformesiOS + Android (jsEngine Hermes, mobile-only — pas de cible web)
SDKExpo 54
RN0.81.5
Routerexpo-router v6 (file-based)
StateZustand 5 (16 stores)
Data@tanstack/react-query 5
TestsJest 29 + jest-expo 55 + @testing-library/react-native 13
Pushexpo-notifications (FCM Android, APNs iOS)
Cameraexpo-camera (scan code-barres + recherche image)
Storage@react-native-async-storage + expo-secure-store
i18ni18next + react-i18next + expo-localization
Iconsphosphor-react-native (lib unique, voir DEC-133/134)
MonitoringSentry RN
BuildsEAS Build (channels development/preview/production)
Bundle IDiOS pro.wari.mobile, slug Expo wari-mobile

Architecture type

AspectPattern
Multi-tenancyBackend : tous les modèles portent tenantId. Production = sous-domaine *.wari.pro → tenant résolu via host. Dev = ?tenant=<slug>.
AuthCookie superapp_session httpOnly (web) ET Bearer JWT (mobile) — même secret NEXTAUTH_SECRET, même payload { userId, role, tenantId? }. Helper unique getSessionFromRequest(req).
Builder vitrineSnapshots JSONB en DB. isDirty calculé via fast-deep-equal. Pages publiques = snapshot PUBLISHED ; preview = DB live via ?preview=live. Pages applicatives (Boutique, Services) = type APPLICATIVE non persistées.
API mobile186 routes sous /api/mobile/* — séparées des routes web admin pour ne pas casser le contrat web en touchant le mobile (DEC-107).
Notif Engine V1Polymorphic abonnement (NotifEvent + NotifDelivery + NotifCanal enum). Dispatch Push/Email/SMS/WhatsApp lien. Broadcast gérant + Suivre client.
Modules tenantTenantModule.nom libre : catalogue, services, rdv, restaurant, evenements. La TabBar mobile gérant change selon les modules actifs.
Niveaux d'accès vitrine4 valeurs : PUBLIC / CONNEXION / SUR_DEMANDE / INVITATION (DEC-211/212/214/215). Seul INVITATION est strictement invisible en LIST.
StoriesModel VitrineStory (V1 ImageStory) + cron expiration + push abonnés. Bandeau client + viewer ; composer gérant.

Volumétrie code

MétriqueValeur
Modèles Prisma72
Enums Prisma36
Migrations Prisma73
Routes API totales280
Routes /api/mobile/*186
Components backend (.tsx)33 (src/components/)
Components mobile (.tsx)239 (components/)
Stores Zustand mobile16 (store/)
Hooks mobile~60 (hooks/)
Écrans mobile (incl. nested)≥ 50 routes file-based
Features livréesWP-001 → WP-232
Bugs résolusBUG-001 → BUG-134
Décisions techniquesDEC-001 → DEC-223

État actuel (Mai 2026)

  • iOS TestFlight : build natif 4 publié, ~17 OTA prod livrées depuis ce build.
  • VPS prod : 51.91.57.176 (Debian 13). Nginx + Docker Compose. Containers postgres, redis, minio, nextjs, typesense.
  • Domaine : wari.pro + *.wari.pro (catch-all wildcard pour vitrines tenant).
  • Repos : github.com/ouattaradfabrice/superApp_V1 (backend) + github.com/ouattaradfabrice/wari-mobile (mobile).
  • Audit complet 2026-05-20 (7 angles) : score consolidé 5.5/10. 10 P0 sécu+ops livrés dans sprint hardening (JWT fail-closed, Open Redirect, OTP rate-limit, MIME allowlist, 8 indexes Prisma, backups MinIO+Postgres, vitest v3 + 8 tests lib, Dockerfile prod multi-stage).
  • BMAD installé : framework agile AI-driven (analyst→pm→architect→po→sm→dev→qa) à utiliser pour cadrer epics significatifs (rester sur méthode actuelle pour bugfix).

Liens vers la documentation détaillée