/// 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 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 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 json) { final participantsJson = json['participants'] as List? ?? []; final messagesJson = json['messages'] as List? ?? []; 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)) .toList(), messages: messagesJson .map((m) => MessageModel.fromJson(m as Map)) .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; }