story-research-zapwall/features/storage-improvement-implementation.md
2025-12-22 09:48:57 +01:00

159 lines
5.6 KiB
Markdown

# Implémentation de l'amélioration du stockage du contenu privé
**Date** : Décembre 2024
**Status** : ✅ Complété
## Objectif
Remplacer localStorage par IndexedDB pour le stockage du contenu privé des articles, offrant une meilleure fiabilité, une plus grande capacité de stockage et la gestion de l'expiration des données.
## Fonctionnalités implémentées
### 1. Service IndexedDB
- Service IndexedDB complet avec gestion d'initialisation
- Support des index pour les recherches (createdAt, expiresAt)
- Gestion des erreurs
- Utilisation exclusive d'IndexedDB (pas de fallback)
### 3. Gestion de l'expiration
- Expiration automatique des données (30 jours par défaut)
- Suppression automatique des données expirées lors de la récupération
- Méthode pour nettoyer toutes les données expirées
### 4. Migration des fonctions
- Toutes les fonctions de stockage sont maintenant async
- Compatibilité avec l'API existante (même signature, mais async)
- Migration transparente pour le code existant
## Fichiers créés
### `lib/storage/indexedDB.ts`
Service IndexedDB complet :
- `IndexedDBStorage` : Classe pour gérer IndexedDB
- `storageService` : Instance exportée de IndexedDBStorage
- Méthodes : `set()`, `get()`, `delete()`, `clearExpired()`
- Gestion de l'expiration automatique
- Utilisation exclusive d'IndexedDB (pas de fallback)
**Caractéristiques** :
- Base de données : `nostr_paywall`
- Version : 1
- Object store : `article_content`
- Index : `createdAt`, `expiresAt`
### `features/storage-improvement-implementation.md`
Documentation de l'implémentation.
## Fichiers modifiés
### `lib/articleStorage.ts`
- `storePrivateContent()` : Maintenant async, utilise `storageService`
- `getStoredPrivateContent()` : Maintenant async, utilise `storageService`
- `getStoredInvoice()` : Maintenant async
- `removeStoredPrivateContent()` : Maintenant async
- Expiration par défaut : 30 jours
**Changements** :
- Remplacement de `localStorage` par `storageService`
- Ajout de l'expiration automatique (30 jours)
- Toutes les fonctions deviennent async
### `lib/articlePublisher.ts`
- Mise à jour pour utiliser les nouvelles fonctions async
- Suppression des méthodes privées dupliquées
- Utilisation directe des fonctions exportées de `articleStorage`
### `lib/invoiceResolver.ts`
- `getStoredInvoice()` : Maintenant async avec `await`
### `lib/paymentPolling.ts`
- `getStoredPrivateContent()` : Maintenant async avec `await`
## Avantages d'IndexedDB vs localStorage
### IndexedDB
- **Capacité** : Plusieurs Go vs ~5-10 MB pour localStorage
- **Performance** : Meilleure pour les grandes quantités de données
- **Structured** : Base de données structurée avec index
- **Transactions** : Support des transactions
- **Types** : Support des types complexes (Blob, ArrayBuffer, etc.)
### localStorage
- **Simplicité** : API plus simple (clé-valeur)
- **Compatibilité** : Meilleure compatibilité navigateur (mais IndexedDB est maintenant bien supporté)
- **Synchronisation** : API synchrone (plus simple mais peut bloquer)
## Gestion de l'expiration
### Expiration par défaut
- **Durée** : 30 jours (configurable via `DEFAULT_EXPIRATION`)
- **Vérification** : Automatique lors de la récupération
- **Nettoyage** : Les données expirées sont supprimées automatiquement
### Expiration personnalisée
Les données peuvent être stockées avec une expiration personnalisée :
```typescript
await storageService.set(key, data, customExpirationInMs)
```
## Exigence IndexedDB
L'application nécessite IndexedDB pour fonctionner :
- Si IndexedDB n'est pas disponible, une erreur sera levée
- IndexedDB est supporté par tous les navigateurs modernes
- Pas de fallback vers localStorage
## Migration des données existantes
Les données existantes dans localStorage restent accessibles :
- Les nouvelles données sont stockées dans IndexedDB (ou localStorage en fallback)
- Les anciennes données dans localStorage peuvent être lues (si nécessaire)
- Pas de migration automatique nécessaire (les données anciennes seront progressivement remplacées)
## Impact
### Utilisateur
- Stockage plus fiable et performant
- Pas de changement visible dans l'interface
### Technique
- Meilleure gestion du stockage
- Expiration automatique des données
- Support de plus grandes quantités de données
- Code plus robuste avec fallback
## Limitations et améliorations futures
### Limitations actuelles
- Expiration fixe à 30 jours (pas de configuration utilisateur)
- Pas de nettoyage périodique automatique (seulement lors de la récupération)
- Nécessite IndexedDB (pas de fallback)
### Améliorations possibles
- **Migration automatique** : Migrer les données localStorage vers IndexedDB au premier chargement
- **Nettoyage périodique** : Tâche de nettoyage périodique pour supprimer les données expirées
- **Configuration** : Permettre à l'utilisateur de configurer l'expiration
- **Compression** : Compresser les données avant stockage pour économiser l'espace
- **Chiffrement** : Chiffrer les données sensibles avant stockage
## Tests recommandés
1. **Stockage** :
- Stocker du contenu privé
- Vérifier qu'il est stocké correctement
- Vérifier qu'il peut être récupéré
2. **Expiration** :
- Stocker avec expiration courte
- Attendre l'expiration
- Vérifier que les données sont supprimées
3. **IndexedDB requis** :
- Vérifier que l'application fonctionne avec IndexedDB
- Vérifier que les erreurs sont gérées correctement si IndexedDB n'est pas disponible
4. **Performance** :
- Tester avec un grand nombre d'articles
- Vérifier que les performances sont bonnes
- Vérifier qu'il n'y a pas de blocage de l'UI