cargo66/lib/data/repositories/user_repository_impl.dart

72 lines
1.8 KiB
Dart
Raw Normal View History

2024-07-23 06:37:42 +00:00
import 'package:dartz/dartz.dart';
import '../../core/core.dart';
import '../../domain/domain.dart';
import '../data_sources/data_sources.dart';
import '../models/user/authentication_response_model.dart';
typedef _DataSourceChooser = Future<AuthenticationResponseModel> Function();
class UserRepositoryImpl implements UserRepository {
final UserRemoteDataSource remoteDataSource;
final UserLocalDataSource localDataSource;
final NetworkInfo networkInfo;
UserRepositoryImpl({
required this.remoteDataSource,
required this.localDataSource,
required this.networkInfo,
});
@override
Future<Either<Failure, User>> signIn(params) async {
return await _authenticate(() {
return remoteDataSource.signIn(params);
});
}
@override
Future<Either<Failure, User>> signUp(params) async {
return await _authenticate(() {
return remoteDataSource.signUp(params);
});
}
@override
Future<Either<Failure, User>> getCachedUser() async {
try {
final user = await localDataSource.getUser();
return Right(user);
} on CacheFailure {
return Left(CacheFailure());
}
}
@override
Future<Either<Failure, NoParams>> signOut() async {
try {
await localDataSource.clearCache();
return Right(NoParams());
} on CacheFailure {
return Left(CacheFailure());
}
}
Future<Either<Failure, User>> _authenticate(
_DataSourceChooser getDataSource,
) async {
if (await networkInfo.isConnected) {
try {
final remoteResponse = await getDataSource();
localDataSource.saveToken(remoteResponse.token);
localDataSource.saveUser(remoteResponse.user);
return Right(remoteResponse.user);
} on Failure catch (failure) {
return Left(failure);
}
} else {
return Left(NetworkFailure());
}
}
}