Cahier des charges Application de chat en temps réel
Sommaire
- 1- Énoncé de projet : Application de chat en temps réel avec Flutter
- 1.1- Contexte
- 1.2- Principaux objectifs
- 1.3- Fonctionnalités attendues
- 1.4- Exigences techniques
- 1.5- Infrastructure / DevOps
- 1.6- Modèle de données (proposition)
- 1.7- Protocole WebSocket — messages JSON
- 1.8- API REST (exemples)
- 1.9- Comportements côté client (Flutter)
- 1.10- Sécurité & conformité
- 1.11- Non-fonctionnel (NFR)
- 1.12- Architecture & composants
- 1.13- User stories
- 1.14- Tests & qualité
- 1.15- Monitoring / Logs
- 1.16- Déploiement & exploitation
- 1.17- Livrables
- 1.18- Exemples JSON
- 1.19- Recommandations finales
- 1.19.1- Cours Flutter
Cahier des charges Application de chat en temps réel
-
Énoncé de projet : Application de chat en temps réel avec Flutter
-
Contexte
- Une startup souhaite développer une application mobile de messagerie instantanée destinée aux apprenants et formateurs afin de faciliter la communication en temps réel.
- L’application doit être réalisée avec Flutter pour assurer une compatibilité Android et iOS, et doit reposer sur une architecture client–serveur avec WebSockets.
- Le projet doit permettre aux utilisateurs d’échanger des messages texte en temps réel, de consulter l’historique des conversations et de gérer leur statut de connexion.
-
Principaux objectifs
- Messagerie instantanée bidirectionnelle (faible latence).
- Persistance de l’historique des messages.
- Connexions sécurisées et authentifiées.
- Bon comportement en cas de perte de connexion (reconnexion, file d’envoi).
- Extensibilité (channels, groupes, pièces jointes).
-
Fonctionnalités attendues
- Authentification des utilisateurs
- Inscription (username, email, mot de passe).
- Connexion sécurisée (JWT ou équivalent).
- Messagerie
- Envoi et réception de messages en temps réel.
- Affichage de l’historique des messages (stockage en base + cache local).
- Statut des messages : envoyé, délivré, lu.
- Indicateurs
- Présence en ligne/hors ligne.
- Indicateur « en train d’écrire ».
- Interface utilisateur (Flutter)
- Page de connexion/inscription.
- Page de liste de conversations.
- Écran de discussion (chat screen).
- Gestion des erreurs
- Déconnexion automatique en cas d’inactivité ou d’expiration du token.
- Tentative de reconnexion automatique en cas de perte du réseau.
-
Exigences techniques
- Frontend (client)
- Framework : Flutter (iOS/Android).
- Packages recommandés : web_socket_channel (ou socket_io_client si serveur Socket.IO), provider / riverpod / bloc pour état, shared_preferences / sqflite pour cache local.
- Composants : ChatScreen, service WebSocket réutilisable, stockage local pour cache + file d’envoi.
- Backend (serveur)
- WebSocket endpoint (ex : wss://api.example.com/ws/chat).
- Authentification via JWT (token transmis au handshake / lors des requêtes REST).
- Persistance : NoSQL (MongoDB) ou SQL (Postgres / MySQL) pour messages et métadonnées.
- Composant d’API REST pour auth/historique.
- Option : support de montée en charge (Phoenix/Elixir, Go, Node.js cluster, service managé).
-
Infrastructure / DevOps
- TLS obligatoire (WSS).
- Conteneurisation (Docker) + orchestration (Kubernetes ou services managés).
- CI/CD pour build et déploiement.
- Monitoring (Prometheus/Grafana, Sentry pour erreurs).
-
Modèle de données (proposition)
- Table / collection users
- id (uuid)
- username (string)
- email (string)
- password_hash (string)
- avatar_url (string)
- last_seen (datetime)
- created_at, updated_at
- Table / collection messages
- id (uuid ou bigint)
- conversation_id (uuid) — ou sender_id + recipient_id si 1:1
- sender_id
- recipient_id (nullable pour groupes)
- text
- type (text/image/file)
- status (sent/delivered/read)
- timestamp (datetime)
- metadata (json)
- Table conversations (1:1 ou groupe)
- id
- type (private/group)
- participants (array)
- created_at
-
Protocole WebSocket — messages JSON
- Handshake : connexion WebSocket avec JWT dans un header ou query param sécurisé.
- Format général :
- Types courants :
- message.send
- message.receive
- message.ack
- typing.start / typing.stop
- presence.update
- history.request / history.response
-
API REST (exemples)
- POST /api/auth/login — connexion
- POST /api/auth/register — inscription
- GET /api/users — recherche utilisateurs
- GET /api/conversations/:id/messages — historique paginé
- POST /api/messages — envoi fallback
- GET /api/health — health check
-
Comportements côté client (Flutter)
- Connexion via WebSocket + JWT.
- Envoi et réception de messages (optimistic UI).
- Reconnexion automatique (exponential backoff).
- Cache offline (sqflite) + file d’envoi persistante.
- Sécurité : ne pas exposer les tokens dans logs.
-
Sécurité & conformité
- Transport : TLS (WSS) obligatoire.
- Auth : JWT + refresh token.
- Validation côté serveur : XSS, longueur messages.
- Protection anti-spam : rate limiting.
- Données personnelles : conformité RGPD.
- Mots de passe : bcrypt/argon2.
-
Non-fonctionnel (NFR)
- Latence <200ms.
- Disponibilité HA.
- Durabilité (sauvegardes régulières).
- Scalabilité (Redis/Kafka pour propagation).
- Monitoring & alerting.
-
Architecture & composants
- Frontend : Flutter app.
- Backend : WebSocket server + API REST.
- Database : Postgres / MongoDB.
- Redis : pub/sub.
- Infrastructure : NGINX, Docker, Kubernetes.
-
User stories
- US-01 : Connexion
- US-02 : Envoyer un message
- US-03 : Historique
- US-04 : Indicateur de saisie
-
Tests & qualité
- Tests unitaires (parser, WebSocket service).
- Tests d’intégration (E2E login → message).
- Tests de charge (10k connexions).
- Tests de sécurité (XSS, injection, token forgery).
-
Monitoring / Logs
- Logs structurés JSON.
- Métriques (connexions, messages/s, erreurs).
- Alerting (Sentry, Prometheus).
-
Déploiement & exploitation
- Artefacts : Docker backend, APK/IPA Flutter.
- Pipeline CI/CD.
- Load balancing + TLS.
- Runbooks (rollback, purge messages).
-
Livrables
- Spécification technique complète.
- Code Flutter + Backend.
- Dockerfiles + scripts de déploiement.
- Plan de tests.
- Documentation API.
-
Exemples JSON
-
Recommandations finales
- Utiliser wss:// en production.
- Ne pas exposer tokens dans query string.
- Redis pub/sub pour multi-instances.
- Protocole JSON simple et extensible.
{ "type": "message_type", "payload": { ... }, "requestId": "optional-client-id" }
{ "type": "message.receive", "payload": { "id": "1694860800000", "sender": "alice", "text": "Bonjour !", "timestamp": "2025-09-16T07:00:00Z", "status": "sent" } }