Commit Graph
18 Commits
Author SHA1 Message Date
Claude 55a1809e71 Fix: Chargement automatique SQLite/PostgreSQL
CORRECTIF URGENT: L'application chargeait toujours SQLite même avec
PostgreSQL configuré, causant une perte apparente de toutes les données.

Ajout de database-loader.js qui détecte automatiquement:
- DB_TYPE=postgres → PostgreSQL
- DATABASE_URL=postgresql:// → PostgreSQL
- Sinon → SQLite

Tous les routes et services mis à jour pour utiliser database-loader
au lieu de charger directement database.js.

Les données ne sont PAS perdues, elles sont dans PostgreSQL.
L'application se reconnectera correctement après redémarrage.

Fichiers modifiés:
- config/database-loader.js (nouveau)
- server.js
- routes/*.js (11 fichiers)
- services/*.js (2 fichiers)
2025-11-14 09:50:21 +00:00
Claude 8e4a96ec97 MIGRATION: PostgreSQL + Docker - Solution complète RSS
🎯 Objectif: Résoudre définitivement le problème d'affichage RSS

Problème analysé:
- Articles récupérés (logs: "18 nouveaux") mais jamais affichés
- SQLite avec multiples DBs impossibles à déboguer
- Concurrence limitée, pas de logs SQL natifs
- Impossible de savoir quelle DB est vraiment utilisée

Solution: Migration complète vers PostgreSQL + Docker

📦 Fichiers ajoutés/modifiés:

**Docker & Configuration**
- docker-compose.yml: Ajout service PostgreSQL (port 5499)
- Dockerfile: Remplacement sqlite par postgresql-client
- init-db.sql: Script d'initialisation PostgreSQL
- .env.example: Variables d'environnement PostgreSQL

**Code Base de Données**
- config/database-postgres.js: Nouvelle couche PostgreSQL
  - Utilise pg (node-postgres) avec pool de connexions
  - Conversion SERIAL pour auto-increment
  - Conversion TIMESTAMP pour dates
  - Gestion transactions avec BEGIN/COMMIT
  - Support DATABASE_URL

**Migration**
- scripts/migrate-sqlite-to-postgres.js:
  - Migration automatique SQLite → PostgreSQL
  - Respect ordre des foreign keys
  - Conversion types SQLite → PostgreSQL
  - Reset des séquences SERIAL
  - Gestion des erreurs et rollback

**Documentation**
- MIGRATION-POSTGRESQL.md: Guide complet
  - Pourquoi PostgreSQL vs SQLite
  - Étapes de migration détaillées
  - Configuration Docker
  - Backup/Restore PostgreSQL
  - Monitoring et performance
  - Dépannage complet

**Dépendances**
- package.json: Ajout pg@^8.11.3

📊 Architecture PostgreSQL:

```yaml
postgres:
  port: 5499:5499 (personnalisé)
  user: noteflow
  database: noteflow
  volume: postgres_data (persistant)
  healthcheck: pg_isready

app:
  depends_on: postgres (avec healthcheck)
  DATABASE_URL: auto-configurée
  Connexion: via nom de service 'postgres'
```

🔧 Utilisation:

1. **Installer dépendances:**
   ```bash
   npm install
   ```

2. **Activer PostgreSQL:**
   ```bash
   cp config/database-postgres.js config/database.js
   ```

3. **Démarrer PostgreSQL:**
   ```bash
   docker-compose up -d postgres
   ```

4. **Migrer données:**
   ```bash
   SQLITE_PATH=/path/to/notes.db node scripts/migrate-sqlite-to-postgres.js
   ```

5. **Démarrer app:**
   ```bash
   docker-compose up -d
   ```

✨ Avantages PostgreSQL:

✅ Concurrence MVCC (pas de verrous globaux)
✅ Une seule DB (pas de confusion)
✅ Logs SQL natifs (debuggable)
✅ Transactions robustes
✅ Production-ready
✅ Monitoring intégré
✅ Performance supérieure

🎯 Résultat attendu:

Le problème RSS sera DÉFINITIVEMENT résolu car:
- Une seule source de vérité (PostgreSQL)
- Logs clairs pour voir les INSERT
- Pas de problème de concurrence
- Frontend et backend sur la même DB
- Debuggable en temps réel

Les articles du 14 novembre (et suivants) seront visibles!

📚 Documentation complète dans MIGRATION-POSTGRESQL.md
2025-11-14 08:23:22 +00:00
Claude 735b93a69f Feature: Gestion événements toute la journée et édition RDV 2025-11-12 22:03:32 +00:00
Claude b36525919f Feature: Affichage tags et icône priorité dans les cartes notes
Ajout de deux nouvelles fonctionnalités pour les notes:

1. Affichage des tags dans les cartes repliées:
- Les tags sont maintenant visibles dans les cartes de notes sans avoir à les ouvrir
- Badge avec icône TagIcon et nom du tag
- Chargement automatique des tags depuis la base de données

2. Icône de priorité cliquable:
- Bouton "!" en haut à droite de chaque carte de note
- Rouge (!) quand la note est prioritaire (toujours visible)
- Gris clair (!) quand non prioritaire (visible au hover)
- Toggle au clic pour marquer/démarquer comme prioritaire
- Les notes prioritaires sont triées en premier

Backend:
- Route PATCH /api/notes/:id/priority pour toggle la priorité
- Modification GET /api/notes pour charger tags et priority
- Tri par priority DESC, updated_at DESC
- Migration automatique pour ajouter colonne priority
- Index pour performance des requêtes de tri

Frontend:
- Interface Note étendue avec tags et priority
- Méthode togglePriority dans NotesService
- Affichage conditionnel de l'icône (toujours visible si prioritaire)
- Empêche le clic sur l'icône d'ouvrir la note (stopPropagation)

Migration:
- Ajout automatique de la colonne priority (INTEGER DEFAULT 0)
- Création d'index idx_notes_priority pour performance
- Fichier de migration 002_add_priority.sql créé pour référence
2025-11-12 21:41:34 +00:00
Claude 0e8b36e1d7 Fix critique: Système de notes complètement refondu pour fonctionner
Problème majeur résolu:
- L'éditeur de notes réinitialisait le contenu à chaque modification
- Causé par dangerouslySetInnerHTML qui forçait React à synchroniser
- Résultat: impossible d'éditer les notes correctement

Solution:
- Suppression de dangerouslySetInnerHTML du RichTextEditor
- Conservation du useEffect avec deps vides pour initialisation unique
- Utilisation du key prop pour forcer remount lors du changement de note
- Éditeur maintenant complètement "uncontrolled"

Migration complète Google Calendar vers OAuth 2.0:
- Remplacement de l'API Key simple par OAuth 2.0 (Client ID + Secret)
- Nouvelle table google_oauth_tokens pour stocker les tokens
- Routes OAuth:
  * GET /api/calendar/auth-url - Génère l'URL d'authentification
  * GET /api/calendar/oauth-callback - Callback OAuth avec échange de code
  * GET /api/calendar/auth-status - Vérifier le statut de connexion
  * POST /api/calendar/disconnect - Déconnecter Google
- Gestion automatique du rafraîchissement des tokens expirés
- Interface utilisateur mise à jour:
  * Champs Client ID et Client Secret
  * Indicateur de statut de connexion (connecté/non connecté)
  * Bouton "Se connecter avec Google" ouvrant popup OAuth
  * Bouton "Déconnecter"
  * URI de redirection affichée pour configuration Google Cloud Console
- Synchronisation maintenant avec calendrier principal de l'utilisateur
- Accès complet aux données privées du calendrier

Architecture:
- CalendarService.ts: Nouvelles méthodes getAuthUrl(), getAuthStatus(), disconnect()
- Settings: Ajout de google_client_id et google_client_secret
- Popup OAuth avec communication window.postMessage
- Gestion d'erreur avec re-authentification automatique si token expiré
2025-11-12 10:00:33 +00:00
Claude 4425695b4f Feature: Système de tags et liste automatique des modèles OpenRouter
Ajouts majeurs:
- Système de tags complet pour les notes
  * Table note_tags en base de données avec indexes
  * API REST pour CRUD des tags (GET/POST/DELETE)
  * UI avec onglet Tags dans l'éditeur de notes
  * Badges cliquables avec icônes et suppression au survol
  * Modal pour ajouter des tags

- Liste automatique des modèles OpenRouter
  * Nouvelle route API /api/openrouter/models
  * Cache des modèles avec rafraîchissement automatique (1h)
  * Dropdown dans l'admin avec tous les modèles disponibles
  * Bouton "Actualiser" pour forcer le refresh
  * Affichage du nom et description de chaque modèle
  * Fallback sur input manuel si pas de clé API

Améliorations UI:
- Ajout de dates de création et modification dans les notes
- Affichage des dates dans les cartes et l'éditeur
- Format français pour toutes les dates
- Onglets passés de 4 à 5 colonnes pour inclure Tags
- Animation de chargement sur le bouton refresh des modèles

Architecture:
- Nouveau service TagsService.ts pour la gestion des tags
- Nouveau service OpenRouterService.ts pour l'API OpenRouter
- Nouvelles routes openrouter.routes.js
- Support Select component pour les dropdowns
- Modals InputModal utilisés pour les tags
2025-11-12 09:47:47 +00:00
Claude 702d0c2088 Feature: Support multi-images, Google Calendar et correction RTL
Images multiples :
- Ajout table note_images dans la base de données
- Routes POST/GET/DELETE /api/notes/:id/images
- Dossier uploads/images séparé pour les images
- Support de plusieurs images par note

Google Calendar :
- Ajout table calendar_events
- Routes /api/calendar pour sync et récupération des événements
- Box Rendez-vous dans l'interface avec affichage des événements à venir
- Configuration Google Calendar dans l'admin (API key et Calendar ID)
- Synchronisation manuelle avec Google Calendar API
- Installation package googleapis

Corrections :
- Fix RichTextEditor: ajout dir="ltr" pour empêcher l'écriture RTL
- Fix Image type conflict (lucide-react vs Note interface)
- Ajout original_name à l'interface Image pour compatibilité

Interface :
- Box Rendez-vous empilée avec Todos et RSS dans la colonne droite
- Nouvel onglet Google Calendar dans l'administration
- Bouton "Synchroniser" pour rafraîchir les événements
2025-11-12 09:11:11 +00:00
Claude 7354818d3e UX: Titre 'À faire' + Source RSS + Tri todos + Notifications internes
1. Titre 'À faire' au lieu de 'Quick Tasks'
   - Changé public/index.html ligne 126
   - Meilleure localisation française

2. Affichage source RSS au lieu du modèle IA
   - Ajout colonne feed_title à rss_summaries (migration auto)
   - Backend stocke feed_title lors de la génération
   - GET /api/rss/summaries retourne feed_title
   - Frontend affiche 📰 Source + 📅 Date au lieu du modèle
   - Plus pertinent pour l'utilisateur

3. Tri automatique des todos : actives en premier
   - renderTodos() trie : actives avant complétées
   - Si même statut : tri par ID décroissant (récentes en premier)
   - Sort: a.completed ? 1 : -1

4. Système de notifications internes
   - Remplacé TOUS les alert() par showNotification()
   - Types : success, error, warning, info
   - Animations : slide-in/slide-out depuis la droite
   - Auto-fermeture après 4 secondes
   - Bouton de fermeture manuelle
   - Position : top-right, z-index 300
   - Icônes SVG selon le type
   - Couleurs : vert (success), rouge (error), jaune (warning), bleu (info)

Frontend - Notifications:
   - showNotification(message, type, duration)
   - closeNotification(notification)
   - Container fixe en haut à droite
   - Empilage vertical des notifications
   - Escape HTML automatique

CSS - Nouveaux styles:
   - .notifications-container (fixed, top-right)
   - .notification + variations par type
   - Animations slideInRight / slideOutRight
   - Border-left colorée selon le type
   - Responsive et accessible

Impact utilisateur:
   ✓ Plus de popups système alert() invasives
   ✓ Notifications élégantes et non-bloquantes
   ✓ Feedback visuel clair avec icônes et couleurs
   ✓ Source RSS affichée au lieu du modèle IA
   ✓ Todos actives toujours en haut
   ✓ Interface 100% en français

Files:
   - public/index.html: Titre + container notifications
   - public/css/skeleton.css: Styles notifications
   - public/js/complete-app.js: showNotification() + remplacement 40+ alert()
   - config/database.js: Migration feed_title
   - routes/rss.routes.js: Stockage et retour feed_title
2025-11-11 19:35:14 +00:00
Claude 9748ecb1bb Feature: Amélioration système RSS et OpenRouter
Backend:
- Récupération des vrais modèles depuis l'API OpenRouter
- Table rss_summaries pour stocker les résumés générés
- Limitation à 5 articles RSS au lieu de 10
- Route GET /api/rss/summaries pour récupérer les résumés
- Sauvegarde automatique des résumés en base de données

Frontend:
- Affichage conditionnel: résumés si activé, sinon articles
- Fonction renderRssSummaries() avec conversion Markdown→HTML
- Formatage du résumé (titres, listes, gras, italique)
- CSS complet pour .rss-summary avec typography
- Bouton résumer: crée note ou recharge bloc selon config

Comportement:
- Si rss_summary_enabled=1: affiche les 5 derniers résumés
- Sinon: affiche les 5 derniers articles
- Résumés formatés avec Markdown dans le bloc RSS
2025-11-11 17:03:44 +00:00
Claude e3755d273d Backend: Système complet RSS + OpenRouter + Administration améliorée
## Base de données:
- Table settings (key-value pour paramètres globaux)
- Table rss_feeds (url, title, description, enabled, last_fetched_at)
- Table rss_articles (feed_id, title, link, description, pub_date, content)
- Index optimisés pour performance

## Routes Settings (/api/settings):
- GET /api/settings - Récupérer tous les paramètres
- GET /api/settings/:key - Récupérer un paramètre
- PUT /api/settings/:key - Mettre à jour un paramètre
- DELETE /api/settings/:key - Supprimer un paramètre
- Middleware requireAdmin sur toutes les routes

## Routes RSS (/api/rss):
- GET /api/rss/feeds - Liste des flux RSS (admin)
- POST /api/rss/feeds - Ajouter flux RSS avec parsing validation (admin)
- PUT /api/rss/feeds/:id - Activer/désactiver flux (admin)
- DELETE /api/rss/feeds/:id - Supprimer flux (admin)
- POST /api/rss/fetch - Récupérer articles de tous flux actifs (admin)
- GET /api/rss/articles - Récupérer 10 derniers articles (tous users)
- POST /api/rss/summarize - Générer résumé OpenRouter (admin)
- GET /api/rss/models - Liste modèles OpenRouter (admin)

## Intégration OpenRouter:
- Appel API avec clé, modèle et prompt configurables
- Résumé intelligent des 10 derniers articles
- Prompt par défaut optimisé pour résumés d'actualités
- Support GPT-4, Claude 3, Gemini, Llama 3, Mistral, etc.
- Gestion erreurs et timeout

## Parser RSS:
- rss-parser installé pour parsing flux
- Gestion articles avec contenu, description, date
- Détection doublons par URL
- Update automatique infos flux

## Frontend HTML:
- Modal admin avec système à onglets (Users/RSS/OpenRouter)
- Modal changement mot de passe sans prompt navigateur
- Box RSS dans page principale affichage 10 derniers articles
- Bouton résumé IA dans header box RSS
- Inputs pour gestion flux RSS
- Configuration OpenRouter (API key, modèle, prompt, activation)
- Sélecteur modèles avec recherche

Prochaine étape: CSS + JavaScript pour fonctionnalités
2025-11-11 15:52:39 +00:00
Claude 820b0cfeda UX: Correction angles carte + Input inline todos + Système de fichiers complet
## Corrections UX:
- Fix coins arrondis en bas des notes étendues (overflow: hidden)
- Remplacement prompt() par input inline pour ajout de tâches
- Bouton "Ajouter" avec validation au clic ou touche Entrée
- Expérience utilisateur fluide sans popups intrusifs

## Système de fichiers complet:

### Backend:
- Création table note_files (id, note_id, filename, original_name, file_size, mime_type, created_at)
- POST /api/notes/:id/files - Upload fichier (multer, 10MB max)
- GET /api/notes/:id/files - Liste fichiers d'une note
- GET /api/notes/files/:fileId/download - Téléchargement sécurisé
- DELETE /api/notes/files/:fileId - Suppression fichier
- Stockage dans public/uploads/files/
- Auto-création dossier si nécessaire

### Frontend:
- Bouton "Ajouter un fichier" dans footer des notes
- Input hidden fileInput pour sélection
- Affichage liste fichiers avec icône, nom, taille
- Boutons télécharger/supprimer par fichier
- Fonction formatFileSize() pour affichage lisible
- Event delegation pour tous les boutons fichiers
- Confirmation avant suppression

### Intégration:
- GET /api/notes charge maintenant files[] et files_count
- renderInlineFiles() génère HTML des fichiers
- downloadFile() ouvre download dans nouvel onglet
- deleteFile() avec confirmation dialog
- Reload automatique après upload/delete
- Conservation état étendu après opérations

### CSS moderne:
- .note-file-item avec hover effect
- .note-file-icon, .note-file-info, .note-file-actions
- Buttons download/delete avec transitions
- Design cohérent avec reste de l'app
- Truncate nom fichier avec ellipsis

Tous types de fichiers acceptés (PDF, DOC, ZIP, etc.)
2025-11-11 15:40:15 +00:00
Claude 40caa7cb35 Backend: Ajout système d'archivage et todos dans cartes
- Migration auto colonne archived (BOOLEAN DEFAULT 0)
- Route GET /api/notes?archived=true/false pour filtrer
- Route PUT /api/notes/:id/archive pour archiver/désarchiver
- Chargement des todos avec chaque note (todos[], todos_count, todos_completed)
- Support filtrage par statut archivé
- Logs archivage/désarchivage
2025-11-11 13:56:10 +00:00
Claude c5d1cfd9fd Fix: Auto-migration pour ajouter la colonne image_filename manquante
- Ajout d'une vérification automatique au démarrage
- Utilise PRAGMA table_info pour vérifier les colonnes existantes
- Ajoute image_filename si elle n'existe pas
- Résout l'erreur SQLITE_ERROR: no such column: n.image_filename
2025-11-11 11:34:32 +00:00
Claude 7a716dc17a Création complète de l'application NoteFlow - Notes & Todo List
Application web Dockerisée moderne avec:
- Backend Node.js + Express + SQLite
- Frontend HTML/CSS/JavaScript vanilla
- Authentification JWT + bcrypt
- Gestion des notes avec images et todos intégrés
- Sidebar todos globaux avec filtres
- Interface utilisateur fluide avec animations CSS
- Administration des utilisateurs
- Sécurité production-ready (Helmet, rate limiting, validation)
- Configuration Docker complète
- Documentation README détaillée

Stack technique:
- Node.js 20 Alpine
- SQLite3 avec indexes optimisés
- Multer pour upload d'images
- Winston pour logging
- Express-validator pour validation
- Architecture modulaire (routes, middleware, config)

Fonctionnalités:
- Notes: CRUD complet, recherche, images, todos intégrés
- Todos globaux: création, toggle, filtres, suppression
- Auth: JWT 24h, bcrypt 12 rounds
- Admin: gestion utilisateurs complète
- UI: masonry grid, modal animations, responsive

Configuration Docker:
- Healthcheck intégré
- Volumes persistants pour data et uploads
- Network nginx_default pour reverse proxy
- Variables d'environnement configurables

Prêt pour déploiement avec: docker-compose up -d
2025-11-11 09:36:32 +00:00
Michael 204e66dd3a [dyad] wrote 2 file(s) 2025-11-06 13:57:32 +01:00
Michael eeefad62ce [dyad] wrote 3 file(s) 2025-11-06 13:54:31 +01:00
Michael a83d87855f [dyad] wrote 2 file(s) 2025-11-06 13:50:24 +01:00
Michael 5e6670d921 [dyad] wrote 5 file(s) 2025-11-06 12:20:50 +01:00