import '../../domain/entities/social_post.dart'; /// Modèle de données pour les posts sociaux (Data Transfer Object). /// /// Cette classe est responsable de la sérialisation/désérialisation /// avec l'API backend et convertit vers/depuis l'entité de domaine SocialPost. class SocialPostModel { SocialPostModel({ required this.id, required this.content, required this.userId, required this.userFirstName, required this.userLastName, required this.userProfileImageUrl, required this.timestamp, this.imageUrl, this.likesCount = 0, this.commentsCount = 0, this.sharesCount = 0, this.isLikedByCurrentUser = false, }); /// Factory pour créer un [SocialPostModel] à partir d'un JSON. factory SocialPostModel.fromJson(Map json) { return SocialPostModel( id: _parseId(json, 'id', ''), content: _parseString(json, 'content', ''), userId: _parseId(json, 'userId', ''), userFirstName: _parseString(json, 'userFirstName', ''), userLastName: _parseString(json, 'userLastName', ''), userProfileImageUrl: _parseString(json, 'userProfileImageUrl', ''), timestamp: _parseTimestamp(json['timestamp']), imageUrl: json['imageUrl'] as String?, likesCount: _parseInt(json, 'likesCount'), commentsCount: _parseInt(json, 'commentsCount'), sharesCount: _parseInt(json, 'sharesCount'), isLikedByCurrentUser: json['isLikedByCurrentUser'] as bool? ?? false, ); } /// Crée un [SocialPostModel] depuis une entité de domaine [SocialPost]. factory SocialPostModel.fromEntity(SocialPost post) { return SocialPostModel( id: post.id, content: post.content, userId: post.userId, userFirstName: post.userFirstName, userLastName: post.userLastName, userProfileImageUrl: post.userProfileImageUrl, timestamp: post.timestamp, imageUrl: post.imageUrl, likesCount: post.likesCount, commentsCount: post.commentsCount, sharesCount: post.sharesCount, isLikedByCurrentUser: post.isLikedByCurrentUser, ); } final String id; final String content; final String userId; final String userFirstName; final String userLastName; final String userProfileImageUrl; final DateTime timestamp; final String? imageUrl; final int likesCount; final int commentsCount; final int sharesCount; final bool isLikedByCurrentUser; /// Convertit ce modèle en JSON pour l'envoi vers l'API. Map toJson() { return { 'id': id, 'content': content, 'userId': userId, 'userFirstName': userFirstName, 'userLastName': userLastName, 'userProfileImageUrl': userProfileImageUrl, 'timestamp': timestamp.toIso8601String(), if (imageUrl != null) 'imageUrl': imageUrl, 'likesCount': likesCount, 'commentsCount': commentsCount, 'sharesCount': sharesCount, 'isLikedByCurrentUser': isLikedByCurrentUser, }; } /// Convertit ce modèle vers une entité de domaine [SocialPost]. SocialPost toEntity() { return SocialPost( id: id, content: content, userId: userId, userFirstName: userFirstName, userLastName: userLastName, userProfileImageUrl: userProfileImageUrl, timestamp: timestamp, imageUrl: imageUrl, likesCount: likesCount, commentsCount: commentsCount, sharesCount: sharesCount, isLikedByCurrentUser: isLikedByCurrentUser, ); } /// Parse une valeur string depuis le JSON avec valeur par défaut. static String _parseString( Map json, String key, String defaultValue, ) { return json[key] as String? ?? defaultValue; } /// Parse une valeur int depuis le JSON avec valeur par défaut 0. static int _parseInt(Map json, String key) { return json[key] as int? ?? 0; } /// Parse un timestamp depuis le JSON. static DateTime _parseTimestamp(dynamic timestamp) { if (timestamp == null) return DateTime.now(); if (timestamp is String) { try { return DateTime.parse(timestamp); } catch (e) { return DateTime.now(); } } if (timestamp is int) { return DateTime.fromMillisecondsSinceEpoch(timestamp); } return DateTime.now(); } /// Parse un ID (UUID) depuis le JSON. /// /// [json] Le JSON à parser /// [key] La clé de l'ID /// [defaultValue] La valeur par défaut si l'ID est null /// /// Returns l'ID parsé ou la valeur par défaut static String _parseId(Map json, String key, String defaultValue) { final value = json[key]; if (value == null) return defaultValue; return value.toString(); } }