feat(apps): add auth repository

This commit is contained in:
qzl
2026-02-25 14:51:21 +08:00
parent bfec6ffd7d
commit b00cfc80ab
4 changed files with 222 additions and 0 deletions
+55
View File
@@ -0,0 +1,55 @@
import 'package:social_app/core/api/api_client.dart';
import 'models/signup_request.dart';
import 'models/login_request.dart';
import 'models/auth_response.dart';
class AuthApi {
final ApiClient _client;
static const _prefix = '/v1/auth';
AuthApi(this._client);
Future<SignupStartResponse> signupStart(SignupStartRequest request) async {
final response = await _client.post(
'$_prefix/signup/start',
data: request.toJson(),
);
return SignupStartResponse.fromJson(response.data);
}
Future<AuthResponse> signupVerify(SignupVerifyRequest request) async {
final response = await _client.post(
'$_prefix/signup/verify',
data: request.toJson(),
);
return AuthResponse.fromJson(response.data);
}
Future<SignupStartResponse> signupResend(SignupResendRequest request) async {
final response = await _client.post(
'$_prefix/signup/resend',
data: request.toJson(),
);
return SignupStartResponse.fromJson(response.data);
}
Future<AuthResponse> login(LoginRequest request) async {
final response = await _client.post(
'$_prefix/login',
data: request.toJson(),
);
return AuthResponse.fromJson(response.data);
}
Future<AuthResponse> refresh(RefreshRequest request) async {
final response = await _client.post(
'$_prefix/refresh',
data: request.toJson(),
);
return AuthResponse.fromJson(response.data);
}
Future<void> logout(LogoutRequest request) async {
await _client.post('$_prefix/logout', data: request.toJson());
}
}
@@ -0,0 +1,15 @@
import 'package:social_app/features/auth/data/models/signup_request.dart';
import 'package:social_app/features/auth/data/models/login_request.dart';
import 'package:social_app/features/auth/data/models/auth_response.dart';
abstract class AuthRepository {
Future<SignupStartResponse> signupStart(SignupStartRequest request);
Future<AuthResponse> signupVerify(SignupVerifyRequest request);
Future<SignupStartResponse> signupResend(SignupResendRequest request);
Future<AuthResponse> login(LoginRequest request);
Future<AuthResponse> refresh(String refreshToken);
Future<void> logout();
Future<String?> getAccessToken();
Future<String?> getRefreshToken();
Future<bool> isAuthenticated();
}
@@ -0,0 +1,78 @@
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;
AuthRepositoryImpl({required AuthApi api, required TokenStorage tokenStorage})
: _api = api,
_tokenStorage = tokenStorage;
@override
Future<SignupStartResponse> signupStart(SignupStartRequest request) {
return _api.signupStart(request);
}
@override
Future<AuthResponse> signupVerify(SignupVerifyRequest request) async {
final response = await _api.signupVerify(request);
await _tokenStorage.saveTokens(
access: response.accessToken,
refresh: response.refreshToken,
);
return response;
}
@override
Future<SignupStartResponse> signupResend(SignupResendRequest request) {
return _api.signupResend(request);
}
@override
Future<AuthResponse> login(LoginRequest request) async {
final response = await _api.login(request);
await _tokenStorage.saveTokens(
access: response.accessToken,
refresh: response.refreshToken,
);
return response;
}
@override
Future<AuthResponse> refresh(String refreshToken) async {
final response = await _api.refresh(
RefreshRequest(refreshToken: refreshToken),
);
await _tokenStorage.saveTokens(
access: response.accessToken,
refresh: response.refreshToken,
);
return response;
}
@override
Future<void> logout() async {
final refreshToken = await _tokenStorage.getRefreshToken();
if (refreshToken != null) {
await _api.logout(LogoutRequest(refreshToken: refreshToken));
}
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;
}
}