Structure du projet
Arborescence src/
src/
├── app/
│ ├── layout.tsx # Root layout : fonts IBM Plex, globals.css
│ ├── globals.css # Design tokens, utilitaires CSS (source Tailwind v4)
│ ├── login/
│ │ └── page.tsx # Page de connexion (Client Component)
│ ├── (app)/ # Route group — zone authentifiée
│ │ ├── layout.tsx # Vérifie la session, rend Sidebar + main
│ │ ├── page.tsx # Redirect → /dashboard
│ │ ├── dashboard/page.tsx
│ │ ├── accounts/
│ │ │ ├── page.tsx
│ │ │ └── [id]/page.tsx
│ │ └── import/page.tsx
│ ├── actions/ # Server Actions ('use server')
│ │ ├── accounts.ts
│ │ ├── analytics.ts
│ │ ├── budget.ts
│ │ ├── dashboard.ts
│ │ ├── import.ts
│ │ ├── settings.ts
│ │ └── users.ts
│ └── api/
│ ├── auth/[...nextauth]/route.ts # Handlers NextAuth v5
│ └── health/route.ts # GET /api/health
├── components/
│ ├── layout/
│ │ └── sidebar.tsx # Client Component — nav collapsible
│ └── ui/
│ ├── kpi-card.tsx
│ ├── account-card.tsx
│ └── trend-badge.tsx
├── lib/
│ ├── auth.ts # Configuration NextAuth v5
│ ├── db.ts # Singleton PrismaClient (adapter pg)
│ ├── utils.ts
│ └── parsers/
│ ├── types.ts
│ ├── detect.ts
│ ├── bourso.ts
│ ├── bourso-pea.ts
│ ├── revolut.ts
│ └── trade-republic.ts
└── proxy.ts # Middleware / proxy Next.js
prisma/
├── schema.prisma # Source de vérité du schéma DB
└── migrations/ # Migrations versionnées
prisma.config.ts # Prisma 7 : datasource URL (DATABASE_URL)
Conventions
Nommage
- Fichiers utilitaires :
kebab-case.ts - Composants React :
PascalCase.tsx - Variables / fonctions :
camelCase - Constantes globales :
UPPER_SNAKE_CASE - Dossiers de tests :
__tests__/colocalisé avec le code testé
Import paths
- Alias
@/*→src/*(configuré danstsconfig.json) - Préférer
@/lib/dbplutôt que../../../lib/db
Server Component vs Client Component
Règle Next.js 16 (App Router) :
- Server Component par défaut (pas de directive)
'use client'uniquement si le composant utilise de l'état, des hooks (useState,useEffect,useRouter…) ou des event handlers
Fichiers spéciaux Next.js par route
loading.tsxeterror.tsxobligatoires sur toute route avec data fetching (CLAUDE.md)
Secrets
- Serveur :
.env.local(git-ignored), jamais commité - Client : préfixe
NEXT_PUBLIC_(exposé au bundle)
Responsabilités par couche
| Couche | Rôle | Interdits |
|---|---|---|
src/app/** | Routing, layouts, pages, Server Actions | Logique métier lourde (→ src/lib/) |
src/components/** | UI réutilisable | Appels directs à Prisma |
src/lib/** | Logique métier, parsers, calculs | Dépendance à React ou Next.js |
prisma/** | Schéma et migrations | Modification manuelle en base |