Retour aux projetsProjet personnel

Todo App - augmenté par l'IA

Un gestionnaire de tâches, oui — mais surtout un projet conçu pour montrer comment je construis une application de bout en bout : API typée et documentée, authentification multi-stratégies, pipeline CI/CD conteneurisé, et une intégration Slack pilotée par IA qui permet de créer des tâches en langage naturel.

Back-end

Node.js v22TypeScript 5.7Express 4MongoDBMongoose 8Passport.jsZod 3Swagger UIJestSupertestResendReact EmailDockerGitHub Actions

Front-end

React 19TypeScriptVite + SWCReact Router v7TanStack Query v5React Hook FormAxiosSCSS ModulesMotionESLintPrettierDockerGitHub Actions

Création de tâches depuis Slack — agent IA + système d'approbation

Permettre à un utilisateur de créer des tâches en langage naturel directement depuis Slack, sans ouvrir l'application.

L'idée

Un message comme «J'ai une réunion d'équipe vendredi à 14h, crée-moi une tâche pour préparer l'ordre du jour jeudi et une pour envoyer le compte-rendu lundi.» génère automatiquement les bonnes tâches aux bonnes dates.

Comment ça marche

Le workflow est orchestré par n8n, un outil d'automatisation open-source. Le choix de n8n plutôt qu'un script maison est délibéré : n8n permet de brancher facilement d'autres sources de messagerie (Discord, Teams, webhook générique) sans réécrire la logique d'orchestration.

Quand un utilisateur envoie un message dans Slack, n8n le réceptionne et le soumet d'abord à une IA qui modère le contenu. Si le message est valide, l'IA le parse pour en extraire les tâches pertinentes avec leurs dates. n8n envoie ensuite ces tâches à l'API sous forme d'opération en attente, et un message récapitulatif est posté dans Slack avec des boutons Approve / Deny.

Architecture technique — le modèle Operation

Plutôt que d'exposer directement l'endpoint de création de tâches aux systèmes externes, l'API utilise un modèle intermédiaire Operation. Chaque opération est stockée avec un statut pending et ne produit aucun effet tant qu'elle n'est pas explicitement approuvée.

Sécurité

Endpoints protégés par API Key (X-API-Key), séparés des endpoints utilisateur. Payload validé contre le schéma CreateTaskSchema dès l'ingestion.

Non-rejouabilité

L'approbation utilise findOneAndUpdate({ shortId, status: "pending" }). Une opération déjà traitée ne peut pas être rejouée.

Traçabilité

Chaque opération conserve l'intégralité du contexte : source, canal, utilisateur, horodatage, payload original. L'audit est natif.

Extensibilité

Ajouter une nouvelle source (Discord, Teams) se résume à enrichir l'enum source et brancher un nouveau workflow n8n.

Architecture

API

Architecture en couches stricte (routes → controllers → services → models). Les schémas Zod assurent validation des requêtes et génération automatique de la documentation OpenAPI. Endpoints couverts par tests d'intégration.

Client

Même logique de séparation : fonctions HTTP pures (src/api/), wrappées par des hooks TanStack Query pour le cache et l'invalidation, consommées par les composants sans couplage au transport.

Sécurité et authentification

Quatre stratégies Passport.js (email/mot de passe, Google OAuth2, Slack OAuth2), access tokens JWT en Bearer, refresh tokens en cookie HttpOnly (Secure + SameSite), protection CSRF via state OAuth encodé en base64url, rate limiting sur les endpoints sensibles, et hiérarchie d'erreurs typées avec handler centralisé.

Infrastructure et outillage

Emails

Templates React rendues côté serveur, envoyées via Resend, prévisualisables en développement avec @react-email/preview-server.

Déploiement

Docker multi-stage (image allégée, utilisateur non-root), CI/CD GitHub Actions via SSH, reverse proxy Nginx avec SSL sur VPS Ubuntu.

Évolutions en cours

Serveur MCP

Exposer la gestion de tâches comme outils utilisables par les assistants IA (Claude, ChatGPT), permettant de créer et consulter ses tâches directement depuis une interface de chat.

Cluster MongoDB

Migration vers un replica set pour activer les transactions et garantir l'atomicité des opérations composées (ex. approbation bulk avec rollback en cas d'erreur partielle).