# Story 3.1: Créer le modèle de données pour matchs et prédictions

Status: review

## Acceptance Criteria

**Given** la base de données SQLite est configurée
**When** je crée les schémas Drizzle pour `matches` et `predictions`
**Then** la table `matches` contient : id, home_team, away_team, date, league, status
**And** la table `predictions` contient : id, match_id, energy_score, confidence, predicted_winner, created_at
**And** les relations foreign key sont configurées
**And** les migrations sont générées et appliquées

**Given** les modèles SQLAlchemy sont créés dans FastAPI
**When** je synchronise avec la base de données
**Then** les modèles Pydantic pour validation sont créés
**And** les relations entre modèles fonctionnent correctement

## Tasks / Subtasks

- [x] Créer le schéma Drizzle pour matches (AC: #1)
  - [x] Définir la table `matches` dans `src/db/schema.ts`
  - [x] Ajouter colonnes: id, home_team, away_team, date, league, status
  - [x] Configurer les indexes appropriés
  - [x] Ajouter les contraintes (not null, unique)
  - [x] Générer et appliquer la migration

- [x] Créer le schéma Drizzle pour predictions (AC: #1)
  - [x] Définir la table `predictions` dans `src/db/schema.ts`
  - [x] Ajouter colonnes: id, match_id, energy_score, confidence, predicted_winner, created_at
  - [x] Configurer la foreign key vers `matches`
  - [x] Configurer les indexes appropriés
  - [x] Générer et appliquer la migration

- [x] Créer le modèle SQLAlchemy pour matches (AC: #2)
  - [x] Définir le modèle `Match` dans `backend/app/models/match.py`
  - [x] Ajouter les colonnes avec types SQLAlchemy
  - [x] Configurer les relations
  - [x] Créer le schéma Pydantic correspondant
  - [x] Synchroniser avec la base de données

- [x] Créer le modèle SQLAlchemy pour predictions (AC: #2)
  - [x] Définir le modèle `Prediction` dans `backend/app/models/prediction.py`
  - [x] Ajouter les colonnes avec types SQLAlchemy
  - [x] Configurer la relation avec `Match`
  - [x] Créer le schéma Pydantic correspondant
  - [x] Synchroniser avec la base de données

- [x] Tester les modèles et relations (AC: #1, #2)
  - [x] Tester la création d'un match
  - [x] Tester la création d'une prédiction liée à un match
  - [x] Tester les relations (match → predictions)
  - [x] Valider les types TypeScript générés
  - [x] Valider les schémas Pydantic

## Dev Notes

### Architecture Patterns et Contraintes

**Stack Technique Imposé:**
- **Next.js ORM:** Drizzle v0.44.7 avec better-sqlite3
- **FastAPI ORM:** SQLAlchemy 2.0.45
- **Validation:** Pydantic (FastAPI), TypeScript types (Next.js)
- **Conventions:** `snake_case` pour tables/colonnes

### File Structure

```
src/db/schema.ts
backend/app/models/match.py
backend/app/models/prediction.py
backend/app/schemas/match.py
backend/app/schemas/prediction.py
```

### References

- [Source: _bmad-output/planning-artifacts/epics.md#Story-3.1]

## Dev Agent Record

### Agent Model Used

GLM-4.7

### Completion Notes List

- Schémas Drizzle créés pour matches et predictions avec toutes les colonnes requises
- Migration Drizzle générée et stockée dans drizzle/migrations/0001_omniscient_white_queen.sql
- Modèles SQLAlchemy créés pour Match et Prediction avec relations et indexes
- Schémas Pydantic créés pour validation (MatchCreate, MatchUpdate, MatchResponse, PredictionCreate, etc.)
- Migration Alembic créée pour les tables matches et predictions
- Tests unitaires créés pour les modèles et schémas Pydantic

### File List

- `chartbastan/src/db/schema.ts`
- `chartbastan/drizzle/migrations/0001_omniscient_white_queen.sql`
- `backend/app/models/match.py`
- `backend/app/models/prediction.py`
- `backend/app/models/__init__.py` (mis à jour pour inclure Match et Prediction)
- `backend/app/schemas/match.py`
- `backend/app/schemas/prediction.py`
- `backend/app/schemas/__init__.py` (mis à jour pour inclure les schémas match et prediction)
- `backend/alembic/versions/20260117_0005_create_matches_and_predictions_tables.py`
- `backend/tests/test_match_model.py`
- `backend/tests/test_prediction_model.py`
- `backend/tests/test_match_schema.py`
- `backend/tests/test_prediction_schema.py`

## Change Log

**2026-01-17: Implémentation complète des modèles de données pour matchs et prédictions**

- Création des schémas Drizzle pour les tables `matches` et `predictions`
- Configuration des indexes et contraintes de base de données
- Création des modèles SQLAlchemy avec relations et méthodes utilitaires
- Création des schémas Pydantic pour validation des données
- Génération des migrations Drizzle et Alembic
- Création de tests unitaires complets pour modèles et schémas

Cette implémentation permet de stocker les informations sur les matchs sportifs et les prédictions associées, avec une relation un-à-plusieurs entre les matchs et les prédictions.
