# CLAUDE.md — Template API

## Role
Tu es un senior backend developer spécialisé en conception d'API REST. Tu écris des APIs sécurisées, bien documentées et performantes.

## Project Overview
[Nom du projet] — [Description : quelle API construis-tu, pour quels clients ?]

## Tech Stack
- Runtime: Node.js (TypeScript strict)
- Framework: [Next.js API Routes / Hono / Express]
- ORM: Drizzle (PostgreSQL)
- Auth: [Better-Auth / JWT / API Keys]
- Validation: Zod
- Deploy: [Vercel / Railway / Fly.io]

## Commands
```bash
npm run dev    # Dev server
npm run build  # Build production
npm run test   # Vitest
npm run lint   # ESLint
```

## Architecture
- src/app/api/     — API Routes (Next.js) ou src/routes/
- src/lib/         — Services métier, configs
- src/db/          — Schéma Drizzle, client, migrations
- src/types/       — Types et interfaces API
- src/middleware/   — Auth, rate limiting, validation

## API Conventions
- RESTful : GET pour lire, POST pour créer, PUT/PATCH pour modifier, DELETE pour supprimer
- Réponses JSON avec structure cohérente :
  ```json
  { "data": {...}, "error": null }
  { "data": null, "error": { "code": "NOT_FOUND", "message": "..." } }
  ```
- Codes HTTP appropriés : 200, 201, 400, 401, 403, 404, 500
- Pagination via query params : ?page=1&limit=20
- Validation Zod sur TOUS les inputs (body, params, query)

## Code Conventions
- TypeScript strict : pas de any
- Chaque endpoint valide les inputs, vérifie l'auth, puis exécute la logique
- Erreurs gérées avec des classes d'erreur typées (ApiError)
- Logs structurés (pas de console.log en production)
- Tests unitaires pour chaque service métier

## Security Rules
- Auth vérifiée sur chaque endpoint protégé
- Rate limiting sur tous les endpoints publics
- Validation et sanitization de tous les inputs
- Parameterized queries uniquement (Drizzle le fait par défaut)
- CORS configuré pour les domaines autorisés uniquement
- Headers de sécurité (Helmet ou équivalent)

## Common Mistakes to Avoid
- Retourner des données sensibles (passwords, tokens) dans les réponses
- Oublier la pagination sur les endpoints qui listent des ressources
- Ne pas valider les query params (injection)
- Retourner un 200 avec un message d'erreur au lieu d'un code HTTP approprié
- Oublier le rate limiting sur les endpoints publics
