lot2
This commit is contained in:
@@ -1,7 +1,37 @@
|
||||
# Renommer / copier en .env — ne jamais committer .env
|
||||
# Application OAuth : https://profile.intra.42.fr/oauth/applications
|
||||
# =============================================================================
|
||||
# Swifty Companion — modèle de configuration (PAS de secrets réels ici)
|
||||
# =============================================================================
|
||||
#
|
||||
# 1) Copier ce fichier vers le package Flutter :
|
||||
# cp .env.example swifty_companion/.env
|
||||
# (depuis la racine de ce dépôt, dossier swiftyCompanion/)
|
||||
#
|
||||
# 2) Remplir les valeurs depuis ton application OAuth sur l’Intra 42 :
|
||||
# https://profile.intra.42.fr/oauth/applications
|
||||
#
|
||||
# 3) Ne JAMAIS committer le fichier .env (le sujet prévoit l’échec direct si
|
||||
# des identifiants sont exposés publiquement). Ce .env.example peut être
|
||||
# versionné : il ne contient que des noms de variables et des exemples.
|
||||
#
|
||||
# =============================================================================
|
||||
|
||||
# CLIENT_ID — sur l’Intra, champ « UID » de l’application OAuth.
|
||||
# C’est l’identifiant public de ton app (pas ton login 42).
|
||||
# Exemple de forme : u-s4t2ud-xxxxxxxx...
|
||||
CLIENT_ID=
|
||||
|
||||
# CLIENT_SECRET — sur l’Intra, champ « SECRET » de l’application OAuth.
|
||||
# Sert à échanger le code OAuth contre un access token. À garder strictement
|
||||
# privé : uniquement dans .env local, jamais sur Git ni dans le chat.
|
||||
# Exemple de forme : s-s4t2ud-xxxxxxxx...
|
||||
CLIENT_SECRET=
|
||||
# Identique au champ « URI de redirection » sur l’Intra (une seule ligne, sans guillemets)
|
||||
|
||||
# REDIRECT_URI — URI de redirection enregistrée sur l’Intra (caractère pour
|
||||
# caractère identique dans le formulaire et ici).
|
||||
# Pour un téléphone Android avec ce projet : schéma custom + host callback
|
||||
# (voir aussi android/app/src/main/AndroidManifest.xml).
|
||||
REDIRECT_URI=com.example.swiftycompanion://callback
|
||||
|
||||
# Scopes à cocher sur l’Intra lors de la création de l’app (pas dans .env) :
|
||||
# - public (données publiques utilisateur)
|
||||
# - projects (liste projects_users sur le profil — sans cela, erreur 403)
|
||||
|
||||
@@ -1,87 +1,100 @@
|
||||
# Swifty Companion
|
||||
|
||||
Application mobile — profil étudiant 42 via l’**API Intra** (OAuth2).
|
||||
Application mobile Flutter : recherche d’un login 42 et affichage du profil (API Intra, OAuth2).
|
||||
|
||||
> **Dépôt de rendu école** : ce dossier est la **racine** du dépôt Git Vogosphere. Pas de `docs/` ni de sujet traduit ici (dépôt perso séparé).
|
||||
## Prérequis
|
||||
|
||||
**État :** partie obligatoire + **bonus refresh token** (401 → refresh → retry API).
|
||||
- Flutter SDK (voir [flutter.dev](https://flutter.dev))
|
||||
- Un téléphone ou émulateur Android configuré (`flutter doctor`)
|
||||
- Une application OAuth créée sur l’Intra : [Applications API](https://profile.intra.42.fr/oauth/applications)
|
||||
|
||||
## Lancer le projet
|
||||
## Installation
|
||||
|
||||
À la racine de **ce** dépôt Git (dossier qui contient `swifty_companion/`) :
|
||||
|
||||
```bash
|
||||
cd swifty_companion
|
||||
# Créer .env ici (voir .env.example à la racine du dépôt école)
|
||||
flutter pub get
|
||||
flutter run -d <device>
|
||||
cp ../.env.example .env
|
||||
```
|
||||
|
||||
Le fichier **`.env`** doit être dans **`swifty_companion/.env`** (déclaré comme asset dans `pubspec.yaml`).
|
||||
Édite `swifty_companion/.env` : renseigne `CLIENT_ID`, `CLIENT_SECRET` et `REDIRECT_URI` (voir commentaires dans `.env.example` à la racine).
|
||||
|
||||
Vérifications :
|
||||
Puis :
|
||||
|
||||
```bash
|
||||
flutter doctor
|
||||
flutter devices
|
||||
flutter pub get
|
||||
flutter run -d <identifiant_appareil>
|
||||
```
|
||||
|
||||
Lister les appareils : `flutter devices`.
|
||||
|
||||
## Configuration OAuth (résumé)
|
||||
|
||||
| Variable `.env` | Sur l’Intra 42 |
|
||||
|-----------------|----------------|
|
||||
| `CLIENT_ID` | **UID** de l’application |
|
||||
| `CLIENT_SECRET` | **SECRET** de l’application |
|
||||
| `REDIRECT_URI` | **URI de redirection** (ex. `com.example.swiftycompanion://callback`) |
|
||||
|
||||
Scopes à activer sur l’application : **public** et **projects**.
|
||||
|
||||
La redirect URI doit être la même sur l’Intra, dans `.env`, et dans la config Android du projet.
|
||||
|
||||
**Important :** le fichier `.env` reste sur ta machine uniquement. Ce dépôt contient `.env.example` sans vraies clés. Ne pousse jamais `.env` sur le Git de rendu.
|
||||
|
||||
Documentation API : [api.intra.42.fr/apidoc](https://api.intra.42.fr/apidoc)
|
||||
|
||||
## Utilisation
|
||||
|
||||
1. Ouvrir l’app → **Se connecter avec 42** (une fois par session).
|
||||
2. Saisir un **login** → **Rechercher**.
|
||||
3. Consulter le **profil** (photo, informations, skills, projets validés ou en échec).
|
||||
4. **Retour** → nouvelle recherche avec le même token (pas de nouvelle connexion OAuth à chaque fois).
|
||||
|
||||
Certaines données peuvent s’afficher comme « — » : l’API peut masquer des champs selon la confidentialité.
|
||||
|
||||
## Vérifications avant soutenance
|
||||
|
||||
```bash
|
||||
cd swifty_companion
|
||||
flutter analyze
|
||||
flutter test
|
||||
```
|
||||
|
||||
## Configuration (`.env`)
|
||||
|
||||
1. App OAuth : [profile.intra.42.fr/oauth/applications](https://profile.intra.42.fr/oauth/applications)
|
||||
2. Scopes : **`public`** + **`projects`** (projets sur le profil)
|
||||
3. Redirect URI (ex. téléphone) : `com.example.swiftycompanion://callback` — identique sur l’Intra et dans `.env`
|
||||
4. Ne **jamais** committer `.env`
|
||||
|
||||
API : [api.intra.42.fr/apidoc](https://api.intra.42.fr/apidoc)
|
||||
|
||||
## Parcours app
|
||||
|
||||
1. **Se connecter avec 42** (token réutilisé pour toutes les requêtes)
|
||||
2. **Rechercher** un login
|
||||
3. **Profil** : photo, champs, skills (niveau + %), projets validés et failed
|
||||
4. **Retour** → nouvelle recherche
|
||||
|
||||
## Partie obligatoire (rappel sujet v4)
|
||||
## Critères du sujet (v4) couverts par l’app
|
||||
|
||||
| # | Exigence |
|
||||
|---|----------|
|
||||
| 1 | Au moins **2 vues** |
|
||||
| 2 | **Toutes** les erreurs gérées (login inconnu, réseau, …) |
|
||||
| 3 | Vue 2 : infos du login s’il **existe** |
|
||||
| 4 | **≥ 4 détails** + **photo de profil** |
|
||||
| 5 | **Skills** : niveau + pourcentage |
|
||||
| 6 | **Projets** réalisés, **y compris les failed** |
|
||||
| 7 | Retour possible vers la **vue 1** |
|
||||
| 8 | Layout **adaptatif** |
|
||||
| 9 | **OAuth2** — **un token** réutilisé |
|
||||
|
||||
Certaines données peuvent être masquées par l’API (confidentialité).
|
||||
| 1 | Deux écrans : recherche et profil |
|
||||
| 2 | Erreurs gérées (login inconnu, réseau, session, etc.) |
|
||||
| 3 | Profil affiché si le login existe |
|
||||
| 4 | Au moins quatre informations + photo |
|
||||
| 5 | Skills avec niveau et pourcentage |
|
||||
| 6 | Projets terminés, y compris en échec |
|
||||
| 7 | Retour vers l’écran de recherche |
|
||||
| 8 | Mise en page adaptée (scroll, grands écrans) |
|
||||
| 9 | Un seul flux OAuth, token réutilisé pour les appels API |
|
||||
|
||||
## Bonus
|
||||
|
||||
- Refresh token : `IntraAuthService.refreshAccessToken()` + retry dans `intraApiGet` sur 401.
|
||||
Rafraîchissement du token d’accès lorsque l’API renvoie 401, puis nouvelle tentative de la requête (sans refaire l’écran de connexion 42).
|
||||
|
||||
## Soutenance — checklist peer-eval
|
||||
## Déroulé de démonstration (peer-eval)
|
||||
|
||||
| # | Test | Démo |
|
||||
|---|------|------|
|
||||
| 1 | `flutter test` | Tests OK |
|
||||
| 2 | `flutter run -d <device>` | Vue 1 → login valide → vue 2 |
|
||||
| 3 | Profil | Photo + ≥ 4 champs + skills + projets (dont failed) |
|
||||
| 4 | Login invalide | Message clair, pas de crash |
|
||||
| 5 | Réseau coupé | Erreur réseau gérée |
|
||||
| 6 | Navigation | Retour vue 1, nouvelle recherche |
|
||||
| 7 | Petit écran / rotation | UI lisible |
|
||||
| 8 | Bonus | Refresh token si implémenté |
|
||||
1. `flutter test`
|
||||
2. `flutter run` → connexion 42 → login valide → profil complet
|
||||
3. Login invalide → message d’erreur
|
||||
4. Mode avion (ou réseau coupé) → message réseau
|
||||
5. Retour à la recherche → nouvelle recherche
|
||||
6. Rotation ou petit écran → interface lisible
|
||||
7. Bonus : expliquer ou montrer le refresh token si demandé
|
||||
|
||||
**Ordre suggéré :** connexion → profil → login faux → hors ligne → retour → `flutter test`.
|
||||
## Structure du dépôt
|
||||
|
||||
## Fichiers de ce dépôt
|
||||
|
||||
| Fichier | Rôle |
|
||||
|---------|------|
|
||||
| `README.md` | Ce document |
|
||||
| `.gitignore` | Exclut `.env`, build, etc. |
|
||||
| `.env.example` | Modèle sans secrets |
|
||||
| `swifty_companion/` | Projet Flutter (`lib/`, `android/`, …) |
|
||||
```text
|
||||
.
|
||||
├── README.md # ce fichier
|
||||
├── .gitignore
|
||||
├── .env.example # modèle (sans secrets)
|
||||
└── swifty_companion/ # code Flutter (lib/, android/, test/, …)
|
||||
```
|
||||
|
||||
9
swiftyCompanion/swifty_companion/.env.example
Normal file
9
swiftyCompanion/swifty_companion/.env.example
Normal file
@@ -0,0 +1,9 @@
|
||||
# Copier en .env dans CE dossier (swifty_companion/) :
|
||||
# cp .env.example .env
|
||||
# Puis éditer .env avec ton UID, SECRET et REDIRECT_URI Intra.
|
||||
#
|
||||
# Modèle détaillé (mêmes variables) : ../.env.example à la racine du dépôt.
|
||||
|
||||
CLIENT_ID=
|
||||
CLIENT_SECRET=
|
||||
REDIRECT_URI=com.example.swiftycompanion://callback
|
||||
@@ -1,17 +1,14 @@
|
||||
# swifty_companion
|
||||
# Package Flutter — Swifty Companion
|
||||
|
||||
A new Flutter project.
|
||||
Le projet s’exécute depuis ce dossier.
|
||||
|
||||
## Getting Started
|
||||
## Démarrage rapide
|
||||
|
||||
This project is a starting point for a Flutter application.
|
||||
```bash
|
||||
cp .env.example .env # ou : cp ../.env.example .env
|
||||
# Éditer .env (CLIENT_ID, CLIENT_SECRET, REDIRECT_URI)
|
||||
flutter pub get
|
||||
flutter run -d <device>
|
||||
```
|
||||
|
||||
A few resources to get you started if this is your first Flutter project:
|
||||
|
||||
- [Learn Flutter](https://docs.flutter.dev/get-started/learn-flutter)
|
||||
- [Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
|
||||
- [Flutter learning resources](https://docs.flutter.dev/reference/learning-resources)
|
||||
|
||||
For help getting started with Flutter development, view the
|
||||
[online documentation](https://docs.flutter.dev/), which offers tutorials,
|
||||
samples, guidance on mobile development, and a full API reference.
|
||||
Instructions complètes (OAuth, soutenance, structure du dépôt) : **README.md à la racine du dépôt** (dossier parent).
|
||||
|
||||
Reference in New Issue
Block a user