Ajoute KeycloakAuthService.getValidAccessToken() qui vérifie l'expiration du JWT et rafraîchit automatiquement avant de retourner le token. FinanceWorkflowRemoteDatasource et MessagingRemoteDatasource injectent désormais KeycloakAuthService au lieu de FlutterSecureStorage directement, ce qui évite d'envoyer un Bearer expiré et d'obtenir un 401 silencieux.
Feature Communication/Messaging
Status: ✅ Implémenté (MVP Fonctionnel) Date: 2026-03-13 Priorité: P0 (Bloquant Production)
📋 Vue d'ensemble
Module de communication permettant la messagerie entre membres et les broadcasts organisation selon les permissions RBAC.
🎯 Fonctionnalités Implémentées
✅ MVP (V1.0)
-
Liste des Conversations
- Affichage conversations triées par date
- Badge compteur messages non lus
- Indicateurs visuels (pinned, muted)
- Pull-to-refresh
- Navigation vers détail conversation
-
Permissions Respectées
COMM_SEND_ALL- OrgAdmin, SuperAdminCOMM_SEND_MEMBERS- ModeratorCOMM_BROADCAST- OrgAdmin- Menu "Messages" visible selon rôle (OrgAdmin, SuperAdmin, Moderator)
-
Architecture Clean + BLoC
- Domain : Entities (Message, Conversation, MessageTemplate)
- Data : Models avec JSON serialization, Repository, Datasource
- Presentation : BLoC (Events, States), Pages, Widgets
-
Intégration App
- Routes :
/messages,/communication - Navigation : Menu "Plus" avec vérification permissions
- DI : Injectable + GetIt
- Routes :
🏗️ Architecture
communication/
├── domain/
│ ├── entities/
│ │ ├── message.dart (Message, MessageType, MessageStatus, MessagePriority)
│ │ ├── conversation.dart (Conversation, ConversationType)
│ │ └── message_template.dart (MessageTemplate, TemplateCategory)
│ ├── repositories/
│ │ └── messaging_repository.dart (interface)
│ └── usecases/
│ ├── get_conversations.dart
│ ├── get_messages.dart
│ ├── send_message.dart
│ └── send_broadcast.dart
├── data/
│ ├── models/
│ │ ├── message_model.dart (.g.dart généré)
│ │ └── conversation_model.dart (.g.dart généré)
│ ├── datasources/
│ │ └── messaging_remote_datasource.dart (API REST)
│ └── repositories/
│ └── messaging_repository_impl.dart
└── presentation/
├── bloc/
│ ├── messaging_event.dart
│ ├── messaging_state.dart
│ └── messaging_bloc.dart
├── pages/
│ └── conversations_page.dart
└── widgets/
└── conversation_tile.dart
📡 API Endpoints Utilisés
| Endpoint | Méthode | Description |
|---|---|---|
/api/messaging/conversations |
GET | Liste conversations |
/api/messaging/conversations/:id |
GET | Détail conversation |
/api/messaging/conversations |
POST | Créer conversation |
/api/messaging/conversations/:id/messages |
GET | Messages d'une conversation |
/api/messaging/conversations/:id/messages |
POST | Envoyer message |
/api/messaging/broadcast |
POST | Envoyer broadcast |
/api/messaging/messages/:id/read |
PUT | Marquer message lu |
/api/messaging/unread/count |
GET | Compteur non lus |
⚠️ Note: Backend endpoints à implémenter côté serveur Quarkus
🔄 États BLoC
MessagingInitial- État initialMessagingLoading- Chargement en coursConversationsLoaded- Conversations chargées avec compteur non lusMessagesLoaded- Messages d'une conversation chargésMessageSent- Message envoyé avec succèsBroadcastSent- Broadcast envoyé avec succèsMessagingError- Erreur avec message utilisateur
🚀 Prochaines Étapes (V2.0+)
P1 - Fonctionnalités Avancées
- Page détail conversation (chat thread)
- Envoi pièces jointes (images, documents)
- Édition/suppression messages
- Recherche dans conversations
- Filtres conversations (non lus, pinned, archivées)
- Templates messages personnalisables (CRUD)
- Messages ciblés par rôles (COMM_TARGETED)
- Modération messages (MODERATION_CONTENT)
- Statistiques communication (dashboard analytics)
P2 - Optimisations
- WebSocket temps réel pour nouveaux messages
- Cache local conversations récentes
- Pagination messages (infinite scroll)
- Compression images avant envoi
- Mode offline avec synchronisation
- Notifications push (FCM)
- Read receipts (accusés de lecture)
- Typing indicators (en train d'écrire)
🧪 Tests
À Implémenter
- Unit tests BLoC (bloc_test)
- Unit tests UseCases (mockito)
- Unit tests Repository (mockito)
- Widget tests ConversationsPage
- Integration tests flux complet
📝 Notes Techniques
JSON Serialization
Le champ lastMessage dans Conversation utilise une sérialisation custom car Message est un type nested :
@JsonKey(
fromJson: _messageFromJson,
toJson: _messageToJson,
)
final Message? lastMessage;
Gestion d'Erreurs
Toutes les méthodes repository retournent Either<Failure, T> pour une gestion fonctionnelle des erreurs :
NetworkFailure- Pas de connexion InternetUnauthorizedFailure- Token expiré (401)ForbiddenFailure- Permission insuffisante (403)NotFoundFailure- Ressource non trouvée (404)ServerFailure- Erreur serveur (5xx)ValidationFailure- Données invalidesUnexpectedFailure- Erreur inattendueNotImplementedFailure- Fonctionnalité en développement
Dépendances Externes
Module RegisterModule enregistre :
http.Clientpour requêtes HTTPFlutterSecureStoragepour tokensConnectivitypour état réseau
📚 Documentation Connexe
✅ Critères d'Acceptation
- Architecture Clean + BLoC respectée
- Permissions RBAC vérifiées (OrgAdmin, SuperAdmin, Moderator)
- Routes intégrées (/messages, /communication)
- Menu navigation avec vérification rôles
- Page liste conversations fonctionnelle
- Gestion erreurs complète (Failures)
- DI configuré (Injectable + GetIt)
- JSON serialization (.g.dart générés)
- Code compilable sans erreurs
- Backend endpoints implémentés (Quarkus)
- Tests unitaires BLoC
- Tests intégration E2E
Développé avec: Flutter 3.5.3+, Dart 3.x, BLoC 8.1.6, Clean Architecture Gap comblé: Communication/Messaging (P0 Bloquant Production)