story-research-zapwall/docs/architecture-principles.md
2026-01-07 01:51:26 +01:00

85 lines
4.3 KiB
Markdown

# Principes d'architecture logicielle
**Auteur** : Équipe 4NK
## Vue d'ensemble
Ce document décrit les principes d'architecture logicielle du projet. Toute modification doit respecter ces principes.
## Principes fondamentaux
### Persistance des données
* **IndexedDB comme source de vérité locale** : Toutes les données sont persistées dans IndexedDB côté utilisateur. IndexedDB constitue la source de vérité locale pour toutes les données de l'application.
* **IndexedDB en lecture uniquement pour l'interface** : L'interface utilisateur (composants React, pages) utilise uniquement IndexedDB en lecture. Aucune écriture directe dans IndexedDB ne doit être effectuée depuis l'interface utilisateur.
* **Écritures via le réseau Nostr** : Toutes les écritures et mises à jour de données passent par le réseau Nostr. L'interface ne doit jamais écrire directement dans IndexedDB.
* **Statut de publication** : Toute écriture en base de données (IndexedDB) doit inclure un statut `published` qui permet de gérer ultérieurement la publication (ok/ko). Ce statut permet de suivre l'état de synchronisation et de publication des données.
### Service Workers et tâches de fond
* **Service Workers pour les tâches de fond** : Toutes les tâches de fond sur les données sont effectuées avec des Service Workers. Les Service Workers gèrent la synchronisation, la mise à jour et le traitement asynchrone des données.
* **Service Worker pour les notifications** : Un Service Worker alimente la table des notifications. Il surveille les événements et met à jour IndexedDB avec les nouvelles notifications.
* **Service de lecture des notifications** : Les notifications sont lues par un service dédié qui détecte les nouvelles notifications dans la base de données (IndexedDB). Ce service est séparé du Service Worker qui alimente les notifications.
### Web Workers et écritures
* **Web Worker d'écriture** : Un Web Worker dédié gère toutes les écritures et modifications dans IndexedDB. L'interface utilisateur ne doit jamais écrire directement dans IndexedDB, mais doit passer par ce Web Worker.
* **Service de gestion des écritures** : Un service gère les écritures/mises à jour vers les WebSockets/API et vers le Web Worker d'écriture. Ce service orchestre la communication entre l'interface, le réseau (Nostr/WebSockets) et le Web Worker d'écriture.
### WebSockets et communication
* **Service de gestion des WebSockets** : Les WebSockets sont gérés par un service dédié qui communique avec les Service Workers. Ce service isole la logique de communication WebSocket et permet une gestion centralisée des connexions.
* **Séparation des responsabilités** : Le service WebSocket ne doit pas écrire directement dans IndexedDB. Il communique avec les Service Workers qui gèrent la persistance.
## Architecture des composants
```
Interface Utilisateur (React)
↓ (lecture uniquement)
IndexedDB
↑ (écriture via Web Worker)
Web Worker d'écriture
↑ (orchestration)
Service de gestion des écritures
↓ (réseau)
Service WebSocket
↓ (communication)
Service Workers
↓ (persistance)
IndexedDB
```
## Flux d'écriture
1. **Interface utilisateur** : Demande une écriture/mise à jour
2. **Service de gestion des écritures** : Reçoit la demande
3. **Service WebSocket** : Publie sur le réseau Nostr
4. **Service de gestion des écritures** : Envoie les données au Web Worker d'écriture
5. **Web Worker d'écriture** : Écrit dans IndexedDB avec statut `published`
## Flux de synchronisation
1. **Service Worker** : Déclenche la synchronisation périodique
2. **Service WebSocket** : Se connecte aux relais Nostr
3. **Service Worker** : Reçoit les événements
4. **Web Worker d'écriture** : Écrit les nouveaux événements dans IndexedDB
## Flux de notifications
1. **Service Worker** : Surveille les événements dans IndexedDB
2. **Service Worker** : Détecte les nouveaux événements concernant l'utilisateur
3. **Web Worker d'écriture** : Écrit les notifications dans IndexedDB
4. **Service de lecture des notifications** : Détecte les nouvelles notifications
5. **Interface utilisateur** : Affiche les notifications
## Respect des principes
Toute modification du code doit respecter ces principes. En cas de doute, consulter ce document et les règles de qualité dans `.cursor/rules/quality.mdc`.