Aller au contenu principal

La Cafête — Plateforme de Gestion Multi-Tenant

La Cafête est une plateforme de gestion de buvette et cantine scolaire/entreprise avec système de carte prépayée QR. Elle permet de gérer les rechargements de carte, les ventes de produits, les réservations de repas, les scan de QR code, les cartes liées parent-enfant, la gestion de stock, et dispose d'un système complet de détection d'anomalies et de notifications multi-canal.

Version

Cette documentation couvre la v1.0 de l'API La Cafête.


Architecture

Vue d'ensemble

┌─────────────────────────────────────────────────────────────────┐
│ Frontend (React + Vite) │
│ Dashboard Admin │ App Détenteur (Flutter) │ PWA La Cafête │
└───────────────────────────────┬─────────────────────────────────┘
│ HTTPS / REST
┌───────────────────────────────▼─────────────────────────────────┐
│ Backend (Rust + Axum) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ API │ │ Auth │ │ Persist. │ │ Worker │ │
│ │ (Axum) │ │ (JWT) │ │ (SQLx) │ │ (Apalis) │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Storage │ │ Notif. │ │ Events │ │ Domain │ │
│ │(Local/S3)│ │(Multi) │ │ (Outbox) │ │ (Pure) │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└────────────┬──────────────────────┬──────────────────────────────┘
│ │
┌────────────▼────────┐ ┌──────────▼──────────┐
│ PostgreSQL │ │ Redis + MinIO S3 │
│ (Schema Multi-Tenant)│ │ (Jobs + Assets) │
└─────────────────────┘ └─────────────────────┘

Isolation Multi-Tenant

La Cafête utilise le modèle schema-per-tenant de PostgreSQL :

NiveauDescriptionSchemaTables clés
SystèmePlateforme, organisations, utilisateurs adminpublicorganizations, platform_users, roles, permissions
OrganisationSites, utilisateurs, cartes, transactionsorg_{slug}sites, tenant_users, cards, card_transactions, products

Chaque organisation possède son propre schéma PostgreSQL (org_{slug}). Le schéma public stocke les données globales du système.

Principes clés

PrincipeDescription
Ledger immuableToutes les transactions financières sont enregistrées dans card_transactions (source de vérité). Aucun update ou delete n'est autorisé.
RBAC dynamiquePermissions composables assignées via des rôles. Aucune permission codée en dur.
IdempotenceToute mutation financière requiert un Idempotency-Key pour garantir l'atomicité.
Atomicité DBLe solde d'une carte n'est JAMAIS modifié directement — passe par la fonction fn_apply_card_transaction().
Transactional OutboxLes événements sont d'abord écrits en DB puis consommés de manière asynchrone (garantie at-least-once).
Signature QR Ed25519Les cartes sont identifiées par QR code signé. Le système supporte la rotation des clés sans interruption.
Scan QR codeDétenteurs et caissiers peuvent scanner les QR codes depuis l'application mobile ou le dashboard.
Cartes liées parent-enfantLes porteurs peuvent lier des cartes enfants pour gérer les budgets familiaux.
Gestion de stockSuivi des entrées/sorties, détection des produits périmés, seuils d'alerte.
Multi-langueL'interface est disponible en Français et en Anglais.

Niveaux d'accès

Système vs Organisation

La Cafête définit deux niveaux d'accès complètement séparés :

NiveauUtilisateursPermissionsRoutes
Système (Platform)Administrateurs N2Gérer les organisations, utilisateurs platform, rôles système/admin/system/*
Organisation (Tenant)Admin N1, Superviseur, Caissier, Vendeur, PorteurOpérer dans l'organisation/admin/org/*, /cards/*, /transactions/*

Schéma des autorisations

Platform (N2) ──────────────────────────────────────
│ └── super_admin : toutes les permissions
│ └── org_viewer : consultation orgs + stats globales
│ └── support_agent : support limité

└── Contexte JWT ──► Organisation (org_id) ────────
│ └── admin_n1 : gestion complète org
└── supervisor : supervision + correction
└── cashier : encaissement
└── seller : vente produits
└── card_holder : porteur (mobile)

Démarrage rapide

# 1. Cloner et démarrer l'infrastructure
git clone https://github.com/lescale-africaine/caffette
cd caffette
docker compose up -d

# 2. Configurer l'environnement
cp .env.example .env
# Éditer .env avec vos secrets (JWT keys, credentials SMTP, etc.)

# 3. Compiler et lancer l'API
cargo build --workspace
cargo run -p caffette-api

# 4. Lancer le worker (dans un autre terminal)
cargo run -p caffette-worker

# 5. Lancer le dashboard frontend
cd apps/dashboard && npm install && npm run dev

Vérification

curl http://localhost:3500/healthz
# {"status":"ok","service":"caffette-api","version":"0.1.0"}

Organisation de la documentation

SectionContenu
GuideConcepts, authentification, permissions, notifications, erreurs
API — AuthAuthentification et gestion de sessions
API — MeProfil et préférences de l'utilisateur connecté
API — CardsGestion des cartes, rechargement, transactions
API — ProductsCatalogue produits, catégories, stocks
API — RéservationsRéservation de repas et plannings
API — TransactionsHistorique et recherche de transactions
API — PaiementsSessions de paiement et validation
API — StatistiquesTableaux de bord et rapports
API — SitesPoints de vente et configuration
API — NotificationsTemplates, canaux, envois
API — ParamètresConfiguration organisation, seuils d'anomalie
API — SystèmeAdministration plateforme, organisations, rôles
Flows métierDiagrammes et descriptions des parcours UC-01 à UC-11
OpérationsGuides pour l'exploitation : rôles, provisioning, jobs, monitoring

Support