fix settings

This commit is contained in:
2025-09-26 20:54:32 +07:00
parent 30ed6b39b5
commit 74d0e3d44c
36 changed files with 5040 additions and 192 deletions

View File

@@ -0,0 +1,28 @@
import 'package:equatable/equatable.dart';
/// User entity representing authenticated user
class User extends Equatable {
final String id;
final String email;
final String name;
final String? avatarUrl;
final String token;
final DateTime? tokenExpiry;
const User({
required this.id,
required this.email,
required this.name,
this.avatarUrl,
required this.token,
this.tokenExpiry,
});
@override
List<Object?> get props => [id, email, name, avatarUrl, token, tokenExpiry];
bool get isTokenValid {
if (tokenExpiry == null) return true;
return tokenExpiry!.isAfter(DateTime.now());
}
}

View File

@@ -0,0 +1,48 @@
import 'package:fpdart/fpdart.dart';
import '../../../../core/errors/failures.dart';
import '../entities/user.dart';
/// Auth repository interface
abstract class AuthRepository {
/// Login with email and password
Future<Either<Failure, User>> login({
required String email,
required String password,
});
/// Register new user
Future<Either<Failure, User>> register({
required String email,
required String password,
required String name,
});
/// Logout current user
Future<Either<Failure, void>> logout();
/// Get current user
Future<Either<Failure, User?>> getCurrentUser();
/// Check if user is authenticated
Future<bool> isAuthenticated();
/// Refresh token
Future<Either<Failure, User>> refreshToken();
/// Update user profile
Future<Either<Failure, User>> updateProfile({
required String name,
String? avatarUrl,
});
/// Change password
Future<Either<Failure, void>> changePassword({
required String oldPassword,
required String newPassword,
});
/// Reset password
Future<Either<Failure, void>> resetPassword({
required String email,
});
}

View File

@@ -0,0 +1,16 @@
import 'package:fpdart/fpdart.dart';
import '../../../../core/errors/failures.dart';
import '../../../../shared/domain/usecases/usecase.dart';
import '../entities/user.dart';
import '../repositories/auth_repository.dart';
class GetCurrentUserUseCase implements UseCase<User?, NoParams> {
final AuthRepository repository;
GetCurrentUserUseCase(this.repository);
@override
Future<Either<Failure, User?>> call(NoParams params) async {
return repository.getCurrentUser();
}
}

View File

@@ -0,0 +1,43 @@
import 'package:fpdart/fpdart.dart';
import '../../../../core/errors/failures.dart';
import '../../../../shared/domain/usecases/usecase.dart';
import '../entities/user.dart';
import '../repositories/auth_repository.dart';
class LoginParams {
final String email;
final String password;
const LoginParams({
required this.email,
required this.password,
});
}
class LoginUseCase implements UseCase<User, LoginParams> {
final AuthRepository repository;
LoginUseCase(this.repository);
@override
Future<Either<Failure, User>> call(LoginParams params) async {
// Validate email format
if (!_isValidEmail(params.email)) {
return Left(ValidationFailure('Invalid email format'));
}
// Validate password
if (params.password.length < 6) {
return Left(ValidationFailure('Password must be at least 6 characters'));
}
return repository.login(
email: params.email,
password: params.password,
);
}
bool _isValidEmail(String email) {
return RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$').hasMatch(email);
}
}

View File

@@ -0,0 +1,15 @@
import 'package:fpdart/fpdart.dart';
import '../../../../core/errors/failures.dart';
import '../../../../shared/domain/usecases/usecase.dart';
import '../repositories/auth_repository.dart';
class LogoutUseCase implements UseCase<void, NoParams> {
final AuthRepository repository;
LogoutUseCase(this.repository);
@override
Future<Either<Failure, void>> call(NoParams params) async {
return repository.logout();
}
}