feat: 切换邮箱认证并重构前后端启动与门禁
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
import '../../../../core/auth/session_store.dart';
|
||||
import '../apis/auth_api.dart';
|
||||
import '../models/auth_user.dart';
|
||||
|
||||
abstract class AuthRepository {
|
||||
Future<void> sendOtp(String email);
|
||||
|
||||
Future<AuthUser> loginWithEmailOtp({
|
||||
required String email,
|
||||
required String otp,
|
||||
});
|
||||
|
||||
Future<AuthUser?> recoverSession();
|
||||
|
||||
Future<void> logout();
|
||||
|
||||
Future<void> clearLocalSession();
|
||||
}
|
||||
|
||||
class AuthRepositoryImpl implements AuthRepository {
|
||||
AuthRepositoryImpl({
|
||||
required AuthApi authApi,
|
||||
required SessionStore sessionStore,
|
||||
}) : _authApi = authApi,
|
||||
_sessionStore = sessionStore;
|
||||
|
||||
final AuthApi _authApi;
|
||||
final SessionStore _sessionStore;
|
||||
|
||||
@override
|
||||
Future<void> sendOtp(String email) async {
|
||||
await _authApi.sendOtp(email: email);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<AuthUser> loginWithEmailOtp({
|
||||
required String email,
|
||||
required String otp,
|
||||
}) async {
|
||||
final session = await _authApi.createEmailSession(email: email, token: otp);
|
||||
await _sessionStore.saveToken(session.accessToken);
|
||||
await _sessionStore.saveRefreshToken(session.refreshToken);
|
||||
await _sessionStore.saveEmail(email);
|
||||
return AuthUser(id: session.userId, email: email);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<AuthUser?> recoverSession() async {
|
||||
final refreshToken = await _sessionStore.getRefreshToken();
|
||||
if (refreshToken == null || refreshToken.isEmpty) {
|
||||
return null;
|
||||
}
|
||||
|
||||
final session = await _authApi.refreshSession(refreshToken: refreshToken);
|
||||
await _sessionStore.saveToken(session.accessToken);
|
||||
await _sessionStore.saveRefreshToken(session.refreshToken);
|
||||
|
||||
final savedEmail = await _sessionStore.getEmail();
|
||||
final email = savedEmail?.isNotEmpty == true
|
||||
? savedEmail!
|
||||
: session.userEmail;
|
||||
if (email.isNotEmpty) {
|
||||
await _sessionStore.saveEmail(email);
|
||||
}
|
||||
return AuthUser(id: session.userId, email: email);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> logout() async {
|
||||
final refreshToken = await _sessionStore.getRefreshToken();
|
||||
try {
|
||||
if (refreshToken != null && refreshToken.isNotEmpty) {
|
||||
await _authApi.deleteSession(refreshToken: refreshToken);
|
||||
}
|
||||
} finally {
|
||||
await clearLocalSession();
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> clearLocalSession() async {
|
||||
await _sessionStore.clearToken();
|
||||
await _sessionStore.clearRefreshToken();
|
||||
await _sessionStore.clearEmail();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user