LCOV - code coverage report
Current view: top level - data/repositories - favorites_repository_impl.dart (source / functions) Hit Total Coverage
Test: lcov.info Lines: 28 29 96.6 %
Date: 2026-03-02 18:37:46 Functions: 0 0 -

          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             : }

Generated by: LCOV version 1.14