import 'package:storage_sdk/storage_sdk.dart'; import 'package:im_app/core/services/socket_manager.dart'; import 'package:im_app/domain/repositories/auth_repository.dart'; /// 退出登录用例 /// /// 封装完整登出流程: /// 1. 调用服务端 /app/api/auth/logout,清除 token /// 2. 断开 WebSocket 连接 /// 3. 关闭本地数据库(StorageSdk) /// /// AuthNotifier.logout() 由 SettingsViewModel 在 UseCase 完成后调用, /// 触发 go_router 重定向至登录页。 /// /// ## 数据流位置 /// /// ``` /// SettingsViewModel.logout() /// → ★ LogoutUseCase.execute() ★ ← 你在这里 /// → AuthRepository.logout() → POST /app/api/auth/logout /// → SocketManager.disconnect() /// → StorageSdkLifecycle.closeDatabase() /// → AuthNotifier.logout() → 路由跳转 /login /// ``` class LogoutUseCase { final AuthRepository _authRepository; final SocketManager _socketManager; final StorageSdkApi _storageApi; StorageSdkLifecycle get _storageLifecycle => _storageApi as StorageSdkLifecycle; const LogoutUseCase({ required AuthRepository authRepository, required SocketManager socketManager, required StorageSdkApi storageApi, }) : _authRepository = authRepository, _socketManager = socketManager, _storageApi = storageApi; /// 执行完整登出流程 /// /// 抛出异常时,调用方仍应调用 AuthNotifier.logout() 确保本地状态清除。 Future execute() async { // 1. 服务端登出(清除 token) await _authRepository.logout(); // 2. 断开 WebSocket await _socketManager.disconnect(); // 3. 关闭本地数据库 await _storageLifecycle.closeDatabase(); } }