# Conflicts: # apps/im_app/lib/data/models/user_dto.dart # apps/im_app/lib/data/remote/login_request.dart # apps/im_app/lib/features/chat/presentation/chat_db_test_view_model.dart # apps/im_app/lib/features/chat/view/chat_db_test_page.dart # apps/im_app/lib/features/login/presentation/login_view_model.dart
148 lines
4.5 KiB
Dart
148 lines
4.5 KiB
Dart
import 'package:json_annotation/json_annotation.dart';
|
||
import 'package:networks_sdk/networks_sdk.dart';
|
||
|
||
import '../../../core/foundation/api_paths.dart';
|
||
import '../../../domain/entities/user.dart';
|
||
|
||
part 'login_request.g.dart';
|
||
|
||
/// # /auth/login — 登录接口
|
||
///
|
||
/// ## 数据流位置
|
||
///
|
||
/// ```
|
||
/// AuthRepositoryImpl.login(email, password)
|
||
/// → _client.executeRequest( ★ LoginRequest ★ ) ← 你在这里
|
||
/// → 服务端 POST /auth/login
|
||
/// → SDK 内部 ApiResponseWrapper 拆包 { code, message, data }
|
||
/// → ★ LoginResponse ★ = data 字段,T in APIResponseWrapper<T> ← 也在这里
|
||
/// → LoginResponse.toEntity() → User
|
||
/// ```
|
||
|
||
// ─────────────────────────────────────────────
|
||
// Response DTO
|
||
// ─────────────────────────────────────────────
|
||
|
||
/// 登录响应中的用户档案,嵌套在 [LoginResponse.profile] 中。
|
||
///
|
||
/// 纯 Dart 类,无需任何注解。`_$LoginProfileFromJson` 由生成器从 `@ApiRequest` 声明中自动推导生成。
|
||
class LoginProfile {
|
||
final int uid;
|
||
final String uuid;
|
||
@JsonKey(name: 'last_online')
|
||
final int lastOnline;
|
||
@JsonKey(name: 'profile_pic')
|
||
final String profilePic;
|
||
@JsonKey(name: 'profile_pic_gaussian')
|
||
final String profilePicGaussian;
|
||
final String nickname;
|
||
final String contact;
|
||
@JsonKey(name: 'country_code')
|
||
final String countryCode;
|
||
final String email;
|
||
@JsonKey(name: 'recovery_email')
|
||
final String recoveryEmail;
|
||
final String username;
|
||
final String bio;
|
||
final int relationship;
|
||
@JsonKey(name: 'user_alias')
|
||
final String? userAlias;
|
||
@JsonKey(name: 'channel_id')
|
||
final int channelId;
|
||
@JsonKey(name: 'channel_group_id')
|
||
final int channelGroupId;
|
||
final String hint;
|
||
|
||
const LoginProfile({
|
||
required this.uid,
|
||
required this.uuid,
|
||
required this.lastOnline,
|
||
required this.profilePic,
|
||
required this.profilePicGaussian,
|
||
required this.nickname,
|
||
required this.contact,
|
||
required this.countryCode,
|
||
required this.email,
|
||
required this.recoveryEmail,
|
||
required this.username,
|
||
required this.bio,
|
||
required this.relationship,
|
||
this.userAlias,
|
||
required this.channelId,
|
||
required this.channelGroupId,
|
||
required this.hint,
|
||
});
|
||
|
||
User toEntity() => User(
|
||
uid: uid,
|
||
uuid: uuid,
|
||
lastOnline: lastOnline,
|
||
profilePic: profilePic,
|
||
profilePicGaussian: profilePicGaussian,
|
||
nickname: nickname,
|
||
contact: contact,
|
||
countryCode: countryCode,
|
||
email: email,
|
||
recoveryEmail: recoveryEmail,
|
||
username: username,
|
||
bio: bio,
|
||
relationship: relationship,
|
||
userAlias: userAlias,
|
||
hint: hint,
|
||
);
|
||
}
|
||
|
||
/// 登录接口的业务响应数据(对应服务端 `data` 字段,即 T in `APIResponseWrapper<T>`)。
|
||
///
|
||
/// `{ code, message }` 由 SDK 内部的 `ApiResponseWrapper` 统一处理,
|
||
/// App 层只接触此类,不感知 envelope 结构。纯 Dart 类,无需任何注解。
|
||
class LoginResponse {
|
||
@JsonKey(name: 'account_id')
|
||
final String accountId;
|
||
final LoginProfile profile;
|
||
final String nonce;
|
||
@JsonKey(name: 'access_token')
|
||
final String accessToken;
|
||
@JsonKey(name: 'refresh_token')
|
||
final String refreshToken;
|
||
@JsonKey(name: 'device_id')
|
||
final String deviceId;
|
||
@JsonKey(name: 'login_data')
|
||
final String loginData;
|
||
|
||
const LoginResponse({
|
||
required this.accountId,
|
||
required this.profile,
|
||
required this.nonce,
|
||
required this.accessToken,
|
||
required this.refreshToken,
|
||
required this.deviceId,
|
||
required this.loginData,
|
||
});
|
||
|
||
User toEntity() => profile.toEntity();
|
||
}
|
||
|
||
// ─────────────────────────────────────────────
|
||
// Request
|
||
// ─────────────────────────────────────────────
|
||
|
||
/// 登录请求
|
||
///
|
||
/// `@ApiRequest` 一个注解搞定一切:
|
||
/// - mixin 自动生成 path / method / requestType / includeToken / toJson
|
||
/// - parameters getter 自动注册 `_$LoginResponseFromJson` 到 SDK 全局注册表
|
||
@ApiRequest(
|
||
path: ApiPaths.authLogin,
|
||
method: HttpMethod.post,
|
||
responseType: LoginResponse,
|
||
requestType: ApiRequestType.login,
|
||
)
|
||
class LoginRequest extends ApiRequestable<LoginResponse>
|
||
with _$LoginRequestApi {
|
||
final String email;
|
||
final String password;
|
||
|
||
LoginRequest({required this.email, required this.password});
|
||
}
|