# Story 1.2: Configurer la base de données SQLite avec Drizzle ORM

Status: review

<!-- Note: Validation is optional. Run validate-create-story for quality check before dev-story. -->

## Story

As a développeur,
I want configurer SQLite avec Drizzle ORM dans Next.js,
So que je peux stocker et récupérer des données pour l'application.

## Acceptance Criteria

**Given** le projet Next.js est initialisé
**When** j'installe `drizzle-orm`, `better-sqlite3` et `drizzle-kit`
**Then** les packages sont installés avec les versions spécifiées (Drizzle v0.44.7)
**And** la configuration Drizzle est créée dans `src/lib/db.ts`
**And** la connexion SQLite fonctionne
**And** le fichier de base de données `.db` est créé (ou spécifié dans config)

**Given** Drizzle est configuré
**When** j'exécute la commande de génération de schéma
**Then** Drizzle Kit est configuré avec le chemin vers la base de données
**And** les migrations peuvent être générées avec `drizzle-kit generate`

## Tasks / Subtasks

- [x] Installer les dépendances Drizzle ORM et better-sqlite3 (AC: #1)
  - [x] Installer `drizzle-orm` version 0.44.7
  - [x] Installer `better-sqlite3` comme driver SQLite
  - [x] Installer `drizzle-kit` pour les migrations
  - [x] Vérifier les versions dans `package.json`
  - [x] Confirmer que les packages sont installés sans erreurs

- [x] Créer la configuration Drizzle ORM (AC: #1, #2)
  - [x] Créer le fichier `src/lib/db.ts` avec la connexion SQLite
  - [x] Configurer `better-sqlite3` avec le driver Drizzle
  - [x] Définir le chemin vers le fichier de base de données SQLite
  - [x] Exporter l'instance de base de données pour utilisation dans l'application
  - [x] Vérifier que la connexion fonctionne correctement

- [x] Configurer Drizzle Kit pour les migrations (AC: #2)
  - [x] Créer le fichier `drizzle.config.ts` à la racine du projet
  - [x] Configurer le schéma et le driver SQLite
  - [x] Définir le dossier pour les migrations (ex: `drizzle/migrations`)
  - [x] Configurer le préfixe de timestamp pour les migrations
  - [x] Vérifier que `drizzle-kit generate` fonctionne

- [x] Créer un exemple de schéma de table de test
  - [x] Créer `src/db/schema.ts` avec au moins un schéma de table
  - [x] Définir une table de test (ex: `users` ou `test_table`)
  - [x] Utiliser les conventions de nommage: `snake_case` pour tables/colonnes
  - [x] Ajouter des colonnes de base (id, created_at, etc.)
  - [x] Confirmer que le schéma suit les patterns de l'architecture

- [x] Générer et appliquer la migration initiale
  - [x] Exécuter `drizzle-kit generate` pour créer la migration
  - [x] Vérifier que le fichier de migration est créé dans `drizzle/migrations`
  - [x] Examiner le contenu de la migration pour confirmer la structure
  - [x] Créer un script d'application de migration si nécessaire
  - [x] Appliquer la migration pour créer la table dans SQLite

- [x] Valider l'installation complète de Drizzle
  - [x] Vérifier que le fichier de base de données SQLite existe
  - [x] Tester une requête simple (SELECT, INSERT)
  - [x] Confirmer que les types TypeScript sont générés correctement
  - [x] Vérifier que la configuration Drizzle Kit est fonctionnelle
  - [x] Documenter l'emplacement et la structure des migrations

## Dev Notes

### Architecture Patterns et Contraintes

**Stack Technique Imposé:**
- **ORM Next.js:** Drizzle ORM v0.44.7 avec driver `better-sqlite3`
- **Migrations:** Drizzle Kit pour génération et application des migrations
- **Base de données:** SQLite Phase 1 (fichier local partagé avec FastAPI)
- **Conventions de nommage:** `snake_case` pour tables et colonnes (cohérence avec SQLAlchemy)

**Configuration Requise:**
- Fichier de configuration: `src/lib/db.ts` (connexion SQLite)
- Fichier de migrations: `drizzle/migrations/` (migrations versionnées)
- Configuration Drizzle Kit: `drizzle.config.ts` (génération migrations)
- Schémas de tables: `src/db/schema.ts` (définitions de schémas Drizzle)

**Intégration avec Architecture Globale:**
- SQLite partagé entre FastAPI (SQLAlchemy) et Next.js (Drizzle)
- Même convention de nommage: `snake_case` pour cohérence entre ORMs
- Migrations versionnées pour traçabilité et rollback
- Types TypeScript générés automatiquement depuis schémas

**Conventions de Nommage (Database - Drizzle):**
- Tables: `snake_case` pluriel (ex: `users`, `predictions`, `matches`)
- Colonnes: `snake_case` (ex: `user_id`, `created_at`, `is_premium`)
- Foreign Keys: `{table}_id` (ex: `user_id`, `match_id`, `prediction_id`)
- Indexes: `idx_{table}_{column}` (ex: `idx_users_email`, `idx_predictions_match_id`)
- Constraints: `{table}_{column}_{constraint}` (ex: `users_email_unique`)

### Source Tree Components à Toucher

**Fichiers à créer/modifier:**
1. `chartbastan/src/lib/db.ts` - Configuration connexion SQLite avec Drizzle (CRÉER)
2. `chartbastan/src/db/schema.ts` - Schémas de tables Drizzle (CRÉER)
3. `chartbastan/drizzle.config.ts` - Configuration Drizzle Kit (CRÉER)
4. `chartbastan/drizzle/migrations/` - Dossier pour migrations (CRÉER)
5. `chartbastan/package.json` - Ajouter dépendances drizzle-orm, better-sqlite3, drizzle-kit (MODIFIER)

**Fichiers générés automatiquement:**
- `chartbastan/drizzle/migrations/XXXXX_init.sql` - Migration initiale générée par Drizzle Kit
- Types TypeScript générés depuis schémas Drizzle (via Drizzle Kit)

### Project Structure Notes

**Alignment with unified project structure:**
- ✅ Drizzle ORM v0.44.7 comme spécifié dans architecture.md
- ✅ better-sqlite3 comme driver SQLite (cohérent avec architecture)
- ✅ Conventions `snake_case` pour tables/colonnes (cohérence SQLAlchemy)
- ✅ Migrations versionnées via Drizzle Kit
- ✅ Structure `src/lib/db.ts` et `src/db/schema.ts` (conventions Next.js)

**Conventions de code à respecter:**
- Schémas Drizzle définis avec types TypeScript stricts
- Utilisation de `better-sqlite3` comme driver synchrone
- Configuraton Drizzle Kit avec schema path et driver
- Migrations dans dossier séparé `drizzle/migrations/`
- Génération automatique de types TypeScript depuis schémas

**Intégration avec architecture existante:**
- SQLite fichier partagé entre FastAPI et Next.js (Phase 1)
- Même convention de nommage `snake_case` que SQLAlchemy
- Migrations Drizzle synchronisées avec Alembic (FastAPI) si possible
- Types TypeScript générés pour type safety côté frontend

**Conflits ou variances détectés:**
Aucun conflit majeur. Cependant, il est important de:
- S'assurer que le chemin vers le fichier SQLite est cohérent entre FastAPI et Next.js
- Synchroniser les conventions de schéma entre SQLAlchemy et Drizzle pour éviter les incompatibilités futures lors de la migration vers PostgreSQL

### Previous Story Intelligence

**Story 1.1 - Initialiser le projet Next.js avec starter template:**

**Fichiers créés/modifiés:**
- `chartbastan/` (répertoire racine Next.js)
- `chartbastan/src/app/` (structure App Router)
- `chartbastan/components.json` (configuration shadcn/ui)
- `chartbastan/tailwind.config.ts` (configuration Tailwind v4)
- `chartbastan/tsconfig.json` (configuration TypeScript strict)
- `chartbastan/next.config.mjs` (configuration Next.js avec Turbopack)
- `chartbastan/package.json` (dépendances Next.js 16)

**Learnings et bonnes pratiques:**
- ✅ Structure `src/` directory établie correctement
- ✅ TypeScript strict mode activé dans `tsconfig.json`
- ✅ Turbopack activé pour bundling rapide
- ✅ shadcn/ui avec composants copiés localement dans `components/ui/`
- ✅ Convention de nommage: PascalCase pour composants, camelCase pour fonctions

**Patterns établis à réutiliser:**
- Utiliser Server Components par défaut (Next.js 16 standard)
- Pas de mutations directes d'état (utiliser setters immutables)
- Co-location des tests avec composants OU dans dossier `tests/`
- TypeScript strict mode activé (déjà configuré)

**Warnings ou points d'attention:**
- Aucun warning majeur. Le projet est propre et suit les conventions.

**Impact sur Story 1.2:**
- Le projet Next.js est déjà configuré et fonctionnel
- La structure `src/` directory est prête pour accueillir `src/lib/db.ts` et `src/db/schema.ts`
- TypeScript strict mode sera bénéfique pour les types Drizzle générés
- La base technique est solide pour l'ajout de Drizzle ORM

### Latest Technical Information

**Drizzle ORM v0.44.7 - Latest Stable Version:**

**Installation:**
```bash
npm install drizzle-orm better-sqlite3
npm install -D drizzle-kit
```

**Configuration Connexion SQLite (`src/lib/db.ts`):**
```typescript
import { drizzle } from 'drizzle-orm/better-sqlite3';
import Database from 'better-sqlite3';

// Créer la connexion SQLite
const sqlite = new Database('chartbastan.db');

// Exporter l'instance Drizzle
export const db = drizzle(sqlite);
```

**Configuration Drizzle Kit (`drizzle.config.ts`):**
```typescript
import type { Config } from 'drizzle-kit';

export default {
  schema: './src/db/schema.ts',
  out: './drizzle/migrations',
  driver: 'better-sqlite3',
  dbCredentials: {
    url: './chartbastan.db',
  },
} satisfies Config;
```

**Schéma de Table Exemple (`src/db/schema.ts`):**
```typescript
import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';

export const users = sqliteTable('users', {
  id: integer('id').primaryKey({ autoIncrement: true }),
  email: text('email').notNull().unique(),
  name: text('name'),
  is_premium: integer('is_premium', { mode: 'boolean' }).default(false),
  created_at: integer('created_at', { mode: 'timestamp' }).notNull(),
});
```

**Génération de Migration:**
```bash
npx drizzle-kit generate
```

**Application de Migration:**
```bash
npx drizzle-kit migrate
```

**Notes de Version v0.44.7:**
- Stable et bien maintenu
- Support complet de TypeScript
- Migration facile depuis d'autres ORMs
- Documentation complète sur drizzle.team
- Compatible avec Next.js 16 et Server Components

**Meilleures Pratiques:**
- Utiliser `better-sqlite3` comme driver synchrone (recommandé pour Next.js)
- Définir les schémas dans un fichier séparé `src/db/schema.ts`
- Utiliser les types génériques Drizzle pour type safety
- Générer les types TypeScript avec `drizzle-kit` si nécessaire
- Versionner toutes les migrations dans le dossier `drizzle/migrations/`

### Technical Requirements

**Configuration Drizzle ORM - Détails:**

1. **Fichier de Connexion (`src/lib/db.ts`):**
   - Importer `drizzle` depuis `drizzle-orm/better-sqlite3`
   - Importer `better-sqlite3` comme `Database`
   - Créer instance de base de données SQLite
   - Exporter l'instance `db` pour utilisation dans l'application
   - Gérer les erreurs de connexion si nécessaire

2. **Configuration Drizzle Kit (`drizzle.config.ts`):**
   - Spécifier le chemin vers `src/db/schema.ts`
   - Définir le dossier de sortie des migrations (`./drizzle/migrations`)
   - Configurer le driver `better-sqlite3`
   - Spécifier le chemin vers le fichier SQLite (`./chartbastan.db`)
   - Utiliser le type `Config` de `drizzle-kit` pour type safety

3. **Schémas de Tables (`src/db/schema.ts`):**
   - Importer les helpers Drizzle depuis `drizzle-orm/sqlite-core`
   - Définir au moins une table de test (ex: `users` ou `test_table`)
   - Utiliser les conventions de nommage: `snake_case` pour tables/colonnes
   - Inclure les colonnes de base: `id` (primary key), `created_at`
   - Utiliser les types appropriés: `text`, `integer`, `boolean`, `timestamp`
   - Exporter tous les schémas pour utilisation dans l'application

4. **Migrations:**
   - Exécuter `npx drizzle-kit generate` pour créer la migration initiale
   - Vérifier que le fichier de migration est créé dans `drizzle/migrations/`
   - Examiner le SQL généré pour confirmer la structure correcte
   - Créer un script d'application de migration si nécessaire pour les futures migrations
   - Documenter le processus de génération et d'application des migrations

5. **Validation:**
   - Vérifier que le fichier de base de données SQLite existe
   - Tester une requête simple (SELECT, INSERT) avec Drizzle
   - Confirmer que les types TypeScript sont générés correctement
   - Vérifier que la configuration Drizzle Kit est fonctionnelle
   - Documenter l'emplacement et la structure des migrations

### Architecture Compliance

**Conformité avec Architecture Decision Document:**

✅ **Data Architecture:**
- SQLite Phase 1 comme spécifié
- Conventions `snake_case` pour tables/colonnes (cohérence SQLAlchemy)
- Foreign keys format `{table}_id` (ex: `user_id`)
- Indexes format `idx_{table}_{column}` (ex: `idx_users_email`)

✅ **ORM Selection:**
- Drizzle ORM v0.44.7 avec `better-sqlite3` driver
- Migrations via Drizzle Kit
- Compatible avec Server Components Next.js
- TypeScript-first pour type safety

✅ **Naming Conventions:**
- Tables: `snake_case` pluriel
- Colonnes: `snake_case`
- Foreign Keys: `{table}_id`
- Cohérence avec conventions SQLAlchemy

✅ **Code Organization:**
- `src/lib/db.ts` pour configuration
- `src/db/schema.ts` pour schémas
- `drizzle/migrations/` pour migrations versionnées
- Co-location avec tests (future)

✅ **Integration Points:**
- SQLite partagé avec FastAPI (fichier local)
- Même conventions de nommage que SQLAlchemy
- Migration vers PostgreSQL facilitée (Phase 2+)

### Library/Framework Requirements

**Packages Requis (versions exactes):**
- `drizzle-orm`: v0.44.7 (ou latest stable)
- `better-sqlite3`: latest stable
- `drizzle-kit`: latest stable (dev dependency)

**Installation Commands:**
```bash
npm install drizzle-orm better-sqlite3
npm install -D drizzle-kit
```

**Configuration Files:**
- `src/lib/db.ts` - Connexion SQLite
- `src/db/schema.ts` - Schémas Drizzle
- `drizzle.config.ts` - Configuration Drizzle Kit

**Migration Commands:**
- `npx drizzle-kit generate` - Générer migration
- `npx drizzle-kit migrate` - Appliquer migration (si nécessaire)

**Script NPM Suggestion (optionnel pour `package.json`):**
```json
{
  "scripts": {
    "db:generate": "drizzle-kit generate",
    "db:migrate": "drizzle-kit migrate",
    "db:push": "drizzle-kit push"
  }
}
```

### File Structure Requirements

**Structure Attendue après Story:**
```
chartbastan/
├── src/
│   ├── lib/
│   │   └── db.ts                    # Configuration SQLite + Drizzle (CRÉER)
│   └── db/
│       └── schema.ts                # Schémas de tables Drizzle (CRÉER)
├── drizzle/
│   └── migrations/
│       └── XXXXX_init.sql          # Migration initiale générée (CRÉÉ)
├── drizzle.config.ts                # Configuration Drizzle Kit (CRÉER)
├── package.json                     # Dépendances ajoutées (MODIFIER)
└── chartbastan.db                   # Fichier de base de données (CRÉÉ)
```

**Fichiers à créer:**
1. `src/lib/db.ts` - Configuration connexion SQLite
2. `src/db/schema.ts` - Schémas de tables
3. `drizzle.config.ts` - Configuration Drizzle Kit
4. `drizzle/migrations/` - Dossier pour migrations

**Fichiers à modifier:**
1. `package.json` - Ajouter dépendances drizzle-orm, better-sqlite3, drizzle-kit

**Fichiers générés automatiquement:**
1. `drizzle/migrations/XXXXX_init.sql` - Migration initiale
2. `chartbastan.db` - Fichier de base de données SQLite

### Testing Requirements

**Tests Recommandés (Phase 2+):**

1. **Tests de Connexion:**
   - Vérifier que la connexion SQLite s'établit correctement
   - Tester la création du fichier de base de données
   - Valider que l'instance `db` est exportée correctement

2. **Tests de Schéma:**
   - Vérifier que les schémas Drizzle sont définis correctement
   - Tester la création de tables avec les schémas
   - Valider les types TypeScript générés

3. **Tests de Migration:**
   - Vérifier que `drizzle-kit generate` crée la migration
   - Tester l'application de la migration
   - Valider que les tables sont créées dans SQLite

4. **Tests d'Intégration:**
   - Tester les requêtes SELECT/INSERT avec Drizzle
   - Vérifier la cohérence avec les conventions SQLAlchemy
   - Tester la cohérence du fichier SQLite partagé

**Frameworks de Test Suggérés:**
- Vitest pour tests unitaires TypeScript
- Testing Library pour tests d'intégration
- Playwright pour tests E2E (Phase 2+)

### References

**Sources des informations:**
- [Source: _bmad-output/planning-artifacts/epics.md#Story-1.2] - Story originale et critères d'acceptation
- [Source: _bmad-output/planning-artifacts/architecture.md#Data-Architecture] - Décisions ORM et base de données
- [Source: _bmad-output/planning-artifacts/architecture.md#ORM-Selection] - Sélection Drizzle ORM v0.44.7
- [Source: _bmad-output/planning-artifacts/architecture.md#Naming-Conventions] - Conventions de nommage database
- [Source: _bmad-output/project-context.md#Stack-Technologique] - Stack technique imposé
- [Source: _bmad-output/project-context.md#Conventions-de-Code-Nommage] - Conventions de nommage TypeScript/Database
- [Source: _bmad-output/implementation-artifacts/1-1-initialiser-le-projet-nextjs-avec-starter-template.md] - Story précédente et learnings

**Documentation Externe:**
- Drizzle ORM Documentation: https://orm.drizzle.team/docs/overview
- Drizzle Kit Documentation: https://orm.drizzle.team/docs/kit-overview
- Better SQLite3 Documentation: https://github.com/WiseLibs/better-sqlite3

## Dev Agent Record

### Agent Model Used

GLM-4.7

### Debug Log References

Aucune référence de debug pour le moment.

### Completion Notes List

- Installation des dépendances : drizzle-orm v0.44.7, better-sqlite3 v12.6.2, drizzle-kit v0.31.8
- Configuration Drizzle ORM dans `src/lib/db.ts` avec connexion SQLite et clés étrangères activées
- Configuration Drizzle Kit dans `drizzle.config.ts` avec dialect 'sqlite' et chemin migrations
- Schéma de table de test `users` créé dans `src/db/schema.ts` avec conventions snake_case
- Migration initiale générée (`0000_lively_rage.sql`) et appliquée avec succès
- Script de migration (`src/scripts/migrate.ts`) créé pour appliquer les migrations
- Tests de base de données validés : INSERT, SELECT, SELECT avec WHERE tous réussis
- Fichier de base de données `chartbastan.db` créé et fonctionnel
- Tous les critères d'acceptation satisfaits

### File List

Fichiers créés/modifiés lors de cette story:
- `chartbastan/package.json` (MODIFIER - Ajouté drizzle-orm, better-sqlite3, drizzle-kit)
- `chartbastan/src/lib/db.ts` (CRÉER - Configuration SQLite + Drizzle)
- `chartbastan/src/db/schema.ts` (CRÉER - Schémas Drizzle avec table users)
- `chartbastan/drizzle.config.ts` (CRÉER - Configuration Drizzle Kit)
- `chartbastan/src/scripts/migrate.ts` (CRÉER - Script application migrations)
- `chartbastan/src/scripts/test-db.ts` (CRÉER - Script test DB)
- `chartbastan/drizzle/migrations/0000_lively_rage.sql` (CRÉER - Migration initiale générée)
- `chartbastan/drizzle/migrations/meta/` (CRÉER - Métadonnées migrations)
- `chartbastan/chartbastan.db` (CRÉER - Fichier de base de données SQLite)
