Files
siop2/docs/03-architecture/architecture.md
2026-07-15 21:26:27 +01:00

3.7 KiB
Raw Blame History

Architecture — SIOP V2

Rôle de ce document (playbook) : la vue d'ensemble en 3 niveaux (méthode C4 simplifiée : contexte → conteneurs → composants). Les décisions structurantes sont tracées en ADR (adr/). Mis à jour à chaque release.

Niveau 1 — Contexte

  Gardien (Karim) ──scan QR──▶ ┌─────────────────┐ ◀──navigateur── Bureau (Salma, Nadia, direction)
                               │                 │
  Technicien (Ahmed) ─mobile─▶ │    SIOP V2      │ ──emails──▶ demandeurs / alertes stock
                               │                 │
  Notices, historiques ──────▶ └─────────────────┘
        (ingestion RAG, R5)

Niveau 2 — Conteneurs

┌───────────────────────────── Dokploy (Docker) ─────────────────────────────┐
│                                                                            │
│  apps/web ── nginx ──/api──▶ apps/api (NestJS) ──▶ PostgreSQL 18           │
│  (React 19, statique)        │  auth JWT, permissions, métier              │  (+ pgvector, PostGIS)
│                              │──▶ Redis (BullMQ : jobs préventif, R2)      │
│  apps/mobile (Expo, R4) ────▶│──▶ MinIO (FileStorage : photos, documents)  │
│        /sync                 │                                             │
│  apps/ai (FastAPI, R5) ◀─────┘ (lecture métier via API ; écrit seulement   │
│        RAG, embeddings          les embeddings pgvector)                   │
└────────────────────────────────────────────────────────────────────────────┘

Règles de dépendance : toutes les écritures métier passent par l'API NestJS ; le web et le mobile ne parlent qu'au contrat OpenAPI ; MinIO n'est accédé qu'à travers FileStorage.

Niveau 3 — Composants de l'API (état R0)

apps/api/src
├── auth/          JWT (access), guard global « fermé par défaut », @Public(),
│                  démo-login (module conditionnel DEMO_MODE — ADR-002)
├── permissions/   matrice rôles × objets × droits (en base, cache 60 s),
│                  @RequirePermission(objet, droit) + PermissionsGuard
├── users/         profils (R0 : lecture du profil courant ; gestion complète R1)
├── health/        /health (base, Redis, MinIO) — public
├── prisma/        PrismaService (client généré)
└── common/        zodToOpenApi, ZodValidationPipe, filtres d'erreurs

Chaque release ajoute ses modules (R1 : locations/assets/categories/teams ; R2 : work-orders/requests/preventive ; …) — le document est enrichi à chaque clôture.

La « règle d'or » du contrat

packages/shared (Zod) ──zodToOpenApi──▶ docs/openapi.json (committée)
                                            │ openapi-typescript
                                            ▼
                             clients typés web / mobile (générés)

Toute modification d'API régénère spec + clients dans le même commit ; la CI (ci-contract) échoue sur le moindre diff. Le front ne peut structurellement pas dériver.

Environnements

Env DEMO_MODE Données
dev local true seed démo Docker local (pnpm infra:up)
démo en ligne true (+ double verrou) seed démo Dokploy
production client absent réelles Dokploy