Files
cesizen/docs/DOCUMENTATION.md
sam 89b4107266
CI - Web (Laravel) / quality-and-tests (pull_request) Failing after 4m4s
docs: dossier de deploiement/securisation, presentation BLOC 3 et CHANGELOG
- 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>
2026-07-08 18:44:13 +02:00

16 KiB
Raw Permalink Blame History

Documentation Technique — CESIZen

Table des matières

  1. Présentation du projet
  2. Architecture globale
  3. Application Web (Laravel)
  4. Application Mobile (Flutter)
  5. Application Wear OS
  6. Base de données
  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é (15)
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).

$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
  • 150299 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 :

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.