Ce document décrit comment mettre en place l’évolution du projet : backend Node, base MySQL, auth fiable et déploiement. Il corrige les pièges d’une simple « copie » de l’auth actuelle (tout client) vers un service public.
- Permettre à plusieurs personnes d’utiliser TaskHub en ligne.
- Centraliser les tâches et les comptes dans MySQL.
- Ne jamais faire confiance au navigateur pour l’identité ni pour le stockage des mots de passe.
- Node.js LTS installé.
- MySQL disponible (Laragon inclut souvent MySQL/MariaDB).
- Créer une base dédiée, par exemple
taskhub, et un utilisateur SQL avec droits limités à cette base.
Deux approches courantes :
| Option | Description |
|---|---|
| A. Monorepo | client/ (React actuel) + server/ (Node). Racine avec scripts dev qui lance les deux. |
| B. Dépôt séparé | API dans un autre repo ; le front consomme une URL d’API en variable d’environnement. |
Pour démarrer vite tout en gardant un seul clone : option A avec dossier server/ à la racine du projet TaskHub.
- Serveur HTTP (Express, Fastify ou Nest) écoutant un port (ex.
3000). - Connexion MySQL via un pool (
mysql2en promesses, ou ORM type Prisma / Drizzle si vous préférez). - Migrations : scripts SQL versionnés ou outil de migration pour créer
usersettasks. - Variables d’environnement (fichier
.envnon commité) :DATABASE_URLouDB_HOST,DB_USER,DB_PASSWORD,DB_NAME,DB_PORTJWT_SECRET(si JWT) ou secret de sessionCLIENT_ORIGINpour CORS (ex.http://localhost:5173en dev)
| Mauvaise pratique (à éviter) | Bonne pratique |
|---|---|
| Accepter n’importe quel login sans vérification serveur | POST /auth/login vérifie email + hash en base |
Stocker le mot de passe en clair dans localStorage |
Seul le serveur stocke un hash (bcrypt ou Argon2) |
Cookie côté client avec seulement "1" |
Jeton signé (JWT) dans header Authorization, ou cookie httpOnly + Secure en HTTPS |
| Réutiliser le même stockage tâches pour tous | Chaque ligne tasks a un user_id ; l’API refuse l’accès aux lignes d’un autre utilisateur |
Inscription : POST /auth/register — valider email, longueur du mot de passe, insérer users avec hash.
Connexion : retourner un token (ou créer une session serveur) ; le front l’envoie sur chaque requête protégée.
Déconnexion : invalider session côté serveur, ou côté client supprimer le token + vider le cache React Query.
Préfixe exemple : /api.
| Méthode | Route | Description |
|---|---|---|
POST |
/api/auth/register |
Créer un compte |
POST |
/api/auth/login |
Obtenir un token / session |
POST |
/api/auth/logout |
Optionnel selon stratégie |
GET |
/api/tasks |
Liste des tâches de l’utilisateur connecté |
POST |
/api/tasks |
Créer une tâche |
PATCH |
/api/tasks/:id |
Mettre à jour (statut, titre, etc.) |
DELETE |
/api/tasks/:id |
Supprimer |
Champs alignés sur le front actuel : title, description, completed, category, dueDate (mapper en due_date en SQL si besoin).
VITE_API_URLdans.envdu client (ex.http://localhost:3000).- Remplacer les appels dans
tasksApi.jsparfetchaveccredentials: 'include'(sessions cookie) ou headerAuthorization: Bearer <token>. - Intercepter les réponses 401 pour rediriger vers
/login. - Retirer la persistance du mot de passe dans le store utilisateur ; ne garder en mémoire que ce qui est nécessaire à l’UI (nom, email).
- MySQL : instance managée ou serveur avec sauvegardes.
- API Node : variables d’environnement de prod, HTTPS (reverse proxy nginx ou hébergeur).
- Front :
npm run build; configurerbaseVite selon l’URL réelle (racine du domaine vs sous-chemin). - CORS : n’autoriser que l’origine du site front en production.
- Schéma SQL + script de création des tables.
- Serveur minimal + healthcheck
GET /api/health. - Auth register/login + protection des routes tâches.
- CRUD tâches branché sur MySQL.
- Brancher le React existant sur l’API.
- Durcissement (rate limiting basique, validation des entrées, logs d’erreur).
Fonctionnalité cible : depuis le dashboard (ou un module « Rapports »), chaque utilisateur authentifié peut exporter uniquement ses tâches, après un filtrage intelligent, vers des formats utilisables en entreprise (réunion, suivi de projet, reporting).
L’utilisateur choisit une fenêtre temporelle prédéfinie ou personnalisable :
| Période | Usage typique |
|---|---|
| Journalier | Bilan du jour, stand-up |
| Hebdomadaire | Revue de sprint, planning |
| Mensuel | Reporting RH / management |
| Annuel | bilan annuel, archives |
Le backend calcule les bornes de dates (from / to) à partir du fuseau horaire de l’utilisateur (à stocker ou déduire plus tard si besoin).
En complément de la période, sélection précise des enregistrements à inclure dans l’export :
- Statut : actives, terminées, toutes (aligné sur le modèle actuel
completed). - Priorité : à modéliser si vous ajoutez un champ
priority(sinon mapper Urgent / catégories existantes en « priorité visuelle »). - Projet : prévoir une entité
projects(ou un champproject_idsurtasks) si le produit évolue au-delà des seules catégories. - Date : par date de création, date d’échéance (
due_date), ou date de complétion (nécessite un champcompleted_aten base pour des stats fiables).
Toutes les requêtes d’export doivent être scopées par user_id (comme le CRUD des tâches).
Après prévisualisation (liste + compteurs), génération côté serveur (recommandé pour la cohérence, la sécurité et les gros volumes) :
| Format | Piste technique (Node) |
|---|---|
pdfkit, puppeteer (HTML → PDF), ou service externe |
|
| Excel | exceljs / xlsx |
| Word | docx |
| PowerPoint | pptxgenjs |
Note : PowerPoint et Word sont utiles pour des diapositives / comptes rendus ; Excel et PDF couvrent souvent 80 % des besoins de reporting — prioriser par phase (ex. CSV + PDF d’abord, puis Excel, puis Word/PPTX).
- Gestion et analyse de productivité sur ses propres données.
- Partage de rapports (fichier exporté, ou lien temporaire sécurisé si vous l’ajoutez plus tard).
- Usage professionnel : réunions, suivi de projet, reporting managérial.
- Graphiques automatiques dans les exports (ou en annexe PDF) : évolution des tâches créées / terminées sur la période, répartition par catégorie, charge en retard. Les données agrégées peuvent être calculées en SQL ou en couche service avant rendu (PNG embarqué via lib de charts côté serveur, ou SVG dans PDF).
- Statistiques systématiques : nombre de tâches terminées, en cours, en retard ; temps moyen avant complétion si
completed_atexiste ; taux de complétion sur la période. - Résumé automatique généré par l’IA : après agrégation des métriques, appeler un fournisseur LLM (API) avec un prompt strict (données chiffrées uniquement, pas de données personnelles inutiles) pour produire un court paragraphe « exécutif » en français. Prévoir
AI_EXPORT_SUMMARY_ENABLED, quotas, opt-in utilisateur, journalisation et conformité (RGPD : base légale, durée de conservation des prompts/réponses si vous les stockez).
POST /api/exports/preview— corps JSON : période, filtres ; réponse : sous-ensemble de tâches + stats + métadonnées pour le front.POST /api/exports— même filtre +format(pdf|xlsx|docx|pptx) ; réponse : fichier en stream ou URL signée courte durée.
À placer après le CRUD tâches stable et les champs nécessaires (completed_at, éventuellement project_id, priority).
Objectif : faire évoluer TaskHub d’une simple todo list vers un outil d’organisation et de productivité, avec des catégories structurées, personnalisables et exploitables dans filtres, dashboard et exports (section 10).
Aujourd’hui le front propose un select à valeurs fixes : Général, Travail, Personnel, Shopping, Santé, Urgent (chaînes type general, work, etc.). La cible décrite ci-dessous suppose une table (ou équivalent) côté MySQL plutôt qu’une liste codée en dur seule.
Chaque groupe ci-dessous peut devenir un niveau « parent » ; les lignes en retrait sont des sous-catégories (enfants) à créer en base avec parent_id nullable sur la table categories.
Productivité
- Études
- Formation / apprentissage
- Objectifs
- Projets
Travail
- Réunions
- Administration
- Clients
- Freelance
Vie personnelle
- Famille
- Loisirs
- Voyage
- Maison
Finance
- Budget
- Factures
- Investissements
- Dépenses
Organisation
- Rendez-vous
- Planification
- Routine
Santé et bien-être
- Sport
- Méditation
- Sommeil
- Alimentation
(Les anciennes étiquettes « Shopping », « Urgent », etc., peuvent être migrées : mapping vers un enfant du catalogue, ou conservation comme catégories système si vous gardez la rétrocompatibilité.)
- Chaque utilisateur peut créer ses propres catégories (en plus du catalogue global ou en remplacement progressif selon règle produit).
- Modèle suggéré : table
categoriesavec au minimum :id,user_id(NULL = catégorie système / catalogue partagé),parent_id,name,slugou clé stable,color(ex. hex),icon(nom d’icône type Lucide / emoji / clé de sprite),sort_order,created_at. - Table
tasks:category_id(FK) remplace ou complète l’enum textuel actuel ; migration des tâches existantes vers descategory_idpar défaut.
- Couleur : palette limitée (préréglages + une couleur custom optionnelle) pour éviter le « arc-en-ciel » illisible.
- Icône : jeu restreint (bibliothèque d’icônes + recherche courte) ou emoji optionnel — l’UI reste simple : une ligne compacte dans le formulaire tâche, affichage badge sur
TaskCardcomme aujourd’hui. - Prévoir un aperçu en temps réel (nom + couleur + icône) avant enregistrement.
- Les filtres de la liste des tâches et du dashboard doivent permettre de filtrer par catégorie (parent, enfant, ou « toutes »).
- Statistiques : comptage par catégorie / par groupe, tendances dans le temps (après backend + champs dates utiles), cohérent avec les exports intelligents (section 10).
| Méthode | Route | Description |
|---|---|---|
GET |
/api/categories |
Arbre ou liste plate + métadonnées (système + propres à l’utilisateur) |
POST |
/api/categories |
Créer une catégorie personnalisée |
PATCH |
/api/categories/:id |
Renommer, couleur, icône, ordre (uniquement si user_id = connecté) |
DELETE |
/api/categories/:id |
Soft-delete ou interdiction si des tâches y sont rattachées (règle produit à trancher) |
Les endpoints tasks acceptent category_id (et rejettent les IDs d’autres utilisateurs).
À traiter après le modèle users + tasks stable et l’auth ; avant ou en parallèle des exports riches (section 10), car les exports et stats s’appuient sur une taxonomie claire.
Objectif commun : faire de TaskHub un outil de gestion du temps et de la productivité, pas seulement une liste. Les points déjà détaillés ailleurs dans ce document ne sont pas répétés (export multi-formats et périodes : section 10 ; catégories riches : section 11).
- Introduire un champ
priorityexplicite (low|medium|high) en base, distinct de la catégorie. - Suggestion côté serveur ou client : combiner échéance (proche / en retard), indicateur d’importance (champ utilisateur ou règles métier), et charge (nombre de tâches actives / en retard). La suggestion reste modifiable par l’utilisateur pour garder le contrôle.
- Prévoir une route optionnelle
PATCH /api/tasks/:id/suggest-priorityou calcul à la création / mise à jour.
- Fonctionnalité avancée : nécessite un modèle de disponibilités (créneaux récurrents, calendrier) et des règles de conflit avec les autres tâches. À traiter après les stats de base et les champs
due_date/completed_atfiables. - Première étape possible : proposer un créneau suggéré textuel (ex. « demain matin ») sans optimisation globale, puis itérer vers un vrai moteur de placement.
- Métriques cibles : tâches terminées, tâches en retard, taux de complétion sur une période, délai moyen entre création et complétion (exige
completed_atet idéalementcreated_aten base). - Exposer
GET /api/stats/summary?from=&to=pour alimenter le dashboard React ; aligner les définitions avec les exports (section 10.5) pour une seule source de vérité.
- Complément aux graphiques dans les exports (§10.5) : vues hebdomadaires et mensuelles dans l’UI (bibliothèque charts côté client ou image générée côté serveur).
- Axes utiles : tâches créées / terminées par jour ou semaine, backlog, répartition par catégorie ou tag.
- Notifications avant échéance (tâches importantes / priorité haute / catégorie Urgent si conservée).
- Implémentation typique : jobs planifiés (cron + file) côté Node, préférences utilisateur (délai avant échéance, canal web push / email si ajouté), respect du consentement et fréquence plafonnée pour éviter la spam.
- Modèle :
tasks.parent_id(NULL = tâche racine) ou tablesubtasksliée àtask_id; ordresort_order. - Progression agrégée possible pour le mode projet (§12.7). L’UI reste simple : liste repliable sous la tâche parente.
- Entité
projects(ou champproject_idsurtasks, déjà évoqué en §10.2) avec libellé, dates optionnelles. - Avancement : ex. ratio des sous-tâches terminées, ou des tâches du projet marquées terminées ; affichage d’un pourcentage sur le dashboard et dans la liste projet.
- Déjà couverte (filtres journalier → annuel, PDF / Excel / Word / PowerPoint, preview, stats) : voir section 10. Ne pas dupliquer la spécification ici.
- Modèle relationnel : tables
tags(id,user_id,name, couleur optionnelle) ettask_tags(task_id,tag_id) pour mots-clés multiples. - Enrichit recherche et filtres (combinable avec catégories §11). Index sur les noms pour la perf.
- Indicateur composite (ex. 0–100) combinant : volume de tâches terminées, respect des délais (échéance vs
completed_at), régularité (jours actifs sur N — à partir des connexions ou des actions en base, sans être intrusif). - Affichage dans le dashboard ; documenter la formule pour la transparence ; rester prudent sur la charge cognitive et l’aspect « gamification » (optionnel / désactivable).
- Champs
priority,completed_at,created_atsur les tâches. - Stats dashboard + API
stats(§12.3), puis graphiques in-app (§12.4). - Sous-tâches (§12.6), puis projets + % (§12.7).
- Tags (§12.9) et priorité suggérée (§12.1).
- Rappels (§12.5) ; planification auto avancée (§12.2) en dernier.
Objectif global (vision) : faire de TaskHub une plateforme d’aide à la gestion du temps et des objectifs. Ce paragraphe ne spécifie en détail que ce qui vaut la peine d’être attaqué en premier ; le reste est volontairement laissé de côté pour l’instant (à rouvrir quand le socle données + stats + §12 sera stable).
- Détection de surcharge de travail — Agréger par jour / semaine le nombre de tâches actives, une estimation de charge (durée ou simple comptage), et des seuils configurables. Alerter l’utilisateur dans l’UI (et éventuellement email plus tard) sans analyse comportementale fine.
- Réorganisation « intelligente » après retard — Si une tâche n’est pas terminée à l’échéance : proposer explicitement (l’utilisateur valide) un nouveau créneau ou une nouvelle date, avec impact visible sur les tâches suivantes (glissement simple). Éviter la réécriture automatique silencieuse du planning au début.
- Tâches répétitives → récurrence — Détecter ou laisser l’utilisateur marquer une tâche comme récurrente (
rrulesimplifié ou fréquence hebdo/mensuel). Les « patterns » répétitifs peuvent commencer par une création manuelle de modèle récurrent sans data mining. - Objectifs intelligents (liaison tâches ↔ objectifs) — Entité
goals(mensuel / annuel) + lientask.goal_idou table de liaison. Tableaux de bord : progression vers l’objectif à partir des tâches terminées / points. Cela structure le produit sans IA obligatoire.
Rapports périodiques riches (stats + graphiques + recommandations) : s’appuyer sur la section 10 (exports) et la §12.3–12.4 (stats et graphiques in-app) plutôt que de dupliquer une nouvelle pile « rapports » ici.
Ne pas implémenter tout de suite ; à rouvrir avec opt-in juridique, budget API et données suffisantes :
- Moteur complet d’analyse de comportement (heures de travail, inactivité, moments de pic) au-delà de simples agrégats.
- Planification prédictive (durée estimée + créneau optimal par modèle prédictif).
- Assistant IA large (suggestion de nouvelles tâches, coaching permanent) — préférer plus tard des assistants ciblés (ex. résumé d’export déjà évoqué §10.5).
- Score avancé discipline / constance séparé : fusionner avec le score de productivité (§12.10) en un seul bloc évolutif et transparent plutôt que multiplier les scores.
- Architecture — diagrammes et limites de l’existant.
Une fois le backend présent dans le dépôt, mettre à jour ce fichier avec les noms exacts des dossiers, scripts npm et l’URL de production.