Files
social-app/apps/lib/features/auth/data/auth_repository_impl.dart
T
qzl b34697660d feat: 实现 Auth 全局状态机与 401 统一处理机制
- 新增 AuthSessionInvalidated 事件处理 token 失效场景
- ApiInterceptor 新增 authFailureCallback 单飞机制
- AuthBloc 区分 manual logout 与 auto expiry 语义
- 新增 startup recovery fallback 防止启动卡死

feat: 重构 Calendar DayWeek 视图事件布局引擎

- 新增 DayEventLayoutEngine 解耦事件计算与渲染
- 新增 DayTimelineMetrics 统一时间轴常量
- 新增 DayViewScale 支持捏合缩放

feat: 新增 Settings 页面共享 UI 组件

- 新增 BackTitlePageHeader 统一页面 header
- 新增 DetailHeaderActionMenu 统一操作菜单
- 新增 DestructiveActionSheet 统一删除确认
- 新增 AppToggleSwitch 统一开关组件

feat: Chat UI Schema 支持导航操作

- 支持 navigation 类型 action 触发内部路由跳转
- 新增路径验证与参数处理

chore: 更新相关测试覆盖 auth 失效路径
2026-03-18 13:35:25 +08:00

116 lines
2.9 KiB
Dart

import 'package:social_app/core/storage/token_storage.dart';
import 'auth_api.dart';
import 'auth_repository.dart';
import 'models/signup_request.dart';
import 'models/login_request.dart';
import 'models/auth_response.dart';
class AuthRepositoryImpl implements AuthRepository {
final AuthApi _api;
final TokenStorage _tokenStorage;
final Future<void> Function()? _onLogout;
AuthRepositoryImpl({
required AuthApi api,
required TokenStorage tokenStorage,
Future<void> Function()? onLogout,
}) : _api = api,
_tokenStorage = tokenStorage,
_onLogout = onLogout;
@override
Future<VerificationCreateResponse> createVerification(
SignupStartRequest request,
) {
return _api.createVerification(request);
}
@override
Future<AuthResponse> verifyVerification(SignupVerifyRequest request) async {
final response = await _api.verifyVerification(request);
await _tokenStorage.saveTokens(
access: response.accessToken,
refresh: response.refreshToken,
);
return response;
}
@override
Future<void> resendVerification(SignupResendRequest request) {
return _api.resendVerification(request);
}
@override
Future<AuthResponse> createSession(LoginRequest request) async {
final response = await _api.createSession(request);
await _tokenStorage.saveTokens(
access: response.accessToken,
refresh: response.refreshToken,
);
return response;
}
@override
Future<AuthResponse> refreshSession(String refreshToken) async {
final response = await _api.refreshSession(
RefreshRequest(refreshToken: refreshToken),
);
await _tokenStorage.saveTokens(
access: response.accessToken,
refresh: response.refreshToken,
);
return response;
}
@override
Future<void> deleteSession() async {
final refreshToken = await _tokenStorage.getRefreshToken();
if (refreshToken != null) {
try {
await _api.deleteSession(LogoutRequest(refreshToken: refreshToken));
} catch (_) {
// ignore API errors during logout
}
}
await clearSessionLocalOnly();
}
@override
Future<void> clearSessionLocalOnly() async {
if (_onLogout != null) {
await _onLogout();
}
await _tokenStorage.clear();
}
@override
Future<String?> getAccessToken() => _tokenStorage.getAccessToken();
@override
Future<String?> getRefreshToken() => _tokenStorage.getRefreshToken();
@override
Future<bool> isAuthenticated() async {
final token = await _tokenStorage.getAccessToken();
return token != null;
}
@override
Future<void> requestPasswordReset(String email) {
return _api.requestPasswordReset(email);
}
@override
Future<void> confirmPasswordReset({
required String email,
required String token,
required String newPassword,
}) {
return _api.confirmPasswordReset(
email: email,
token: token,
newPassword: newPassword,
);
}
}