etape3
This commit is contained in:
@@ -1,12 +1,107 @@
|
||||
# Étape 3 — Vue 1 (recherche par login)
|
||||
# Étape 3 — Vue 1 : recherche par login
|
||||
|
||||
> **Prérequis :** [étape 2 — OAuth Intra](etape-02-oauth-intra.md) terminée (token disponible).
|
||||
> **Prérequis :** étape 2 OK — OAuth actif, token unique (`IntraAuthService`).
|
||||
|
||||
## Objectif
|
||||
## Objectif sujet
|
||||
|
||||
- **Première vue** : saisie d’un **login** 42 + bouton rechercher.
|
||||
- Appel API avec le **token OAuth** déjà obtenu.
|
||||
- Gestion des erreurs : **utilisateur introuvable**, **réseau**, token invalide / non connecté.
|
||||
- Navigation vers la **vue 2** si le login existe.
|
||||
| Exigence | Cette étape |
|
||||
|----------|-------------|
|
||||
| Au moins 2 vues | **Vue 1** : recherche · **Vue 2** : profil (étape 4) |
|
||||
| Erreurs gérées | Login introuvable, réseau, non connecté |
|
||||
| Token unique | Réutiliser `IntraAuthService.instance` (ne pas refaire OAuth) |
|
||||
|
||||
Guide détaillé à compléter quand l’étape 2 est OK — demande l’implémentation pas à pas dans le chat.
|
||||
---
|
||||
|
||||
## Parcours utilisateur (vue 1)
|
||||
|
||||
1. L’utilisateur est déjà connecté à l’API (étape 2) — ou bouton « Se connecter » si token absent.
|
||||
2. **Champ texte** + bouton **Rechercher** (login 42, ex. `jdoe`).
|
||||
3. Appel API avec `Authorization: Bearer <token>`.
|
||||
4. **Succès** → navigation vers **vue 2** (profil).
|
||||
5. **Échec** → message clair, pas de crash.
|
||||
|
||||
---
|
||||
|
||||
## API 42 utile
|
||||
|
||||
Doc : [api.intra.42.fr/apidoc](https://api.intra.42.fr/apidoc)
|
||||
|
||||
| Action | Requête typique |
|
||||
|--------|-----------------|
|
||||
| Utilisateur par login | `GET /v2/users/{login}` ou `GET /v2/users?filter[login]=<login>` |
|
||||
| Toi (déjà fait) | `GET /v2/me` |
|
||||
|
||||
Vérifier dans l’apidoc la forme exacte supportée ; beaucoup de projets utilisent :
|
||||
|
||||
```http
|
||||
GET https://api.intra.42.fr/v2/users?filter[login]=jdoe
|
||||
Authorization: Bearer <access_token>
|
||||
```
|
||||
|
||||
Réponse : tableau JSON ; **vide** = login inconnu.
|
||||
|
||||
---
|
||||
|
||||
## Fichiers à ajouter (étape 3)
|
||||
|
||||
```
|
||||
lib/
|
||||
├── services/
|
||||
│ ├── intra_auth_service.dart # existant
|
||||
│ └── intra_user_service.dart # GET user(s) avec token
|
||||
├── screens/
|
||||
│ ├── auth_screen.dart # option : fusionner ou garder login au démarrage
|
||||
│ ├── search_screen.dart # VUE 1
|
||||
│ └── profile_screen.dart # VUE 2 (squelette → étape 4)
|
||||
└── main.dart # home → SearchScreen si token OK
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## `IntraUserService` (idée)
|
||||
|
||||
- Méthode `Future<Map<String, dynamic>> fetchUserByLogin(String login)`.
|
||||
- Utilise `IntraAuthService.instance.authHeaders()`.
|
||||
- **404 / liste vide** → exception métier `UserNotFoundException`.
|
||||
- **Socket / timeout** → `NetworkException`.
|
||||
- **401** → token expiré → message « reconnecte-toi ».
|
||||
|
||||
---
|
||||
|
||||
## Gestion des erreurs (sujet)
|
||||
|
||||
| Situation | Message utilisateur (exemple) |
|
||||
|-----------|-------------------------------|
|
||||
| Login inconnu | `Aucun utilisateur pour ce login` |
|
||||
| Pas de réseau | `Connexion impossible. Vérifie le réseau.` |
|
||||
| Non connecté OAuth | `Connecte-toi d’abord à l’API 42` |
|
||||
| Champ vide | `Saisis un login` |
|
||||
|
||||
---
|
||||
|
||||
## Navigation
|
||||
|
||||
```text
|
||||
SearchScreen --[login trouvé]--> ProfileScreen(login)
|
||||
ProfileScreen --[retour]--> SearchScreen
|
||||
```
|
||||
|
||||
`Navigator.push` / `pop` ou `go_router` — rester simple (Navigator 1.0 suffit).
|
||||
|
||||
---
|
||||
|
||||
## Critères « étape 3 terminée »
|
||||
|
||||
| # | Test |
|
||||
|---|------|
|
||||
| 1 | Login valide (ex. `fgras-ca`) → ouvre vue 2 |
|
||||
| 2 | Login `zzzzzzzz` → message erreur |
|
||||
| 3 | Mode avion → message réseau |
|
||||
| 4 | Retour depuis vue 2 → nouvelle recherche possible |
|
||||
| 5 | Un seul OAuth ; les recherches réutilisent le même token |
|
||||
|
||||
---
|
||||
|
||||
## Ensuite — étape 4
|
||||
|
||||
→ [etape-04-vue-profil.md](etape-04-vue-profil.md) : photo, ≥ 4 champs, skills, projets (dont failed), layout adaptatif.
|
||||
|
||||
Reference in New Issue
Block a user