docs: dossier de deploiement/securisation, presentation BLOC 3 et CHANGELOG
CI - Web (Laravel) / quality-and-tests (pull_request) Failing after 4m4s
CI - Web (Laravel) / quality-and-tests (pull_request) Failing after 4m4s
- docs/Dossier_Deploiement_Securisation_CESIZen.docx (15-20 pages) - presentation_bloc3.js -> CESIZen_Presentation_Bloc3.pptx (10 slides) - diagrammes architecture et CI/CD (docs/img) - CHANGELOG.md (versionnage semantique) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,456 @@
|
||||
# Documentation Technique — CESIZen
|
||||
|
||||
## Table des matières
|
||||
|
||||
1. [Présentation du projet](#1-présentation-du-projet)
|
||||
2. [Architecture globale](#2-architecture-globale)
|
||||
3. [Application Web (Laravel)](#3-application-web-laravel)
|
||||
- [Stack technique](#31-stack-technique)
|
||||
- [Structure des dossiers](#32-structure-des-dossiers)
|
||||
- [Modèles de données](#33-modèles-de-données)
|
||||
- [Routes & Contrôleurs Web](#34-routes--contrôleurs-web)
|
||||
- [API REST](#35-api-rest)
|
||||
- [Administration Filament](#36-administration-filament)
|
||||
- [Services](#37-services)
|
||||
4. [Application Mobile (Flutter)](#4-application-mobile-flutter)
|
||||
- [Stack technique](#41-stack-technique)
|
||||
- [Architecture](#42-architecture)
|
||||
- [Fonctionnalités](#43-fonctionnalités)
|
||||
5. [Application Wear OS](#5-application-wear-os)
|
||||
- [Stack technique](#51-stack-technique)
|
||||
- [Fonctionnement](#52-fonctionnement)
|
||||
6. [Base de données](#6-base-de-données)
|
||||
7. [Déploiement](#7-déploiement)
|
||||
|
||||
---
|
||||
|
||||
## 1. Présentation du projet
|
||||
|
||||
**CESIZen** est une application de bien-être mental destinée aux étudiants et collaborateurs CESI. Elle propose :
|
||||
|
||||
- Un **diagnostic de stress** basé sur l'échelle Holmes & Rahe (événements de vie stressants cotés en points)
|
||||
- Un **tracker émotionnel** pour enregistrer et suivre son humeur au quotidien
|
||||
- Des **activités de relaxation** (méditation, respiration, yoga, etc.) avec gestion des favoris
|
||||
- Des **informations / articles** bien-être publiés par les administrateurs
|
||||
- Une **application Wear OS** pour enregistrer son humeur directement depuis la montre
|
||||
|
||||
---
|
||||
|
||||
## 2. Architecture globale
|
||||
|
||||
```
|
||||
CESIZen/
|
||||
├── WEB/ → Backend Laravel + Frontend Blade + API REST + Admin Filament
|
||||
├── mobile/ → Application Flutter (iOS & Android)
|
||||
└── Wear/ → Application Wear OS (Kotlin/Jetpack Compose)
|
||||
```
|
||||
|
||||
La communication entre les composants :
|
||||
|
||||
```
|
||||
[Navigateur] ←→ [Laravel WEB (Blade + Sanctum)]
|
||||
[App Flutter] ←→ [Laravel API REST (Sanctum Token)]
|
||||
[Montre Wear] ←→ [App Flutter] ←→ [Laravel API REST]
|
||||
(via Wearable Data Layer API)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Application Web (Laravel)
|
||||
|
||||
### 3.1 Stack technique
|
||||
|
||||
| Élément | Technologie |
|
||||
|---|---|
|
||||
| Framework | Laravel 11 |
|
||||
| Admin Panel | Filament 3 |
|
||||
| Auth API | Laravel Sanctum |
|
||||
| Base de données | SQLite (dev) / MySQL (prod) |
|
||||
| Frontend | Blade + Vite |
|
||||
| Tests | PHPUnit |
|
||||
| Conteneurisation | Docker + Nginx |
|
||||
|
||||
### 3.2 Structure des dossiers
|
||||
|
||||
```
|
||||
WEB/
|
||||
├── app/
|
||||
│ ├── Filament/
|
||||
│ │ └── Resources/
|
||||
│ │ └── UserResource/ ← CRUD utilisateurs dans l'admin
|
||||
│ ├── Http/
|
||||
│ │ └── Controllers/
|
||||
│ │ ├── Api/ ← Contrôleurs pour l'API mobile
|
||||
│ │ │ ├── AuthController.php
|
||||
│ │ │ ├── EmotionController.php
|
||||
│ │ │ ├── InformationController.php
|
||||
│ │ │ └── StressDiagnosticController.php
|
||||
│ │ └── Web/ ← Contrôleurs pour les pages Blade
|
||||
│ │ ├── AuthController.php
|
||||
│ │ ├── DiagnosticController.php
|
||||
│ │ ├── EmotionController.php
|
||||
│ │ ├── InformationController.php
|
||||
│ │ ├── ProfileController.php
|
||||
│ │ └── RelaxationController.php
|
||||
│ ├── Models/ ← Modèles Eloquent
|
||||
│ └── Services/
|
||||
│ └── StressCalculator.php ← Logique de calcul du score de stress
|
||||
├── database/
|
||||
│ ├── migrations/
|
||||
│ └── seeders/
|
||||
├── routes/
|
||||
│ ├── api.php ← Routes API (préfixe /api)
|
||||
│ └── web.php ← Routes Web (Blade)
|
||||
├── Dockerfile
|
||||
└── docker-compose.yml
|
||||
```
|
||||
|
||||
### 3.3 Modèles de données
|
||||
|
||||
#### `User`
|
||||
| Champ | Type | Description |
|
||||
|---|---|---|
|
||||
| `id` | int | Clé primaire |
|
||||
| `name` | string | Nom complet |
|
||||
| `email` | string | Adresse email (unique) |
|
||||
| `password` | string | Mot de passe hashé |
|
||||
| `id_role` | int | FK → `roles` |
|
||||
| `is_active` | boolean | Compte actif/désactivé |
|
||||
|
||||
Relations :
|
||||
- `role()` → `BelongsTo(Role)` — rôle de l'utilisateur
|
||||
- `emotionRecords()` → `HasMany(EmotionRecord)` — historique émotionnel
|
||||
- `favoritedActivities()` → `BelongsToMany(RelaxationActivity)` via table `favorites`
|
||||
|
||||
> L'accès au panel Filament est restreint aux utilisateurs avec `is_active = true` ET rôle `Admin`.
|
||||
|
||||
#### `Role`
|
||||
Rôles disponibles : `Admin`, `User`.
|
||||
|
||||
#### `StressEvent`
|
||||
Événements de vie stressants de l'échelle Holmes & Rahe.
|
||||
|
||||
| Champ | Type | Description |
|
||||
|---|---|---|
|
||||
| `event_name` | string | Nom de l'événement |
|
||||
| `points` | int | Valeur en points de stress |
|
||||
|
||||
#### `ResultatDiag`
|
||||
Résultat d'un diagnostic de stress effectué par un utilisateur.
|
||||
|
||||
Champs : `user_id`, `score` (total des points), `level` (Faible / Modéré / Élevé), `events` (JSON des événements cochés).
|
||||
|
||||
#### `EmotionRecord`
|
||||
Enregistrement d'une émotion quotidienne.
|
||||
|
||||
| Champ | Type | Description |
|
||||
|---|---|---|
|
||||
| `user_id` | int | FK → `users` |
|
||||
| `emotion` | string | Nom de l'émotion |
|
||||
| `intensity` | int | Intensité (1–5) |
|
||||
| `note` | string (nullable) | Note libre |
|
||||
|
||||
#### `RelaxationActivity`
|
||||
Activité de relaxation disponible dans le catalogue.
|
||||
|
||||
| Champ | Type | Description |
|
||||
|---|---|---|
|
||||
| `title` | string | Titre de l'activité |
|
||||
| `type` | string | Type : méditation, respiration, yoga, etc. |
|
||||
| `duration` | int | Durée en minutes |
|
||||
| `url` | string | Lien vers la ressource (vidéo, audio…) |
|
||||
| `description` | string | Description |
|
||||
|
||||
Relations :
|
||||
- `favoritedBy()` → `BelongsToMany(User)` via table `favorites`
|
||||
|
||||
#### `Information`
|
||||
Articles bien-être publiés par les administrateurs.
|
||||
|
||||
| Champ | Type | Description |
|
||||
|---|---|---|
|
||||
| `title` | string | Titre de l'article |
|
||||
| `content` | text | Contenu |
|
||||
| `category` | string | Catégorie |
|
||||
| `image_url` | string (nullable) | URL de l'image |
|
||||
| `is_published` | boolean | Visibilité publique |
|
||||
|
||||
### 3.4 Routes & Contrôleurs Web
|
||||
|
||||
#### Routes publiques (sans authentification)
|
||||
|
||||
| Méthode | URL | Contrôleur | Description |
|
||||
|---|---|---|---|
|
||||
| GET | `/` | `DashboardController@index` | Page d'accueil |
|
||||
| GET | `/diagnostics` | `DiagnosticController@index` | Formulaire de diagnostic |
|
||||
| GET | `/relaxation` | `RelaxationController@index` | Catalogue d'activités |
|
||||
| GET | `/informations` | `InformationController@index` | Liste des articles |
|
||||
| GET | `/informations/{id}` | `InformationController@show` | Détail d'un article |
|
||||
| GET | `/login` | `AuthController@showLogin` | Page de connexion |
|
||||
| POST | `/login` | `AuthController@login` | Traitement connexion |
|
||||
| GET | `/register` | `AuthController@showRegister` | Page d'inscription |
|
||||
| POST | `/register` | `AuthController@register` | Traitement inscription |
|
||||
| POST | `/logout` | `AuthController@logout` | Déconnexion |
|
||||
|
||||
#### Routes protégées (middleware `auth`)
|
||||
|
||||
| Méthode | URL | Contrôleur | Description |
|
||||
|---|---|---|---|
|
||||
| GET | `/profile` | `ProfileController@index` | Page profil |
|
||||
| PATCH | `/profile` | `ProfileController@update` | Mise à jour infos |
|
||||
| PUT | `/profile/password` | `ProfileController@updatePassword` | Changement de mot de passe |
|
||||
| DELETE | `/profile` | `ProfileController@destroy` | Suppression du compte |
|
||||
| GET | `/emotions` | `EmotionController@index` | Historique émotions |
|
||||
| POST | `/emotions` | `EmotionController@store` | Enregistrer une émotion |
|
||||
| GET | `/diagnostics/history` | `DiagnosticController@history` | Historique diagnostics |
|
||||
| POST | `/diagnostics` | `DiagnosticController@store` | Soumettre un diagnostic |
|
||||
| POST | `/relaxation/{id}/favorite` | `RelaxationController@toggleFavorite` | Ajouter/retirer un favori |
|
||||
|
||||
### 3.5 API REST
|
||||
|
||||
Préfixe : `/api` — Authentification : **Laravel Sanctum** (Bearer Token)
|
||||
|
||||
#### Routes publiques
|
||||
|
||||
| Méthode | URL | Description |
|
||||
|---|---|---|
|
||||
| POST | `/api/login` | Connexion — retourne un token Sanctum |
|
||||
| POST | `/api/register` | Inscription d'un nouvel utilisateur |
|
||||
|
||||
#### Routes protégées (middleware `auth:sanctum`)
|
||||
|
||||
| Méthode | URL | Description |
|
||||
|---|---|---|
|
||||
| GET | `/api/profile` | Récupère le profil de l'utilisateur connecté |
|
||||
| POST | `/api/update-profile` | Met à jour le profil |
|
||||
| GET | `/api/stress-events` | Liste tous les événements de stress (Holmes & Rahe) |
|
||||
| POST | `/api/stress-diagnostics` | Enregistre un diagnostic de stress |
|
||||
| GET | `/api/emotions` | Historique émotionnel de l'utilisateur |
|
||||
| POST | `/api/emotions` | Enregistre une émotion |
|
||||
| GET | `/api/informations` | Liste des articles publiés |
|
||||
| GET | `/api/informations/{id}` | Détail d'un article |
|
||||
|
||||
### 3.6 Administration Filament
|
||||
|
||||
Le panel d'administration est accessible à `/admin` uniquement pour les utilisateurs avec le rôle `Admin` et `is_active = true`.
|
||||
|
||||
**Ressource disponible :**
|
||||
- **UserResource** : gestion complète des utilisateurs (CRUD, activation/désactivation, assignation de rôle)
|
||||
|
||||
### 3.7 Services
|
||||
|
||||
#### `StressCalculator`
|
||||
|
||||
Contient la logique métier du diagnostic de stress (échelle Holmes & Rahe).
|
||||
|
||||
```php
|
||||
$calculator = new StressCalculator();
|
||||
$score = $calculator->calculateScore($points); // somme des points des événements cochés
|
||||
$level = $calculator->determineLevel($score); // 'Faible', 'Modéré', ou 'Élevé'
|
||||
```
|
||||
|
||||
Seuils :
|
||||
- **< 150 points** → Niveau Faible
|
||||
- **150–299 points** → Niveau Modéré
|
||||
- **≥ 300 points** → Niveau Élevé
|
||||
|
||||
---
|
||||
|
||||
## 4. Application Mobile (Flutter)
|
||||
|
||||
### 4.1 Stack technique
|
||||
|
||||
| Élément | Technologie |
|
||||
|---|---|
|
||||
| Framework | Flutter 3 / Dart |
|
||||
| State management | Provider |
|
||||
| Navigation | go_router |
|
||||
| Requêtes HTTP | Dio |
|
||||
| Stockage sécurisé | flutter_secure_storage |
|
||||
| Internationalisation | intl |
|
||||
|
||||
### 4.2 Architecture
|
||||
|
||||
L'application suit une architecture feature-first avec séparation claire des responsabilités :
|
||||
|
||||
```
|
||||
mobile/lib/
|
||||
├── core/
|
||||
│ └── network/ ← Client HTTP Dio + intercepteurs (token)
|
||||
├── features/
|
||||
│ ├── auth/ ← Connexion / Inscription
|
||||
│ │ ├── models/
|
||||
│ │ ├── providers/ ← AuthProvider (gère le token Sanctum)
|
||||
│ │ ├── screens/
|
||||
│ │ └── services/ ← Appels API auth
|
||||
│ ├── diagnostics/ ← Diagnostic de stress
|
||||
│ │ ├── models/
|
||||
│ │ ├── providers/
|
||||
│ │ ├── screens/
|
||||
│ │ └── services/
|
||||
│ ├── exercises/ ← Activités de relaxation
|
||||
│ │ ├── models/
|
||||
│ │ ├── providers/
|
||||
│ │ ├── screens/
|
||||
│ │ └── services/
|
||||
│ ├── informations/ ← Articles bien-être
|
||||
│ │ ├── models/
|
||||
│ │ ├── providers/
|
||||
│ │ ├── screens/
|
||||
│ │ └── services/
|
||||
│ ├── relaxation/ ← Catalogue relaxation + favoris
|
||||
│ │ ├── models/
|
||||
│ │ ├── providers/
|
||||
│ │ ├── screens/
|
||||
│ │ └── services/
|
||||
│ ├── tracker/ ← Tracker émotionnel (+ sync Wear OS)
|
||||
│ │ ├── models/
|
||||
│ │ ├── providers/
|
||||
│ │ ├── screens/
|
||||
│ │ └── services/
|
||||
│ └── wear/ ← Communication Wearable Data Layer
|
||||
│ ├── models/
|
||||
│ ├── providers/
|
||||
│ ├── screens/
|
||||
│ └── services/
|
||||
└── main.dart
|
||||
```
|
||||
|
||||
### 4.3 Fonctionnalités
|
||||
|
||||
| Fonctionnalité | Description |
|
||||
|---|---|
|
||||
| **Authentification** | Connexion / inscription avec stockage sécurisé du token |
|
||||
| **Diagnostic de stress** | Questionnaire Holmes & Rahe, calcul du score, historique |
|
||||
| **Tracker émotionnel** | Enregistrement quotidien de l'humeur avec intensité et note |
|
||||
| **Relaxation** | Catalogue d'activités filtrables, gestion des favoris |
|
||||
| **Informations** | Lecture des articles bien-être publiés |
|
||||
| **Sync Wear OS** | Transmission de l'humeur et du statut d'auth vers la montre |
|
||||
|
||||
**Flux d'authentification :**
|
||||
1. L'utilisateur se connecte → le token Sanctum est stocké dans `flutter_secure_storage`
|
||||
2. `AuthProvider` expose l'état de connexion à toute l'app via `Provider`
|
||||
3. `go_router` redirige automatiquement selon l'état d'authentification
|
||||
|
||||
---
|
||||
|
||||
## 5. Application Wear OS
|
||||
|
||||
### 5.1 Stack technique
|
||||
|
||||
| Élément | Technologie |
|
||||
|---|---|
|
||||
| Langage | Kotlin |
|
||||
| UI | Jetpack Compose for Wear OS |
|
||||
| Communication | Wearable Data Layer API (Google) |
|
||||
| Composants UI | `androidx.wear.compose.material3` |
|
||||
|
||||
### 5.2 Fonctionnement
|
||||
|
||||
L'application Wear OS est **dépendante de l'app Flutter** installée sur le téléphone couplé. Elle ne communique pas directement avec l'API Laravel.
|
||||
|
||||
**Architecture de communication :**
|
||||
|
||||
```
|
||||
[Wear OS App] ←──── Wearable Data Layer (Bluetooth/Wi-Fi) ────→ [App Flutter]
|
||||
↕
|
||||
[API Laravel REST]
|
||||
```
|
||||
|
||||
**Canal de communication :**
|
||||
- Chemin `/wearable_communication` : messages envoyés de la montre vers le téléphone (commandes)
|
||||
- Chemin `/auth_status` : données synchronisées téléphone → montre (nom d'utilisateur, statut)
|
||||
- Chemin `/daily_mood` : données synchronisées téléphone → montre (humeur du jour)
|
||||
|
||||
**Commandes supportées :**
|
||||
|
||||
| Commande | Description |
|
||||
|---|---|
|
||||
| `get_sync_data` | Demande au téléphone de synchroniser les données (auth + humeur) |
|
||||
| `save_mood` | Envoie l'humeur sélectionnée sur la montre pour enregistrement via l'API |
|
||||
|
||||
**Écran principal (`WearApp`) :**
|
||||
|
||||
- Si l'utilisateur **n'est pas connecté** sur le téléphone → affiche "Connexion requise"
|
||||
- Si connecté et **aucune humeur du jour** → propose 5 choix d'humeur (Très bien, Bien, Neutre, Pas top, Stressé)
|
||||
- Si une humeur est déjà enregistrée → affiche l'humeur du jour avec option de modification
|
||||
|
||||
**Connectivité :**
|
||||
La montre utilise la priorité réseau suivante : Wi-Fi → Bluetooth (pont vers le téléphone).
|
||||
|
||||
---
|
||||
|
||||
## 6. Base de données
|
||||
|
||||
### Schéma simplifié
|
||||
|
||||
```
|
||||
roles ─────────────────────────── users
|
||||
id, libelle id, name, email, password, id_role, is_active
|
||||
│
|
||||
┌───────────────┼───────────────────┐
|
||||
│ │ │
|
||||
emotion_records resultat_diags favorites
|
||||
user_id, emotion user_id, score id_user, id_activite
|
||||
intensity, note level, events (JSON)
|
||||
│
|
||||
relaxation_activities
|
||||
title, type, duration, url
|
||||
|
||||
stress_events information
|
||||
event_name, points title, content, category, image_url, is_published
|
||||
```
|
||||
|
||||
### Migrations (ordre chronologique)
|
||||
|
||||
| Migration | Table créée |
|
||||
|---|---|
|
||||
| `000001` | `roles` |
|
||||
| `000002` | `users` |
|
||||
| `000003` | `stress_events` |
|
||||
| `000004` | `relaxation_activities` |
|
||||
| `000005` | `resultat_diags` |
|
||||
| `000006` | `emotion_records` |
|
||||
| `000007` | `personal_access_tokens` (Sanctum) |
|
||||
| `103734` | `cache`, `sessions` |
|
||||
| `111910/111917` | Colonne `is_active` sur `users` |
|
||||
| `141553` | `information` |
|
||||
|
||||
---
|
||||
|
||||
## 7. Déploiement
|
||||
|
||||
### Environnement Docker (WEB)
|
||||
|
||||
Le projet Laravel embarque une configuration Docker prête à l'emploi :
|
||||
|
||||
```
|
||||
WEB/
|
||||
├── Dockerfile ← Image PHP-FPM
|
||||
├── docker-compose.yml ← Services : app + nginx
|
||||
└── nginx.conf ← Configuration Nginx
|
||||
```
|
||||
|
||||
**Démarrer l'environnement :**
|
||||
|
||||
```bash
|
||||
cd WEB
|
||||
docker-compose up -d
|
||||
php artisan migrate --seed
|
||||
```
|
||||
|
||||
### Application Mobile
|
||||
|
||||
```bash
|
||||
cd mobile
|
||||
flutter pub get
|
||||
flutter run
|
||||
```
|
||||
|
||||
Configurer l'URL de l'API dans le fichier de configuration réseau (`lib/core/network/`).
|
||||
|
||||
### Application Wear OS
|
||||
|
||||
Ouvrir le dossier `Wear/` dans **Android Studio**, puis lancer sur une montre Wear OS physique ou un émulateur.
|
||||
|
||||
> La montre doit être couplée à un téléphone Android ayant l'application Flutter installée.
|
||||
Reference in New Issue
Block a user