Настройки, авторизация

This commit is contained in:
Халимов Рустам
2026-05-14 12:06:34 +03:00
parent e8161d23d4
commit ccffc5a53c
41 changed files with 2556 additions and 1375 deletions
@@ -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');
}
}