# 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 | Où |
| --- | --- | --- | --- |
| 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 |
