2020-03-24 22:17:03 +01:00
|
|
|
import 'package:dartz/dartz.dart';
|
2020-09-19 22:23:58 +02:00
|
|
|
import 'package:logging/logging.dart';
|
2020-03-24 22:17:03 +01:00
|
|
|
import 'package:meta/meta.dart';
|
|
|
|
|
|
|
|
import '../../core/error/failures.dart';
|
|
|
|
import '../../domain/entities/album.dart';
|
2020-08-08 19:02:03 +02:00
|
|
|
import '../../domain/entities/artist.dart';
|
2020-06-28 10:40:53 +02:00
|
|
|
import '../../domain/entities/song.dart';
|
2020-03-24 22:17:03 +01:00
|
|
|
import '../../domain/repositories/music_data_repository.dart';
|
|
|
|
import '../datasources/local_music_fetcher_contract.dart';
|
|
|
|
import '../datasources/music_data_source_contract.dart';
|
2020-03-26 11:58:30 +01:00
|
|
|
import '../models/album_model.dart';
|
2020-08-08 19:02:03 +02:00
|
|
|
import '../models/artist_model.dart';
|
2020-06-28 10:40:53 +02:00
|
|
|
import '../models/song_model.dart';
|
2020-03-24 22:17:03 +01:00
|
|
|
|
|
|
|
class MusicDataRepositoryImpl implements MusicDataRepository {
|
2020-03-28 09:38:52 +01:00
|
|
|
MusicDataRepositoryImpl({
|
|
|
|
@required this.localMusicFetcher,
|
|
|
|
@required this.musicDataSource,
|
|
|
|
});
|
2020-03-24 22:17:03 +01:00
|
|
|
|
2020-03-26 11:58:30 +01:00
|
|
|
final LocalMusicFetcher localMusicFetcher;
|
|
|
|
final MusicDataSource musicDataSource;
|
|
|
|
|
2020-09-19 22:23:58 +02:00
|
|
|
static final _log = Logger('MusicDataRepository');
|
|
|
|
|
2020-08-08 19:02:03 +02:00
|
|
|
@override
|
|
|
|
Future<Either<Failure, List<Artist>>> getArtists() async {
|
|
|
|
return musicDataSource.getArtists().then((List<ArtistModel> artists) =>
|
|
|
|
Right<Failure, List<ArtistModel>>(artists));
|
|
|
|
}
|
|
|
|
|
2020-03-24 22:17:03 +01:00
|
|
|
@override
|
|
|
|
Future<Either<Failure, List<Album>>> getAlbums() async {
|
2020-03-26 11:58:30 +01:00
|
|
|
return musicDataSource.getAlbums().then(
|
|
|
|
(List<AlbumModel> albums) => Right<Failure, List<AlbumModel>>(albums));
|
2020-03-24 22:17:03 +01:00
|
|
|
}
|
|
|
|
|
2020-03-30 22:25:57 +02:00
|
|
|
@override
|
|
|
|
Future<Either<Failure, List<Song>>> getSongs() async {
|
|
|
|
return musicDataSource.getSongs().then(
|
|
|
|
(List<SongModel> songs) => Right<Failure, List<SongModel>>(songs));
|
|
|
|
}
|
|
|
|
|
2020-06-28 10:40:53 +02:00
|
|
|
@override
|
2020-04-16 08:04:34 +02:00
|
|
|
Future<Either<Failure, List<Song>>> getSongsFromAlbum(Album album) async {
|
|
|
|
return musicDataSource.getSongsFromAlbum(album as AlbumModel).then(
|
|
|
|
(List<SongModel> songs) => Right<Failure, List<SongModel>>(songs));
|
|
|
|
}
|
|
|
|
|
2020-03-24 22:17:03 +01:00
|
|
|
@override
|
|
|
|
Future<void> updateDatabase() async {
|
2020-09-19 22:23:58 +02:00
|
|
|
_log.info('updataDatabase called');
|
|
|
|
|
2020-08-08 19:02:03 +02:00
|
|
|
await musicDataSource.deleteAllArtists();
|
|
|
|
final List<ArtistModel> artists = await localMusicFetcher.getArtists();
|
2020-03-24 22:17:03 +01:00
|
|
|
|
2020-08-08 19:02:03 +02:00
|
|
|
for (final ArtistModel artist in artists) {
|
|
|
|
await musicDataSource.insertArtist(artist);
|
|
|
|
}
|
|
|
|
|
|
|
|
await musicDataSource.deleteAllAlbums();
|
|
|
|
final List<AlbumModel> albums = await localMusicFetcher.getAlbums();
|
2020-06-28 10:40:53 +02:00
|
|
|
final Map<int, int> albumIdMap = {};
|
|
|
|
|
2020-03-26 11:58:30 +01:00
|
|
|
for (final AlbumModel album in albums) {
|
2020-08-08 19:02:03 +02:00
|
|
|
final int newAlbumId = await musicDataSource.insertAlbum(album);
|
|
|
|
albumIdMap[album.id] = newAlbumId;
|
2020-03-24 22:17:03 +01:00
|
|
|
}
|
2020-04-03 13:55:15 +02:00
|
|
|
|
|
|
|
final List<SongModel> songs = await localMusicFetcher.getSongs();
|
|
|
|
|
2020-09-19 22:23:58 +02:00
|
|
|
final List<SongModel> songsToInsert = [];
|
2020-04-03 13:55:15 +02:00
|
|
|
for (final SongModel song in songs) {
|
2020-09-19 22:23:58 +02:00
|
|
|
songsToInsert.add(song.copyWith(albumId: albumIdMap[song.albumId]));
|
2020-04-03 13:55:15 +02:00
|
|
|
}
|
2020-09-19 22:23:58 +02:00
|
|
|
await musicDataSource.insertSongs(songsToInsert);
|
|
|
|
|
|
|
|
_log.info('updataDatabase finished');
|
2020-03-24 22:17:03 +01:00
|
|
|
}
|
2020-09-19 17:08:48 +02:00
|
|
|
|
|
|
|
@override
|
2020-09-19 22:23:58 +02:00
|
|
|
Future<void> setSongBlocked(Song song, bool blocked) async {
|
|
|
|
await musicDataSource.setSongBlocked(song as SongModel, blocked);
|
2020-09-19 17:08:48 +02:00
|
|
|
}
|
2020-03-24 22:17:03 +01:00
|
|
|
}
|