Connecte le système de communication mobile aux endpoints backend créés. ## Datasource (messaging_remote_datasource.dart) - ✅ Correction URLs : /api/messaging/* → /api/conversations et /api/messages - ✅ Ajout archiveConversation (PUT /api/conversations/{id}/archive) - ✅ Ajout markConversationAsRead (PUT /api/conversations/{id}/mark-read) - ✅ Ajout toggleMuteConversation (PUT /api/conversations/{id}/toggle-mute) - ✅ Ajout togglePinConversation (PUT /api/conversations/{id}/toggle-pin) - ✅ Ajout editMessage (PUT /api/messages/{id}) - ✅ Ajout deleteMessage (DELETE /api/messages/{id}) - Correction paramètres : organizationId → organisationId (backend) - Ajout type: GROUP dans createConversation (requis par backend) ## Repository (messaging_repository_impl.dart) Remplacement 6 stubs NotImplementedFailure par vrais appels API : - ✅ archiveConversation : appel datasource avec gestion erreurs - ✅ markConversationAsRead : appel datasource avec gestion erreurs - ✅ toggleMuteConversation : appel datasource avec gestion erreurs - ✅ togglePinConversation : appel datasource avec gestion erreurs - ✅ editMessage : appel datasource avec gestion erreurs + NotFoundException - ✅ deleteMessage : appel datasource avec gestion erreurs + NotFoundException ## État final - 14 méthodes implémentées (sur 22 définies dans le repository) - 8 stubs restants (templates + sendTargetedMessage) → backend non implémenté - Analyse Flutter : 0 erreur de compilation (990 warnings de style) - Communication feature : 100% fonctionnelle côté CRUD de base Débloquer la fonctionnalité Communication mobile (était 100% stubs). Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
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)