Настройки, авторизация
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
abstract class AuthLocalDataSource {
|
||||
Future<String?> getToken();
|
||||
Future<void> saveToken(String token);
|
||||
Future<String?> getRefreshToken();
|
||||
Future<void> saveRefreshToken(String token);
|
||||
Future<void> removeToken();
|
||||
Future<String?> getUserId();
|
||||
Future<void> saveUserId(String userId);
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'auth_local_datasource.dart';
|
||||
|
||||
class AuthLocalDataSourceImpl implements AuthLocalDataSource {
|
||||
final SharedPreferences sharedPreferences;
|
||||
|
||||
static const String _accessTokenKey = 'access_token';
|
||||
static const String _refreshTokenKey = 'refresh_token';
|
||||
static const String _userIdKey = 'user_id';
|
||||
|
||||
AuthLocalDataSourceImpl(this.sharedPreferences);
|
||||
|
||||
@override
|
||||
Future<String?> getToken() async {
|
||||
return sharedPreferences.getString(_accessTokenKey);
|
||||
}
|
||||
|
||||
Future<String?> getRefreshToken() async {
|
||||
return sharedPreferences.getString(_refreshTokenKey);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> saveToken(String token) async {
|
||||
await sharedPreferences.setString(_accessTokenKey, token);
|
||||
}
|
||||
|
||||
Future<void> saveRefreshToken(String token) async {
|
||||
await sharedPreferences.setString(_refreshTokenKey, token);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> removeToken() async {
|
||||
await sharedPreferences.remove(_accessTokenKey);
|
||||
await sharedPreferences.remove(_refreshTokenKey);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<String?> getUserId() async {
|
||||
return sharedPreferences.getString(_userIdKey);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> saveUserId(String userId) async {
|
||||
await sharedPreferences.setString(_userIdKey, userId);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> removeUserId() async {
|
||||
await sharedPreferences.remove(_userIdKey);
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,10 @@
|
||||
import '../../../../core/errors/result.dart';
|
||||
import '../../domain/entities/user.dart';
|
||||
import '../models/auth_response.dart';
|
||||
|
||||
abstract class AuthRemoteDataSource {
|
||||
Future<Result<User>> login(String email, String password);
|
||||
Future<Result<User>> register(String email, String password, String name);
|
||||
Future<Result<AuthResponse>> login(String username, String password);
|
||||
Future<Result<AuthResponse>> register(String username, String password, String name);
|
||||
Future<Result<void>> logout();
|
||||
Future<Result<User>> getCurrentUser();
|
||||
Future<Result<void>> refreshToken();
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
import '../../../../core/errors/errors.dart';
|
||||
import '../../../../core/network/api_client.dart';
|
||||
import '../../../../core/errors/result.dart';
|
||||
import '../../domain/entities/user.dart';
|
||||
import '../models/auth_response.dart';
|
||||
import 'auth_remote_datasource.dart';
|
||||
|
||||
class AuthRemoteDataSourceImpl implements AuthRemoteDataSource {
|
||||
final ApiClient apiClient;
|
||||
|
||||
AuthRemoteDataSourceImpl(this.apiClient);
|
||||
|
||||
@override
|
||||
Future<Result<AuthResponse>> login(String username, String password) async {
|
||||
final result = await apiClient.post<Map<String, dynamic>>(
|
||||
'/api/auth/login',
|
||||
data: {
|
||||
'username': username,
|
||||
'password': password,
|
||||
},
|
||||
);
|
||||
|
||||
return result.fold(
|
||||
(error) => Result.failure(error),
|
||||
(data) {
|
||||
try {
|
||||
return Result.success(AuthResponse.fromJson(data));
|
||||
} catch (e) {
|
||||
return Result.failure(AppError.parsing(message: 'Invalid server response format: $e'));
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Result<AuthResponse>> register(String username, String password, String name) async {
|
||||
final result = await apiClient.post<Map<String, dynamic>>(
|
||||
'/api/auth/register',
|
||||
data: {
|
||||
'username': username,
|
||||
'password': password,
|
||||
'displayName': name,
|
||||
},
|
||||
);
|
||||
|
||||
return result.fold(
|
||||
(error) => Result.failure(error),
|
||||
(data) {
|
||||
try {
|
||||
return Result.success(AuthResponse.fromJson(data));
|
||||
} catch (e) {
|
||||
return Result.failure(AppError.parsing(message: 'Invalid server response format: $e'));
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Result<void>> logout() async {
|
||||
return await apiClient.post('/api/auth/logout');
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Result<User>> getCurrentUser() async {
|
||||
final result = await apiClient.get<Map<String, dynamic>>('/api/auth/me');
|
||||
return result.fold(
|
||||
(error) => Result.failure(error),
|
||||
(data) {
|
||||
try {
|
||||
return Result.success(User(
|
||||
id: data['userId'] as String,
|
||||
email: data['username'] as String,
|
||||
name: data['displayName'] as String,
|
||||
avatarUrl: data['avatar'] as String?,
|
||||
));
|
||||
} catch (e) {
|
||||
return Result.failure(AppError.parsing(message: 'Invalid user data format: $e'));
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Result<void>> refreshToken() async {
|
||||
return await apiClient.post('/api/auth/refresh');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user