guidephase3
This commit is contained in:
@@ -13,8 +13,13 @@ Documentation du projet, sur le modèle de [piscine_mobile/docs](../piscine_mobi
|
||||
|
||||
## Pédagogie
|
||||
|
||||
→ [pedagogie/README.md](pedagogie/README.md)
|
||||
| Document | Lien |
|
||||
|----------|------|
|
||||
| **Reprise / état du projet** | [pedagogie/00-reprise-et-etat.md](pedagogie/00-reprise-et-etat.md) |
|
||||
| Plan des étapes | [pedagogie/README.md](pedagogie/README.md) |
|
||||
|
||||
## Dépôt de rendu 42
|
||||
## Dépôt de rendu 42 (hors dépôt de travail)
|
||||
|
||||
→ [../swiftyCompanion/README.md](../swiftyCompanion/README.md)
|
||||
Le code et le README correcteurs vivent dans **`swiftyCompanion/`** — racine du futur dépôt Intra, séparé de ce dépôt perso.
|
||||
|
||||
→ [../swiftyCompanion/README.md](../swiftyCompanion/README.md) · workflow : [../README.md](../README.md#deux-dépôts-git-distincts)
|
||||
|
||||
93
docs/pedagogie/00-reprise-et-etat.md
Normal file
93
docs/pedagogie/00-reprise-et-etat.md
Normal file
@@ -0,0 +1,93 @@
|
||||
# Reprise du projet — où nous en sommes
|
||||
|
||||
> Dernière mise à jour : projet Flutter créé dans `swiftyCompanion/swifty_companion/`.
|
||||
|
||||
## En bref
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **Fait** | Structure dépôt perso, sujet FR, paquet rendu, **projet Flutter** (`swifty_companion/`) |
|
||||
| **Pas commencé** | OAuth Intra, les 2 vues, appels API 42 |
|
||||
| **Prochaine action** | **Étape 2** — [OAuth2 Intra + token unique](etape-02-oauth-intra.md) |
|
||||
|
||||
## Arborescence actuelle
|
||||
|
||||
```
|
||||
swifty_companion/ ← dépôt Git de TRAVAIL (perso)
|
||||
├── README.md ← explique les 2 dépôts Git
|
||||
├── .gitignore ← ignore docs + swiftyCompanion/.git/
|
||||
├── docs/
|
||||
│ ├── README.md
|
||||
│ ├── sujets/
|
||||
│ │ ├── swifty-companion.md ← sujet traduit (référence)
|
||||
│ │ ├── originaux/swifty_companion_subject.pdf
|
||||
│ │ └── captures/ ← visuels PDF (couverture uniquement)
|
||||
│ └── pedagogie/
|
||||
│ ├── README.md ← plan des étapes
|
||||
│ └── 00-reprise-et-etat.md ← ce fichier
|
||||
└── swiftyCompanion/ ← futur dépôt ÉCOLE (racine Vogosphere)
|
||||
├── README.md
|
||||
├── .gitignore
|
||||
├── .env.example
|
||||
└── swifty_companion/ ← projet Flutter (lib/, android/, pubspec.yaml)
|
||||
```
|
||||
|
||||
## Décisions déjà prises
|
||||
|
||||
1. **Deux dépôts Git** : tout `docs/` et la traduction restent dans le repo perso ; l’Intra ne reçoit que le contenu de `swiftyCompanion/`.
|
||||
2. **Stack prévue** : Flutter (cohérent avec `piscine_mobile/`), modifiable en soutenance si justifié.
|
||||
3. **Secrets** : `.env` local uniquement, jamais commité (modèle dans `swiftyCompanion/.env.example`).
|
||||
4. **Sujet PDF** : pas de maquettes d’écrans — l’UI suit la liste des critères obligatoires ([sujet FR](../sujets/swifty-companion.md)).
|
||||
|
||||
## Avancement par étape
|
||||
|
||||
| Étape | Contenu | Statut |
|
||||
|-------|---------|--------|
|
||||
| **0** | Structure, traduction sujet, séparation travail / école, README rendu | ✅ **Terminé** |
|
||||
| **1** | Projet Flutter `swiftyCompanion/swifty_companion/` | ✅ **Terminé** |
|
||||
| **2** | App OAuth sur l’Intra + flux OAuth2 + token unique réutilisé | ⏳ **En cours — prochaine** |
|
||||
| **3** | Vue 1 : recherche login + erreurs (introuvable, réseau) | ⏳ |
|
||||
| **4** | Vue 2 : profil (≥ 4 champs + photo), skills, projets (dont failed) | ⏳ |
|
||||
| **5** | Retour vue 1 + layout adaptatif | ⏳ |
|
||||
| **6** | Passage checklist [swiftyCompanion/README.md](../../swiftyCompanion/README.md) | ⏳ |
|
||||
| **7** | Bonus : refresh token à expiration | ⏳ |
|
||||
|
||||
## Reprendre le travail (checklist)
|
||||
|
||||
1. Ouvrir le dépôt : `~/projets/42School/swifty_companion`
|
||||
2. Relire le [sujet traduit](../sujets/swifty-companion.md) (section obligatoire).
|
||||
3. Vérifier Flutter : `flutter doctor` et `flutter devices` (voir [piscine — Ubuntu natif](../../../piscine_mobile/docs/pedagogie/flutter/09-ubuntu-natif-dev-android.md) si besoin).
|
||||
4. Lancer l’app :
|
||||
```bash
|
||||
cd swiftyCompanion/swifty_companion
|
||||
flutter run -d <device>
|
||||
```
|
||||
5. **Étape 2** — suivre [etape-02-oauth-intra.md](etape-02-oauth-intra.md) (app OAuth Intra, `.env`, service token unique).
|
||||
6. Dans le chat : demander l’**implémentation pas à pas** du code OAuth quand l’app OAuth Intra est créée.
|
||||
|
||||
## Fichiers utiles selon le contexte
|
||||
|
||||
| Tu veux… | Fichier |
|
||||
|----------|---------|
|
||||
| Comprendre le sujet | [docs/sujets/swifty-companion.md](../sujets/swifty-companion.md) |
|
||||
| Plan complet des étapes | [docs/pedagogie/README.md](README.md) |
|
||||
| Workflow Git travail / école | [README racine](../../README.md) |
|
||||
| Soutenance / peer-eval | [swiftyCompanion/README.md](../../swiftyCompanion/README.md) |
|
||||
| Environnement Flutter | [piscine_mobile](../../../piscine_mobile/README.md) |
|
||||
|
||||
## Guides détaillés (à créer au fil du code)
|
||||
|
||||
| Fichier prévu | Quand |
|
||||
|---------------|--------|
|
||||
| `etape-01-flutter-init.md` | Après validation étape 1 |
|
||||
| `etape-02-oauth.md` | Début OAuth Intra |
|
||||
| `etape-03-vue-recherche.md` | Vue 1 |
|
||||
| `etape-04-vue-profil.md` | Vue 2 + API |
|
||||
| `etape-05-navigation-layout.md` | Navigation + responsive |
|
||||
| `etape-06-bonus-token.md` | Bonus |
|
||||
|
||||
## Notes pour la session suivante
|
||||
|
||||
- Code : projet Flutter par défaut (`lib/main.dart` compteur) — OAuth et vues à implémenter.
|
||||
- Le dépôt perso peut versionner le code dans `swiftyCompanion/` ; le remote **école** pointe uniquement sur ce sous-dossier (voir README racine).
|
||||
- Aucun `git init` obligatoire dans `swiftyCompanion/` tant que tu n’es pas prêt à lier Vogosphere.
|
||||
@@ -1,37 +1,46 @@
|
||||
# Pédagogie — Swifty Companion
|
||||
|
||||
Parcours prévu pour construire le projet **étape par étape** (guides détaillés à venir au fil de l’avancement).
|
||||
Parcours pour construire le projet **étape par étape**.
|
||||
|
||||
## Reprise rapide
|
||||
|
||||
→ **[00-reprise-et-etat.md](00-reprise-et-etat.md)** — état actuel, arborescence, prochaine action (**étape 1 : `flutter create`**).
|
||||
|
||||
## Prérequis
|
||||
|
||||
Tu as déjà une base solide via la [piscine mobile](../../../piscine_mobile/README.md) sur le même disque. Réutilise la même machine, Flutter et adb si besoin :
|
||||
Base via la [piscine mobile](../../../piscine_mobile/README.md) sur le même disque :
|
||||
|
||||
- [Flutter — Ubuntu natif (piscine)](../../../piscine_mobile/docs/pedagogie/flutter/09-ubuntu-natif-dev-android.md)
|
||||
- [Flutter — Ubuntu natif](../../../piscine_mobile/docs/pedagogie/flutter/09-ubuntu-natif-dev-android.md)
|
||||
- [Stratégie VM école / correction](../../../piscine_mobile/docs/pedagogie/flutter/07-strategie-wsl-vm-ecole-correction.md)
|
||||
|
||||
## Étapes du projet (ordre recommandé)
|
||||
## Étapes du projet
|
||||
|
||||
| Étape | Objectif | Statut doc |
|
||||
|-------|----------|------------|
|
||||
| 0 | Structure dépôt, `.env`, app OAuth Intra | ✅ [swiftyCompanion/README.md](../../swiftyCompanion/README.md) |
|
||||
| 1 | Créer le projet Flutter dans `swiftyCompanion/` | 🔜 à faire ensemble |
|
||||
| 2 | OAuth2 Intra : login, stockage token, **un token pour toutes les requêtes** | 🔜 |
|
||||
| 3 | **Vue 1** : recherche par login + gestion erreurs (404, réseau) | 🔜 |
|
||||
| 4 | **Vue 2** : profil (≥ 4 champs + image), skills, projets (validés + failed) | 🔜 |
|
||||
| 5 | Navigation retour + layout responsive (contraintes / adaptatif) | 🔜 |
|
||||
| 6 | Tests manuels + checklist peer-eval | 🔜 |
|
||||
| 7 | **Bonus** : refresh token à l’expiration | 🔜 |
|
||||
| Étape | Objectif | Statut |
|
||||
|-------|----------|--------|
|
||||
| **0** | Dépôt travail + `docs/`, sujet FR, paquet `swiftyCompanion/` (README / `.gitignore` / `.env.example`) | ✅ **Fait** — détail dans [00-reprise-et-etat.md](00-reprise-et-etat.md) |
|
||||
| **1** | Projet `swiftyCompanion/swifty_companion/` + `flutter run` | ✅ **Fait** |
|
||||
| **2** | OAuth2 Intra : login, stockage token, **un token pour toutes les requêtes** | ⏳ **Prochaine** → [etape-02-oauth-intra.md](etape-02-oauth-intra.md) |
|
||||
| **3** | **Vue 1** : recherche par login + erreurs (404, réseau) | ⏳ → [etape-03-vue-recherche.md](etape-03-vue-recherche.md) |
|
||||
| **4** | **Vue 2** : profil (≥ 4 champs + image), skills, projets (validés + failed) | ⏳ |
|
||||
| **5** | Navigation retour + layout responsive | ⏳ |
|
||||
| **6** | Tests manuels + checklist peer-eval | ⏳ |
|
||||
| **7** | **Bonus** : refresh token à l’expiration | ⏳ |
|
||||
|
||||
README correcteurs (dépôt école) : [swiftyCompanion/README.md](../../swiftyCompanion/README.md)
|
||||
|
||||
## Sujet de référence
|
||||
|
||||
→ [Traduction FR](../sujets/swifty-companion.md)
|
||||
→ [Traduction FR v4](../sujets/swifty-companion.md) · PDF : [originaux/swifty_companion_subject.pdf](../sujets/originaux/swifty_companion_subject.pdf)
|
||||
|
||||
## Convention
|
||||
## Guides détaillés
|
||||
|
||||
Les futurs guides seront nommés :
|
||||
| Fichier | Statut |
|
||||
|---------|--------|
|
||||
| [00-reprise-et-etat.md](00-reprise-et-etat.md) | ✅ À jour |
|
||||
| [etape-02-oauth-intra.md](etape-02-oauth-intra.md) | ✅ Guide étape 2 |
|
||||
| [etape-03-vue-recherche.md](etape-03-vue-recherche.md) | 🔜 après OAuth |
|
||||
| `etape-04-vue-profil.md` | 🔜 |
|
||||
| `etape-05-navigation-layout.md` | 🔜 |
|
||||
| `etape-06-bonus-token.md` | 🔜 |
|
||||
|
||||
- `etape-01-oauth.md`
|
||||
- `etape-02-vue-recherche.md`
|
||||
- etc.
|
||||
|
||||
Demande dans le chat l’étape que tu veux ouvrir : on rédigera le guide au moment où tu la attaques.
|
||||
Demande dans le chat l’étape à ouvrir : le guide correspondant sera rédigé au moment où tu la attaques.
|
||||
|
||||
161
docs/pedagogie/etape-02-oauth-intra.md
Normal file
161
docs/pedagogie/etape-02-oauth-intra.md
Normal file
@@ -0,0 +1,161 @@
|
||||
# Étape 2 — OAuth2 Intra + token unique
|
||||
|
||||
> **Prérequis :** étape 1 OK (`swiftyCompanion/swifty_companion/` créé, `flutter run` fonctionne).
|
||||
|
||||
## Objectif de l’étape
|
||||
|
||||
1. Obtenir un **access token** via **OAuth2 de l’Intra** (pas un token par requête API).
|
||||
2. Stocker les secrets dans **`.env`** (racine `swiftyCompanion/` ou dossier `swifty_companion/` — un seul endroit, documenté dans le README).
|
||||
3. Avoir un **service d’auth** réutilisable pour toutes les futures requêtes `api.intra.42.fr`.
|
||||
|
||||
Les **vues** (recherche login, profil) viennent aux étapes 3–4 ; ici on pose l’authentification API.
|
||||
|
||||
---
|
||||
|
||||
## 2.1 — Vérifier l’app
|
||||
|
||||
```bash
|
||||
cd ~/projets/42School/swifty_companion/swiftyCompanion/swifty_companion
|
||||
flutter pub get
|
||||
flutter run -d <device>
|
||||
```
|
||||
|
||||
L’écran compteur par défaut suffit pour valider l’étape 1.
|
||||
|
||||
---
|
||||
|
||||
## 2.2 — Créer l’application OAuth sur l’Intra
|
||||
|
||||
1. [profile.intra.42.fr/oauth/applications](https://profile.intra.42.fr/oauth/applications) → **New application**.
|
||||
2. Renseigner :
|
||||
- **Name** : ex. `swifty_companion_dev`
|
||||
- **Website** : URL factice ou repo perso (souvent requis)
|
||||
- **Redirect URI** : doit correspondre **exactement** à ce que l’app utilisera (voir 2.3)
|
||||
3. Noter **UID** (= `CLIENT_ID`) et **SECRET** (= `CLIENT_SECRET`).
|
||||
|
||||
Copier `swiftyCompanion/.env.example` → `.env` (même niveau que le README rendu ou dans `swifty_companion/`) :
|
||||
|
||||
```env
|
||||
CLIENT_ID=...
|
||||
CLIENT_SECRET=...
|
||||
REDIRECT_URI=...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2.3 — Choisir le `REDIRECT_URI` (mobile)
|
||||
|
||||
Deux approches courantes en Flutter :
|
||||
|
||||
| Approche | Redirect URI typique | Packages |
|
||||
|----------|----------------------|----------|
|
||||
| **Deep link** (recommandé mobile) | `com.example.swifty_companion://callback` | `flutter_appauth` + config Android/iOS |
|
||||
| **Boucle locale / custom scheme** | variante documentée dans [apidoc OAuth](https://api.intra.42.fr/apidoc) | `url_launcher` + écoute du retour |
|
||||
|
||||
Le même URI doit être :
|
||||
|
||||
- dans le formulaire Intra ;
|
||||
- dans `.env` ;
|
||||
- dans `AndroidManifest` / iOS (intent filter) si deep link.
|
||||
|
||||
**Android** : `applicationId` actuel = `com.example.swifty_companion` (`android/app/build.gradle.kts`).
|
||||
|
||||
Endpoints 42 (référence) :
|
||||
|
||||
| Étape | URL |
|
||||
|-------|-----|
|
||||
| Autorisation | `GET https://api.intra.42.fr/oauth/authorize` |
|
||||
| Token | `POST https://api.intra.42.fr/oauth/token` |
|
||||
| API | `GET https://api.intra.42.fr/v2/...` avec header `Authorization: Bearer <token>` |
|
||||
|
||||
Paramètres authorize usuels : `client_id`, `redirect_uri`, `response_type=code`, `scope=public`.
|
||||
|
||||
---
|
||||
|
||||
## 2.4 — Dépendances Flutter suggérées
|
||||
|
||||
Dans `swifty_companion/` :
|
||||
|
||||
```bash
|
||||
flutter pub add flutter_dotenv http
|
||||
# selon le flux choisi, par ex. :
|
||||
# flutter pub add flutter_appauth
|
||||
```
|
||||
|
||||
| Package | Rôle |
|
||||
|---------|------|
|
||||
| `flutter_dotenv` | Charger `.env` au démarrage |
|
||||
| `http` | Échange code → token + appels API |
|
||||
| `flutter_appauth` | Flux OAuth2 + redirect natif (optionnel mais pratique) |
|
||||
|
||||
---
|
||||
|
||||
## 2.5 — Architecture minimale (fichiers à créer)
|
||||
|
||||
```
|
||||
lib/
|
||||
├── main.dart # dotenv.load + MaterialApp
|
||||
├── config/
|
||||
│ └── env.dart # lecture CLIENT_ID, etc.
|
||||
└── services/
|
||||
└── intra_auth_service.dart # token en mémoire (singleton)
|
||||
```
|
||||
|
||||
Règles sujet :
|
||||
|
||||
- **Un seul token** : le service le garde après le login OAuth ; les futures requêtes réutilisent `getAccessToken()`.
|
||||
- **Ne pas** appeler `/oauth/token` avant chaque `GET /v2/users/...`.
|
||||
|
||||
Pseudo-contrat du service :
|
||||
|
||||
```dart
|
||||
class IntraAuthService {
|
||||
String? _accessToken;
|
||||
String? get accessToken => _accessToken;
|
||||
bool get isAuthenticated => _accessToken != null;
|
||||
|
||||
Future<void> signIn(); // ouvre le flux OAuth, stocke le token
|
||||
Future<String> getValidToken(); // retourne le token (bonus : refresh plus tard)
|
||||
}
|
||||
```
|
||||
|
||||
Test manuel étape 2 : bouton « Se connecter à l’Intra » → navigateur / WebView → retour app → afficher temporairement « Connecté » ou le login `/v2/me`.
|
||||
|
||||
---
|
||||
|
||||
## 2.6 — `.env` et assets
|
||||
|
||||
Si `flutter_dotenv` charge depuis la racine du package Flutter :
|
||||
|
||||
1. Placer `.env` dans `swifty_companion/` (ignoré par git).
|
||||
2. Déclarer dans `pubspec.yaml` :
|
||||
|
||||
```yaml
|
||||
flutter:
|
||||
assets:
|
||||
- .env
|
||||
```
|
||||
|
||||
> En production soutenance : les correcteurs créent **leur** `.env` avec **leur** app OAuth ; ne jamais committer le fichier.
|
||||
|
||||
---
|
||||
|
||||
## 2.7 — Critère « terminé » pour l’étape 2
|
||||
|
||||
| Check | OK si |
|
||||
|-------|--------|
|
||||
| OAuth Intra | Connexion obtient un access token |
|
||||
| Token unique | Plusieurs appels API utilisent le **même** token sans re-login |
|
||||
| Secrets | Uniquement dans `.env`, pas dans le code en dur |
|
||||
| Doc | README rendu rappelle où mettre `.env` et comment lancer l’app |
|
||||
|
||||
---
|
||||
|
||||
## Ensuite — étape 3
|
||||
|
||||
→ [etape-03-vue-recherche.md](etape-03-vue-recherche.md) (à rédiger quand l’étape 2 est validée) : **vue 1** — champ login, appel API, erreurs 404 / réseau.
|
||||
|
||||
Documentation API utile :
|
||||
|
||||
- [apidoc](https://api.intra.42.fr/apidoc)
|
||||
- User : `GET /v2/users/:id` ou recherche par login (voir doc)
|
||||
12
docs/pedagogie/etape-03-vue-recherche.md
Normal file
12
docs/pedagogie/etape-03-vue-recherche.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# Étape 3 — Vue 1 (recherche par login)
|
||||
|
||||
> **Prérequis :** [étape 2 — OAuth Intra](etape-02-oauth-intra.md) terminée (token disponible).
|
||||
|
||||
## Objectif
|
||||
|
||||
- **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.
|
||||
|
||||
Guide détaillé à compléter quand l’étape 2 est OK — demande l’implémentation pas à pas dans le chat.
|
||||
@@ -143,7 +143,7 @@ Bonus disponible :
|
||||
|
||||
Déposez le travail dans votre **dépôt Git** comme d’habitude. **Seul le contenu du dépôt** sera évalué en soutenance. Vérifiez les **noms de dossiers et de fichiers**.
|
||||
|
||||
→ Checklist pratique : [../../swiftyCompanion/README.md](../../swiftyCompanion/README.md)
|
||||
→ Checklist soutenance (dépôt école) : [../../swiftyCompanion/README.md](../../swiftyCompanion/README.md) — dossier **non** inclus dans le rendu Intra si tu ne pousses que ce sous-répertoire.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user