class PostCreator { final String id; final String displayName; final String? avatar; PostCreator({required this.id, required this.displayName, this.avatar}); factory PostCreator.fromJson(Map json) { return PostCreator( id: json['id']?.toString() ?? '', displayName: json['displayName'] ?? '', avatar: json['avatar']?.toString(), ); } Map toJson() { return {'id': id, 'displayName': displayName, 'avatar': avatar}; } } class Post { final String id; final String creatorId; final PostCreator creator; final String body; final int likes; final int comments; final DateTime creationDate; final bool liked; final List? images; Post({ required this.id, required this.creatorId, required this.creator, required this.body, required this.likes, required this.comments, required this.creationDate, this.liked = false, this.images, }); factory Post.fromJson(Map json) { return Post( id: json['id']?.toString() ?? '', creatorId: json['creatorId']?.toString() ?? '', creator: PostCreator.fromJson(json['creator'] ?? {}), body: json['body'] ?? '', likes: int.tryParse(json['likes']?.toString() ?? '0') ?? 0, comments: int.tryParse(json['comments']?.toString() ?? '0') ?? 0, creationDate: DateTime.parse( json['creationDate'] ?? DateTime.now().toIso8601String(), ), liked: json['liked'] == true, images: json['images'] != null ? List.from(json['images']) : null, ); } Map toJson() { return { 'id': id, 'creatorId': creatorId, 'creator': creator.toJson(), 'body': body, 'likes': likes, 'comments': comments, 'creationDate': creationDate.toIso8601String(), 'liked': liked, 'images': images, }; } Post copyWith({ String? id, String? creatorId, PostCreator? creator, String? body, int? likes, int? comments, DateTime? creationDate, bool? liked, List? images, }) { return Post( id: id ?? this.id, creatorId: creatorId ?? this.creatorId, creator: creator ?? this.creator, body: body ?? this.body, likes: likes ?? this.likes, comments: comments ?? this.comments, creationDate: creationDate ?? this.creationDate, liked: liked ?? this.liked, images: images ?? this.images, ); } } class LikedUser { final String id; final String displayName; final DateTime likeTime; LikedUser({ required this.id, required this.displayName, required this.likeTime, }); factory LikedUser.fromJson(Map json) { return LikedUser( id: json['id']?.toString() ?? '', displayName: json['displayName'] ?? '', likeTime: DateTime.parse( json['likeTime'] ?? DateTime.now().toIso8601String(), ), ); } Map toJson() { return { 'id': id, 'displayName': displayName, 'likeTime': likeTime.toIso8601String(), }; } } class DetailedPost { final String id; final PostCreator creator; final String body; final int likes; final int comments; final bool liked; final DateTime creationDate; final List likedUsers; final List? images; DetailedPost({ required this.id, required this.creator, required this.body, required this.likes, required this.comments, required this.liked, required this.creationDate, required this.likedUsers, this.images, }); factory DetailedPost.fromJson(Map json) { return DetailedPost( id: json['id']?.toString() ?? '', creator: PostCreator.fromJson(json['creator'] ?? {}), body: json['body'] ?? '', likes: int.tryParse(json['likes']?.toString() ?? '0') ?? 0, comments: int.tryParse(json['comments']?.toString() ?? '0') ?? 0, liked: json['liked'] == true, creationDate: DateTime.parse( json['creationDate'] ?? DateTime.now().toIso8601String(), ), likedUsers: (json['likedUsers'] as List?) ?.map((user) => LikedUser.fromJson(user)) .toList() ?? [], images: json['images'] != null ? List.from(json['images']) : null, ); } Map toJson() { return { 'id': id, 'creator': creator.toJson(), 'body': body, 'likes': likes, 'comments': comments, 'liked': liked, 'creationDate': creationDate.toIso8601String(), 'likedUsers': likedUsers.map((user) => user.toJson()).toList(), 'images': images, }; } } class CreatePostRequest { final String body; CreatePostRequest({required this.body}); Map toJson() { return {'body': body}; } }