Merge branch 'dev' into happi/dev/database-update

# Conflicts:
#	apps/im_app/lib/features/login/presentation/login_view_model.dart
This commit is contained in:
Happi (哈比)
2026-03-09 20:17:03 +08:00
66 changed files with 1749 additions and 556 deletions

View File

@@ -1,25 +1,43 @@
import '../entities/user.dart';
import 'package:im_app/domain/entities/user.dart';
/// 认证 Repository 接口(依赖倒置)
///
/// Domain 层定义 WhatData 层实现 How。
/// ViewModel 依赖此接口,不依赖具体实现 [AuthRepositoryImpl]。
/// UseCase 依赖此接口,不依赖具体实现 [AuthRepositoryImpl]。
///
/// ## 数据流位置
/// ## 登录三步流程
///
/// ```
/// ViewModel
/// → ★ AuthRepository.login() ★ ← 你在这里(接口)
/// → AuthRepositoryImpl.login() ← data/repositories/(实现)
/// → _client.executeRequest(LoginRequest)
/// → 服务端
/// 1. sendOtp(countryCode, contact) → 发送验证码短信
/// 2. verifyOtp(countryCode, contact, code) → 校验验证码,返回 vcode_token
/// 3. login(countryCode, contact, vcodeToken) → 用 vcode_token 换 access_token返回 User
/// ```
abstract interface class AuthRepository {
/// 登录,返回 Domain Entity [User]
Future<User> login({required String email, required String password});
/// 发送手机验证码短信
///
/// 抛 [ApiError] 表示发送失败(手机号格式错误、频率限制等)。
Future<void> sendOtp({
required String countryCode,
required String contact,
});
/// 获取当前登录用户信息
Future<User?> getCurrentUser();
/// 校验验证码,成功返回 vcode_token
///
/// vcode_token 用于 [login] 的 vcodeToken 参数。
Future<String> verifyOtp({
required String countryCode,
required String contact,
required String code,
});
/// 用 vcode_token 完成登录,返回 Domain Entity [User]
///
/// 成功后内部回调写入 access_token后续请求自动携带。
Future<User> login({
required String countryCode,
required String contact,
required String vcodeToken,
});
/// 退出登录
Future<void> logout();

View File

@@ -14,7 +14,7 @@ import 'package:im_app/domain/entities/user.dart';
/// 读取DB row (DriftUser) → _toEntity() → Domain User
/// 监听DB 变化 → stream → Domain User → UI
/// ```
abstract class UserRepository {
abstract interface class UserRepository {
// ── 监听 ─────────────────────────────────────────────────────────────────
/// 监听单个用户DB 变化自动反映