Aller au contenu principal

Architecture — Vue d'ensemble

Schéma général

┌─────────────────────────────────────────────────────┐
│ Windows Desktop │
│ │
│ ┌─────────────┐ ┌──────────────────────┐ │
│ │ Outlook │◄──COM──│ PowerShell (STA) │ │
│ │ (MAPI) │ │ │ │
│ └─────────────┘ │ server.ps1 │ │
│ │ ├── Config.ps1 │ │
│ ┌─────────────┐ │ ├── Catalog.ps1 │ │
│ │ bdd/ │◄──R/W──│ ├── Leads.ps1 │ │
│ │ ├─leads/ │ │ ├── Mail.ps1 │ │
│ │ └─quotes/ │ │ ├── Router.ps1 │ │
│ └─────────────┘ │ └── Listener.ps1 │ │
│ │ │ │ │
│ │ TcpListener:8731 │ │
│ └──────────┬───────────┘ │
│ │ HTTP │
│ ┌──────────▼───────────┐ │
│ │ Navigateur │ │
│ │ localhost:8731 │ │
│ │ │ │
│ │ index.html │ │
│ │ app.js (état) │ │
│ │ organisms/ │ │
│ │ molecules/ │ │
│ │ atoms/ │ │
│ └──────────────────────┘ │
└─────────────────────────────────────────────────────┘

Flux d'une requête HTTP

  1. Le navigateur envoie une requête HTTP sur localhost:8731
  2. Listener.ps1 (TcpListener) accepte la connexion TCP
  3. Http.ps1 parse les headers et le body brut
  4. Router.ps1 (Handle-Request) dispatche vers le bon handler
  5. Le handler appelle les fonctions métier (Leads.ps1, Mail.ps1, etc.)
  6. La réponse JSON est sérialisée et renvoyée au navigateur

Ordre de chargement des modules

server.ps1 dot-source les modules dans cet ordre précis — l'ordre compte :

Config.ps1    → variables globales ($Root, $BddDir, $Port…)
Json.ps1 → Read-Json, Write-Json, ConvertTo-Hashtable
Catalog.ps1 → Get-Catalog, Find-Matches
Outlook.ps1 → Get-Outlook (cache COM), Invoke-LeadRefresh
Leads.ps1 → Get-AllLeads, Get-LeadDetail, Update-Lead…
Mail.ps1 → Invoke-Scan, Invoke-GenerateQuote, Invoke-Send
Http.ps1 → New-JsonResponse, Read-HttpRequest, Parse-Query
Router.ps1 → Handle-Request, Invoke-*Routes
Listener.ps1 → Start-LeadServer (boucle principale)

Contraintes fondamentales

ContrainteRaison
Mode STA obligatoireLes objets COM Outlook ne sont pas thread-safe — STA garantit un seul thread d'appartenance
Pas de HttpListener .NETHttpListener requiert des privilèges élevés ou une réservation netsh ; TcpListener sur loopback n'en a pas besoin
JSON flat filesPas de dépendance externe (SQLite, etc.), déploiement xcopy
Vanilla JSPas de Node.js, pas de build step, zéro dépendance runtime côté frontend