Line data Source code
1 : import 'package:tech_proof/core/error/failure.dart'; 2 : import 'package:tech_proof/core/network/safe_call.dart'; 3 : import 'package:tech_proof/core/services/local_storage_service.dart'; 4 : import 'package:tech_proof/domain/entities/movie_entity.dart'; 5 : import 'package:tech_proof/domain/repositories/favorites_repository.dart'; 6 : import 'package:dartz/dartz.dart'; 7 : 8 : class FavoriteRepositoryImpl implements FavoriteRepository { 9 : final LocalStorageService _localStorage; 10 : static const String _keyFavoriteMovies = 'favorite_movies_list'; 11 : List<MovieEntity>? _cachedFavorites; 12 : 13 2 : FavoriteRepositoryImpl(this._localStorage); 14 : 15 2 : @override 16 : Future<Either<Failure, void>> addMovieToFavorites(MovieEntity movie) async { 17 4 : return safeCall(() async { 18 : final Either<Failure, List<MovieEntity>> result = 19 2 : await getFavoriteMovies(); 20 4 : return result.fold((failure) => throw Exception(failure.message), ( 21 : favorites, 22 : ) async { 23 6 : if (!favorites.any((m) => m.id == movie.id)) { 24 2 : favorites.add(movie); 25 4 : await _localStorage.setJsonList<MovieEntity>( 26 : _keyFavoriteMovies, 27 : favorites, 28 : ); 29 2 : _cachedFavorites = favorites; 30 : } 31 : return; 32 : }); 33 : }); 34 : } 35 : 36 2 : @override 37 : Future<Either<Failure, List<MovieEntity>>> getFavoriteMovies() async { 38 2 : if (_cachedFavorites != null) { 39 3 : return Right(List.of(_cachedFavorites!)); 40 : } 41 4 : return safeCall(() async { 42 4 : final favorites = await _localStorage.getJsonList<MovieEntity>( 43 : _keyFavoriteMovies, 44 : MovieEntity.fromJson, 45 : ); 46 2 : _cachedFavorites = favorites; 47 2 : return List.of(favorites); 48 : }); 49 : } 50 : 51 2 : @override 52 : Future<Either<Failure, void>> removeMovieFromFavorites(int movieId) async { 53 4 : return safeCall(() async { 54 : final Either<Failure, List<MovieEntity>> result = 55 2 : await getFavoriteMovies(); 56 4 : return result.fold((failure) => throw Exception(failure.message), ( 57 : favorites, 58 : ) async { 59 8 : favorites.removeWhere((movie) => movie.id == movieId); 60 4 : await _localStorage.setJsonList<MovieEntity>( 61 : _keyFavoriteMovies, 62 : favorites, 63 : ); 64 2 : _cachedFavorites = favorites; 65 : return; 66 : }); 67 : }); 68 : } 69 : 70 1 : @override 71 : Future<Either<Failure, bool>> isFavoriteMovie(int movieId) async { 72 2 : return safeCall(() async { 73 : final Either<Failure, List<MovieEntity>> result = 74 1 : await getFavoriteMovies(); 75 1 : return result.fold( 76 0 : (failure) => throw Exception(failure.message), 77 5 : (favorites) => favorites.any((movie) => movie.id == movieId), 78 : ); 79 : }); 80 : } 81 : }