67 lines
2.4 KiB
Dart
67 lines
2.4 KiB
Dart
import 'package:im_app/domain/entities/user.dart';
|
||
|
||
/// 群组成员的部分 [User] 表示,数据来源于群组成员接口。
|
||
///
|
||
/// 群组 API 返回的用户信息不完整,仅保证身份和在线状态字段有效。
|
||
/// 构造函数中未列出的 [User] 字段均为 null,不应依赖这些字段。
|
||
///
|
||
/// ## 何时使用 [GroupMember] vs [User]
|
||
/// - 渲染群组成员列表、成员头像等场景使用 [GroupMember]
|
||
/// - 需要联系方式、音效设置、好友关系等完整信息时,
|
||
/// 请通过用户详情接口获取完整的 [User]
|
||
///
|
||
/// ## 数据流
|
||
/// ```
|
||
/// 群组 API 响应
|
||
/// → GroupMember.fromJson() ← 群组专用字段(user_id、icon…)
|
||
/// → ★ GroupMember ★
|
||
/// → 仍是合法的 [User],可在任何需要 [User] 的地方使用
|
||
/// ```
|
||
class GroupMember extends User {
|
||
const GroupMember({
|
||
required super.uid,
|
||
super.nickname,
|
||
super.profilePic,
|
||
super.profilePicGaussian,
|
||
super.lastOnline,
|
||
super.deletedAt,
|
||
super.role,
|
||
super.requireUpsert = true,
|
||
});
|
||
|
||
/// 从群组成员 JSON 数据创建 [GroupMember]。
|
||
///
|
||
/// 注意群组 API 使用了与用户接口不同的字段名:
|
||
/// - `user_id` → [uid] (非 `uid`)
|
||
/// - `user_name` → [nickname] (非 `nickname`)
|
||
/// - `icon` → [profilePic] (非 `profile_pic`)
|
||
/// - `icon_gaussian` → [profilePicGaussian]
|
||
/// - `delete_time` → [deletedAt] (非 `deleted_at`)
|
||
factory GroupMember.fromJson(Map<String, dynamic> json) => GroupMember(
|
||
uid: json['user_id'] as int,
|
||
nickname: json['user_name'],
|
||
profilePic: json['icon'],
|
||
profilePicGaussian: json['icon_gaussian'],
|
||
lastOnline: json['last_online'],
|
||
deletedAt: json['delete_time'],
|
||
role: json['role'],
|
||
);
|
||
|
||
/// 序列化为群组成员 JSON 格式。
|
||
///
|
||
/// 字段名与 [fromJson] 保持对称。
|
||
/// `id`/`user_id`、`nickname`/`user_name`、`icon`/`profile_pic`
|
||
/// 同时输出两种命名,兼容不同约定的下游消费方。
|
||
Map<String, dynamic> toJson() => {
|
||
'id': uid,
|
||
'user_id': uid,
|
||
'user_name': nickname,
|
||
'nickname': nickname, // 兼容旧命名
|
||
'icon': profilePic,
|
||
'profile_pic': profilePic, // 兼容旧命名
|
||
'icon_gaussian': profilePicGaussian,
|
||
'last_online': lastOnline,
|
||
'delete_time': deletedAt,
|
||
};
|
||
}
|