# 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 : `:` - 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_` (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_`, `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_`, `#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)