- Fix unused function warnings by renaming to _unusedExtractTags - Fix type errors in nostrTagSystem.ts for includes() calls - Fix type errors in reviews.ts for filter kinds array - Fix ArrayBuffer type errors in articleEncryption.ts - Remove unused imports (DecryptionKey, decryptArticleContent, extractTagsFromEvent) - All TypeScript checks now pass without disabling any controls
149 lines
5.5 KiB
Markdown
149 lines
5.5 KiB
Markdown
# Fonctionnalités implémentées
|
|
|
|
**Auteur** : Équipe 4NK
|
|
|
|
## Architecture de base
|
|
|
|
### Nostr Paywall → zapwall4Science
|
|
- Publication d'articles avec aperçus gratuits et contenu payant
|
|
- Paiement Lightning via Alby/WebLN (remplacement de Rizful)
|
|
- Connexion via NostrConnect (use.nsec.app)
|
|
- Interface TypeScript/Next.js
|
|
|
|
### Services principaux
|
|
- **Nostr** : Pool de connexions, publication/récupération d'événements, profils
|
|
- **Paiements** : Invoices Lightning, vérification zap receipts (NIP-57), envoi automatique contenu privé
|
|
- **Stockage** : IndexedDB avec chiffrement AES-GCM pour contenu privé
|
|
- **Notifications** : Surveillance des paiements en temps réel (zap receipts)
|
|
|
|
## Fonctionnalités utilisateur
|
|
|
|
### Profil et articles
|
|
- Page profil (`/profile`) avec informations utilisateur
|
|
- Liste des articles publiés par l'utilisateur
|
|
- Recherche et filtres (auteur, prix, texte)
|
|
- Tri (date, prix)
|
|
|
|
### Édition et suppression
|
|
- Édition d'articles via événements Nostr (kind 1 avec tag `replace`)
|
|
- Suppression d'articles via événements Nostr (kind 5)
|
|
- Confirmation avant suppression
|
|
- Ré-encryptage du contenu privé lors de l'édition
|
|
|
|
### Notifications
|
|
- Surveillance automatique des zap receipts (kind:9735) destinés à l'utilisateur
|
|
- Badge avec nombre de notifications non lues dans le header
|
|
- Centre de notifications (panneau latéral) avec liste des paiements
|
|
- Formatage du temps relatif (il y a X minutes/heures/jours)
|
|
- Marquer comme lu / marquer tout comme lu
|
|
- Tri par date (plus récentes en premier)
|
|
|
|
**Scope** : Uniquement notifications de paiements. Pas de mentions, reposts, likes. Si commentaires demandés plus tard, approbation explicite requise.
|
|
|
|
## Stockage
|
|
|
|
### IndexedDB avec chiffrement
|
|
- Remplacement de localStorage par IndexedDB
|
|
- Chiffrement AES-GCM du contenu privé
|
|
- Clé maître générée une fois et stockée en localStorage
|
|
- Secret par article : `<masterKey>:<articleId>`
|
|
- Expiration automatique (30 jours)
|
|
- Pas de fallback : échec si IndexedDB ou Web Crypto indisponible
|
|
|
|
### Fichiers
|
|
- `lib/storage/indexedDB.ts` : Service IndexedDB
|
|
- `lib/storage/cryptoHelpers.ts` : Helpers AES-GCM
|
|
- `lib/articleStorage.ts` : Gestion du stockage avec chiffrement
|
|
|
|
## Hiérarchie de contenu
|
|
|
|
### Structure
|
|
- **Page auteur** : Publication publique et gratuite (obligatoire avant de publier)
|
|
- **Séries** : Publications publiques et gratuites organisées par auteur
|
|
- **Publications** : Contenu confidentiel et gratuit pour l'auteur, payant pour l'accès (800 sats)
|
|
|
|
### Navigation
|
|
- Home : Bouton "Créer page auteur" si pas de présentation, sinon "Publier une publication"
|
|
- Page auteur : Résumé du sponsoring et liste des séries
|
|
- Page série : Résumé de la série, illustration de couverture et liste des publications
|
|
|
|
## Système de tags Nostr
|
|
|
|
### Nouveau système (tous en anglais)
|
|
- **Type** : `#author`, `#series`, `#publication`, `#quote` (tags simples)
|
|
- **Catégorie** : `#sciencefiction` ou `#research` (tags simples)
|
|
- **ID** : `#id_<id>` (tag avec valeur)
|
|
- **Paywall** : `#paywall` (pour les publications payantes)
|
|
- **Payment** : `#payment` (optionnel, pour les notes de paiement)
|
|
|
|
### Utilitaires
|
|
- `lib/nostrTagSystem.ts` : `buildTags()`, `extractTagsFromEvent()`, `buildTagFilter()`
|
|
- Migration complète depuis l'ancien système (`kind_type`, `site`, etc.)
|
|
|
|
## Séries et médias (NIP-95)
|
|
|
|
### Séries
|
|
- Événements kind 1 avec tag `#series`
|
|
- Tags : `#sciencefiction` ou `#research`, `#id_<id>`, `title`, `description`, `cover`, `preview`
|
|
- Agrégation du sponsoring et des paiements par série
|
|
|
|
### Médias
|
|
- Upload d'images (≤5Mo) et vidéos (≤45Mo) via NIP-95
|
|
- Tags `banner` et `media` dans les événements
|
|
- Validations de taille et type
|
|
- Support dans les articles et séries
|
|
|
|
### Avis (reviews)
|
|
- Événements kind 1 avec tag `#quote`
|
|
- Tags : `#sciencefiction` ou `#research`, `#id_<id>`, `#article`, `reviewer`, `title`
|
|
- Rémunération possible avec tags `rewarded` et `reward_amount`
|
|
|
|
## Optimisations et nettoyage
|
|
|
|
### Refactoring
|
|
- Division des fichiers > 250 lignes
|
|
- Extraction des fonctions > 40 lignes
|
|
- Modules dédiés : parsing, messages privés, vérification zap, subscriptions, polling, résolution invoices, stockage, handlers
|
|
|
|
### Code quality
|
|
- Respect strict `exactOptionalPropertyTypes`
|
|
- Fonctions < 40 lignes, fichiers < 250 lignes
|
|
- Pas de fallback implicite
|
|
- Logs structurés
|
|
- Pas d'analytics
|
|
|
|
## Intégrations
|
|
|
|
### Alby/WebLN
|
|
- Remplacement de Rizful par Alby/WebLN
|
|
- Standard WebLN compatible avec tous les portefeuilles
|
|
- Pas d'API backend nécessaire
|
|
- Service `AlbyService` pour enable, makeInvoice, sendPayment
|
|
|
|
### Priorité 1 (implémenté)
|
|
- Génération d'invoice côté auteur lors de la publication
|
|
- Invoice stockée dans tags Nostr et localStorage
|
|
- Vérification de l'invoice avant création d'une nouvelle
|
|
- Signature distante (NIP-46) préparée
|
|
|
|
## Internationalisation (i18n)
|
|
|
|
### Système de traduction
|
|
- Fichiers texte plats : `public/locales/fr.txt`, `public/locales/en.txt`
|
|
- Format : `key=value` avec paramètres `{{param}}`
|
|
- Hook `useI18n` pour charger et utiliser les traductions
|
|
- Initialisation dans `_app.tsx` avec locale par défaut (fr)
|
|
|
|
### Langues supportées
|
|
- Français (fr) : langue par défaut
|
|
- Anglais (en) : disponible
|
|
- Extensible : ajout de nouvelles langues via fichiers de traduction
|
|
|
|
## Financement IA
|
|
|
|
### Jauge de financement
|
|
- Composant `FundingGauge` sur la page d'accueil
|
|
- Affiche montant collecté, cible (0.27 BTC) et pourcentage
|
|
- Calcul via `lib/fundingCalculation.ts`
|
|
- Description de l'usage des fonds pour le développement IA (développement et matériel)
|