user_models.dart 9.81 KB
// ─── Requests(手写 toJson,无 fromJson)────────────────────────────────────

class LoginRequest {
  const LoginRequest({
    this.loginType = 'verification_code',
    required this.telephone,
    required this.verificationCode,
  });

  final String loginType;
  final String telephone;
  final String verificationCode;

  Map<String, dynamic> toJson() => {
        'login_type': loginType,
        'telephone': telephone,
        'verification_code': verificationCode,
      };
}

class AppleLoginRequest {
  const AppleLoginRequest({
    this.loginType = 'apple',
    required this.identityToken,
    this.email,
    this.nickname,
  });

  final String loginType;
  final String identityToken;
  final String? email;
  final String? nickname;

  Map<String, dynamic> toJson() => {
        'login_type': loginType,
        'identity_token': identityToken,
        if (email != null) 'email': email,
        if (nickname != null) 'nickname': nickname,
      };
}

class RegisterRequest {
  const RegisterRequest({
    required this.telephone,
    required this.verificationCode,
  });

  final String telephone;
  final String verificationCode;

  Map<String, dynamic> toJson() => {
        'telephone': telephone,
        'verification_code': verificationCode,
      };
}

class VerifyCodeRequest {
  const VerifyCodeRequest({required this.telephone, required this.scene});

  final String telephone;
  final int scene;

  factory VerifyCodeRequest.login(String telephone) =>
      VerifyCodeRequest(telephone: telephone, scene: 1);

  factory VerifyCodeRequest.changeTelephone(String telephone) =>
      VerifyCodeRequest(telephone: telephone, scene: 2);

  Map<String, dynamic> toJson() => {
        'telephone': telephone,
        'scene': scene,
      };
}

class BindPartnerRequest {
  const BindPartnerRequest({required this.bindCode});

  final String bindCode;

  Map<String, dynamic> toJson() => {'pair_code': bindCode};
}

class PushTokenRequest {
  const PushTokenRequest({
    required this.pushToken,
    required this.deviceInfo,
    required this.pushPlatform,
  });

  final String pushToken;
  final String deviceInfo;
  final int pushPlatform;

  Map<String, dynamic> toJson() => {
        'cid': pushToken,
        'device_info': deviceInfo,
        'push_platform': pushPlatform,
      };
}

class UserInfoUpdateRequest {
  const UserInfoUpdateRequest({this.avatar, this.nickname, this.persona});

  final String? avatar;
  final String? nickname;
  final int? persona;

  Map<String, dynamic> toJson() {
    final json = <String, dynamic>{};
    if (avatar != null) json['avatar'] = avatar;
    if (nickname != null) json['nickname'] = nickname;
    if (persona != null) json['persona'] = persona;
    return json;
  }
}

// ─── Responses(手动反序列化)──────────────────────────────────

class UserAccessToken {
  const UserAccessToken({this.accessToken, this.expireTime});

  final String? accessToken;
  final int? expireTime;

  factory UserAccessToken.fromJson(Map<String, dynamic> json) {
    return UserAccessToken(
      accessToken: json['access_token'] as String?,
      expireTime: json['expire_time'] as int?,
    );
  }

  Map<String, dynamic> toJson() {
    final val = <String, dynamic>{};
    if (accessToken != null) val['access_token'] = accessToken;
    if (expireTime != null) val['expire_time'] = expireTime;
    return val;
  }
}

class LoginResponse {
  const LoginResponse({this.isNewUser, this.accessTokenInfo, this.id});

  final bool? isNewUser;
  final UserAccessToken? accessTokenInfo;
  final int? id;

  String get accessToken => accessTokenInfo?.accessToken ?? '';

  factory LoginResponse.fromJson(Map<String, dynamic> json) {
    return LoginResponse(
      isNewUser: json['is_new_user'] as bool?,
      accessTokenInfo: json['token_info'] == null
          ? null
          : UserAccessToken.fromJson(
              json['token_info'] as Map<String, dynamic>),
      id: json['id'] as int?,
    );
  }

  Map<String, dynamic> toJson() {
    final val = <String, dynamic>{};
    if (isNewUser != null) val['is_new_user'] = isNewUser;
    if (accessTokenInfo != null) val['token_info'] = accessTokenInfo!.toJson();
    if (id != null) val['id'] = id;
    return val;
  }
}

class RegisterResponse {
  const RegisterResponse({this.accessTokenInfo});

  final UserAccessToken? accessTokenInfo;

  String get accessToken => accessTokenInfo?.accessToken ?? '';

  factory RegisterResponse.fromJson(Map<String, dynamic> json) {
    return RegisterResponse(
      accessTokenInfo: json['token_info'] == null
          ? null
          : UserAccessToken.fromJson(
              json['token_info'] as Map<String, dynamic>),
    );
  }

  Map<String, dynamic> toJson() {
    final val = <String, dynamic>{};
    if (accessTokenInfo != null) val['token_info'] = accessTokenInfo!.toJson();
    return val;
  }
}

