Introduction
Bienvenue dans la documentation développeur pour le projet Mood. Ce guide offre une analyse détaillée de l'architecture, des choix techniques et des principes fondamentaux qui définissent cette application.
Objectif du Projet
Mood est une plateforme de sondage auto-hébergeable conçue pour que les équipes puissent recueillir des retours, avec un accent mis sur un anonymat total et un modèle de sécurité à administrateur unique. Elle permet à un seul admin de créer des campagnes et de distribuer des liens de sondage uniques à des managers, garantissant que toutes les réponses restent non traçables.
Principes Architecturaux Clés
L'application est construite sur plusieurs principes clés qui guident sa structure et son développement :
Typage de Bout en Bout : En combinant Next.js, tRPC, Zod et Prisma, l'intégralité du flux de données est fortement typée. Cela élimine une classe massive de bugs potentiels entre le frontend et le backend et offre une expérience de développement exceptionnelle avec l'autocomplétion.
Défense en Profondeur : L'application emploie un modèle de sécurité à plusieurs niveaux :
- Protection "Edge" : Un fichier
middleware.tsprotège l'ensemble du groupe de routes/adminau niveau du réseau, redirigeant les utilisateurs non authentifiés avant même le rendu de tout code applicatif. - Protection de l'API : Chaque point d'accès sensible de l'API est une
protectedProcedure, vérifiant la session de l'utilisateur sur le serveur pour chaque requête. - Modèle à Admin Unique : La logique d'authentification (
src/auth.ts) est conçue pour n'autoriser l'inscription que pour le tout premier utilisateur, sécurisée par uneINVITATION_KEYobligatoire.
- Protection "Edge" : Un fichier
Expérience Utilisateur Optimisée : L'architecture est conçue pour être rapide et réactive.
- Pattern "Coquille Serveur" : Les pages complexes utilisent une coquille de Composant Serveur pour permettre un chargement instantané et le streaming de l'UI via React Suspense, tandis qu'un Composant Client principal gère toute l'interactivité.
- Feedback Constant : Chaque action de l'utilisateur (en particulier les mutations) fournit un retour visuel immédiat via des toasts et des états de chargement, garantissant que l'utilisateur n'est jamais laissé dans l'incertitude.
Stack Technique
- Framework : Next.js 15 (App Router) avec Turbopack
- API : tRPC (pour des API typées de bout en bout)
- Base de Données : PostgreSQL avec l'ORM Prisma
- Authentification : Better Auth (configuré pour un système à admin unique)
- UI : Tailwind CSS avec des composants shadcn/ui
- Visuels : Shaders WebGL personnalisés via
react-three-fiber&ogl - Validation : Zod (pour la validation des entrées de l'API)
Flux de Données de l'Application
Une requête typique vers une page protégée suit ce parcours complet :
- Un utilisateur tente d'accéder à une URL d'administration (ex:
/admin/campaigns/active). - Le Middleware Next.js (
src/middleware.ts) intercepte la requête et vérifie le cookie de session. S'il est invalide, il redirige vers/login. - La requête continue. React effectue le rendu de la page, en commençant par le Root Layout et l'Admin Layout.
- L'
AdminLayoutenveloppe la page dans unTRPCProvider, rendant le client tRPC authentifié disponible. - Le Composant Client de la page (ex:
ActiveCampaignsPage.tsx) s'initialise et appelle un hook tRPC, commetrpc.campaign.list.useQuery(). - Le client tRPC envoie une requête HTTP à la route d'API
/api/trpc. Les données sont sérialisées avecsuperjson. - Le Contexte tRPC (
src/server/context.ts) est créé sur le serveur, injectant le clientprismaet lasessionutilisateur à la requête. - La
protectedProceduredanssrc/server/trpc.tsexécute son propre middleware, validant quectx.session.userexiste. - La logique du routeur dans
src/server/routers/campaign.tss'exécute enfin, utilisant Prisma pour interroger la base de données. - La réponse, entièrement typée, est retournée au client, où React Query gère la mise en cache et le rendu des données.