- 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>
16 KiB
Documentation Technique — CESIZen
Table des matières
- Présentation du projet
- Architecture globale
- Application Web (Laravel)
- Application Mobile (Flutter)
- Application Wear OS
- Base de données
- 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'utilisateuremotionRecords()→HasMany(EmotionRecord)— historique émotionnelfavoritedActivities()→BelongsToMany(RelaxationActivity)via tablefavorites
L'accès au panel Filament est restreint aux utilisateurs avec
is_active = trueET rôleAdmin.
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 tablefavorites
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).
$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 :
- L'utilisateur se connecte → le token Sanctum est stocké dans
flutter_secure_storage AuthProviderexpose l'état de connexion à toute l'app viaProvidergo_routerredirige 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 :
cd WEB
docker-compose up -d
php artisan migrate --seed
Application Mobile
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.