107 lines
3.1 KiB
Markdown
107 lines
3.1 KiB
Markdown
# Étape 3 — Vue 1 : recherche par login
|
||
|
||
> **Prérequis :** étape 2 OK — OAuth actif, token unique (`IntraAuthService`).
|
||
|
||
## Objectif sujet
|
||
|
||
| 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) |
|
||
|
||
---
|
||
|
||
## 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/
|
||
│ ├── 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.
|