Nicolas Cantu fd26c42a17 Replace use.nsec.app with nos2x extension (NIP-07)
- Update NostrConnectService to use nos2x (window.nostr) by default
- Fallback to NostrConnect bridge only if nos2x is not available
- Update NostrRemoteSigner to use window.nostr.signEvent() for signing
- Add TypeScript definitions for NIP-07 window.nostr API
- Update documentation to reflect nos2x as primary authentication method
- Remove default use.nsec.app bridge URL
- All TypeScript checks pass
2025-12-27 23:48:16 +01:00

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 nos2x extension (NIP-07) ou NostrConnect bridge (NIP-46)
- 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)