class UserInfoResponse {
  const UserInfoResponse({
    this.id,
    this.pairCode,
    this.pairId,
    this.telephone,
    this.nickname,
    this.avatar,
    this.persona,
    this.status,
    this.lastLoginTime,
    this.createTime,
    this.isBot,
  });

  final int? id;
  final String? pairCode;
  final int? pairId;
  final String? telephone;
  final String? nickname;
  final String? avatar;
  final int? persona;
  final int? status;
  final int? lastLoginTime;
  final int? createTime;
  final int? isBot;

  factory UserInfoResponse.fromJson(Map<String, dynamic> json) {
    return UserInfoResponse(
      id: json['id'] as int?,
      pairCode: json['pair_code'] as String?,
      pairId: json['pair_id'] as int?,
      telephone: json['telephone'] as String?,
      nickname: json['nickname'] as String?,
      avatar: json['avatar'] as String?,
      persona: json['persona'] as int?,
      status: json['status'] as int?,
      lastLoginTime: json['last_login_time'] as int?,
      createTime: json['create_time'] as int?,
      isBot: json['is_bot'] as int?,
    );
  }

  Map<String, dynamic> toJson() {
    final val = <String, dynamic>{};
    if (id != null) val['id'] = id;
    if (pairCode != null) val['pair_code'] = pairCode;
    if (pairId != null) val['pair_id'] = pairId;
    if (telephone != null) val['telephone'] = telephone;
    if (nickname != null) val['nickname'] = nickname;
    if (avatar != null) val['avatar'] = avatar;
    if (persona != null) val['persona'] = persona;
    if (status != null) val['status'] = status;
    if (lastLoginTime != null) val['last_login_time'] = lastLoginTime;
    if (createTime != null) val['create_time'] = createTime;
    if (isBot != null) val['is_bot'] = isBot;
    return val;
  }
}

class BoundUserInfoResponse {
  const BoundUserInfoResponse({this.userInfo, this.partnerUserInfo});

  final UserInfoResponse? userInfo;
  final UserInfoResponse? partnerUserInfo;

  factory BoundUserInfoResponse.fromJson(Map<String, dynamic> json) {
    return BoundUserInfoResponse(
      userInfo: json['user_info'] == null
          ? null
          : UserInfoResponse.fromJson(
              json['user_info'] as Map<String, dynamic>),
      partnerUserInfo: json['pair_user_info'] == null
          ? null
          : UserInfoResponse.fromJson(
              json['pair_user_info'] as Map<String, dynamic>),
    );
  }

  Map<String, dynamic> toJson() {
    final val = <String, dynamic>{};
    if (userInfo != null) val['user_info'] = userInfo!.toJson();
    if (partnerUserInfo != null) {
      val['pair_user_info'] = partnerUserInfo!.toJson();
    }
    return val;
  }
}

class RongcloudTokenResponse {
  const RongcloudTokenResponse({this.token});

  final String? token;

  factory RongcloudTokenResponse.fromJson(Map<String, dynamic> json) {
    return RongcloudTokenResponse(
      token: json['token'] as String?,
    );
  }

  Map<String, dynamic> toJson() {
    final val = <String, dynamic>{};
    if (token != null) val['token'] = token;
    return val;
  }
}

class FeedbackListResponse {
  const FeedbackListResponse({this.records});

  final List<FeedbackRecord>? records;

  factory FeedbackListResponse.fromJson(Map<String, dynamic> json) {
    return FeedbackListResponse(
      records: (json['records'] as List<dynamic>?)
          ?.map((e) => FeedbackRecord.fromJson(e as Map<String, dynamic>))
          .toList(),
    );
  }

  Map<String, dynamic> toJson() {
    final val = <String, dynamic>{};
    if (records != null) {
      val['records'] = records!.map((e) => e.toJson()).toList();
    }
    return val;
  }
}

class FeedbackRecord {
  const FeedbackRecord({
    this.id,
    this.userId,
    this.content,
    this.images = const [],
    this.createTime,
    this.reply,
    this.replyTime,
    this.replyUserRead,
  });

  final int? id;
  final int? userId;
  final String? content;
  final List<String> images;
  final int? createTime;
  final String? reply;
  final int? replyTime;
  final int? replyUserRead;

  factory FeedbackRecord.fromJson(Map<String, dynamic> json) {
    return FeedbackRecord(
      id: json['id'] as int?,
      userId: json['user_id'] as int?,
      content: json['content'] as String?,
      images:
          (json['images'] as List<dynamic>?)?.whereType<String>().toList() ??
              const [],
      createTime: json['create_time'] as int?,
      reply: json['reply'] as String?,
      replyTime: json['reply_time'] as int?,
      replyUserRead: json['reply_user_read'] as int?,
    );
  }

  Map<String, dynamic> toJson() {
    final val = <String, dynamic>{};
    if (id != null) val['id'] = id;
    if (userId != null) val['user_id'] = userId;
    if (content != null) val['content'] = content;
    val['images'] = images;
    if (createTime != null) val['create_time'] = createTime;
    if (reply != null) val['reply'] = reply;
    if (replyTime != null) val['reply_time'] = replyTime;
    if (replyUserRead != null) val['reply_user_read'] = replyUserRead;
    return val;
  }
}