Aligné avec le backend MessagingResource : - Nouveau module communication (conversations, messages, participants) - Respect des ContactPolicy (qui peut parler à qui par rôle) - Gestion MemberBlock (blocages individuels) - UI : conversations list, conversation detail, broadcast, tiles - BLoC : MessagingBloc avec events (envoyer, démarrer conversation rôle, etc.)
111 lines
3.7 KiB
Dart
111 lines
3.7 KiB
Dart
/// Modèles de données Conversation v4 avec désérialisation JSON
|
|
library conversation_model;
|
|
|
|
import '../../domain/entities/conversation.dart';
|
|
import 'message_model.dart';
|
|
|
|
/// Modèle de résumé de conversation (liste)
|
|
class ConversationSummaryModel extends ConversationSummary {
|
|
const ConversationSummaryModel({
|
|
required super.id,
|
|
required super.typeConversation,
|
|
required super.titre,
|
|
required super.statut,
|
|
super.dernierMessageApercu,
|
|
super.dernierMessageType,
|
|
super.dernierMessageAt,
|
|
super.nonLus,
|
|
super.organisationId,
|
|
});
|
|
|
|
factory ConversationSummaryModel.fromJson(Map<String, dynamic> json) {
|
|
return ConversationSummaryModel(
|
|
id: json['id']?.toString() ?? '',
|
|
typeConversation: json['typeConversation']?.toString() ?? 'DIRECTE',
|
|
titre: json['titre']?.toString() ?? '',
|
|
statut: json['statut']?.toString() ?? 'ACTIVE',
|
|
dernierMessageApercu: json['dernierMessageApercu']?.toString(),
|
|
dernierMessageType: json['dernierMessageType']?.toString(),
|
|
dernierMessageAt: json['dernierMessageAt'] != null
|
|
? DateTime.tryParse(json['dernierMessageAt'].toString())
|
|
: null,
|
|
nonLus: _parseInt(json['nonLus']),
|
|
organisationId: json['organisationId']?.toString(),
|
|
);
|
|
}
|
|
}
|
|
|
|
/// Modèle de participant
|
|
class ConversationParticipantModel extends ConversationParticipant {
|
|
const ConversationParticipantModel({
|
|
required super.membreId,
|
|
super.prenom,
|
|
super.nom,
|
|
super.roleDansConversation,
|
|
super.luJusqua,
|
|
});
|
|
|
|
factory ConversationParticipantModel.fromJson(Map<String, dynamic> json) {
|
|
return ConversationParticipantModel(
|
|
membreId: json['membreId']?.toString() ?? '',
|
|
prenom: json['prenom']?.toString(),
|
|
nom: json['nom']?.toString(),
|
|
roleDansConversation: json['roleDansConversation']?.toString(),
|
|
luJusqua: json['luJusqua'] != null
|
|
? DateTime.tryParse(json['luJusqua'].toString())
|
|
: null,
|
|
);
|
|
}
|
|
}
|
|
|
|
/// Modèle de conversation complète (détail)
|
|
class ConversationModel extends Conversation {
|
|
const ConversationModel({
|
|
required super.id,
|
|
required super.typeConversation,
|
|
required super.titre,
|
|
required super.statut,
|
|
super.organisationId,
|
|
super.organisationNom,
|
|
super.dateCreation,
|
|
super.nombreMessages,
|
|
super.participants,
|
|
super.messages,
|
|
super.nonLus,
|
|
super.roleCible,
|
|
});
|
|
|
|
factory ConversationModel.fromJson(Map<String, dynamic> json) {
|
|
final participantsJson = json['participants'] as List<dynamic>? ?? [];
|
|
final messagesJson = json['messages'] as List<dynamic>? ?? [];
|
|
|
|
return ConversationModel(
|
|
id: json['id']?.toString() ?? '',
|
|
typeConversation: json['typeConversation']?.toString() ?? 'DIRECTE',
|
|
titre: json['titre']?.toString() ?? '',
|
|
statut: json['statut']?.toString() ?? 'ACTIVE',
|
|
organisationId: json['organisationId']?.toString(),
|
|
organisationNom: json['organisationNom']?.toString(),
|
|
dateCreation: json['dateCreation'] != null
|
|
? DateTime.tryParse(json['dateCreation'].toString())
|
|
: null,
|
|
nombreMessages: _parseInt(json['nombreMessages']),
|
|
participants: participantsJson
|
|
.map((p) => ConversationParticipantModel.fromJson(p as Map<String, dynamic>))
|
|
.toList(),
|
|
messages: messagesJson
|
|
.map((m) => MessageModel.fromJson(m as Map<String, dynamic>))
|
|
.toList(),
|
|
nonLus: _parseInt(json['nonLus']),
|
|
roleCible: json['roleCible']?.toString(),
|
|
);
|
|
}
|
|
}
|
|
|
|
int _parseInt(dynamic value) {
|
|
if (value == null) return 0;
|
|
if (value is int) return value;
|
|
if (value is double) return value.toInt();
|
|
return int.tryParse(value.toString()) ?? 0;
|
|
}
|