# Options pour Upload I/O Asynchrone (P2-008)

**Date**: 2025-01-27  
**Status**: Analyse des options

---

## Contexte

L'upload actuel dans `UploadTrack` attend la fin de la copie fichier (`io.Copy`) avant de répondre, bloquant le handler HTTP.

**Problème**: Pour les gros fichiers, le handler reste bloqué pendant plusieurs minutes.

---

## Option A: 202 Accepted + Job ID (Asynchrone réel)

### Sémantique HTTP
- **Réponse**: `202 Accepted`
- **Body**: `{"track_id": "uuid", "status": "uploading", "status_url": "/api/v1/tracks/{id}/status"}`

### Comportement
1. Créer le Track en DB avec `Status=Uploading` **immédiatement**
2. Lancer la copie fichier en **goroutine** avec suivi (context + cancellation)
3. Répondre **202 Accepted** immédiatement
4. Mettre à jour le Status quand terminé (`Completed` ou `Failed`)
5. Client peut poller `/api/v1/tracks/{id}/status` pour suivre

### Avantages
- ✅ Vraiment asynchrone (handler répond immédiatement)
- ✅ Cohérent avec l'architecture existante (GetUploadStatus existe déjà)
- ✅ Traçabilité complète (logs + request_id via context)
- ✅ Gestion d'erreurs robuste (nettoyage automatique)
- ✅ Support cancellation (context)

### Inconvénients
- ⚠️ Nécessite polling côté client
- ⚠️ Plus complexe (goroutine + suivi)

### Cohérence avec l'existant
- ✅ Endpoint `GetUploadStatus` existe déjà
- ✅ Track a déjà `Status` (Uploading, Processing, Completed, Failed)
- ✅ Système de jobs existe déjà

---

## Option B: 200 OK mais Streaming Optimisé (Pas vraiment async)

### Sémantique HTTP
- **Réponse**: `200 OK` (mais après copie optimisée)
- **Body**: `{"track": {...}}`

### Comportement
1. Lancer la copie en goroutine avec channel
2. **Attendre** la fin avec timeout (comme actuellement)
3. Répondre 200 OK après copie

### Avantages
- ✅ Plus simple (pas de polling)
- ✅ Réponse immédiate avec résultat final

### Inconvénients
- ❌ **Pas vraiment asynchrone** (handler attend quand même)
- ❌ Bloque toujours le handler (même si optimisé)
- ❌ Pas de suivi de progression

---

## Recommandation: **Option A**

**Raison**: 
- Cohérent avec l'architecture existante (GetUploadStatus, Track.Status)
- Vraiment asynchrone (handler répond immédiatement)
- Meilleure UX pour gros fichiers (pas de timeout HTTP)
- Traçabilité complète

**Implémentation minimale**:
1. Créer Track avec Status=Uploading avant copie
2. Goroutine avec context pour copie + mise à jour Status
3. Handler retourne 202 Accepted
4. Client poll GetUploadStatus

---

**Décision**: ✅ **Option A** (202 Accepted)
