Skip to content

Instantly share code, notes, and snippets.

@felipecastrosales
Created October 22, 2022 22:25
Show Gist options
  • Save felipecastrosales/46163c3197cc30097aa9aabc16cb21b9 to your computer and use it in GitHub Desktop.
Save felipecastrosales/46163c3197cc30097aa9aabc16cb21b9 to your computer and use it in GitHub Desktop.
solid 2
// Player
// Objetivo: Tocar musicas em mais de uma fonte (Spotify e Dezer)
// Construir as classes baseado no principio SOLID e CLEAN para esse player
// 1) search music by artist
// 2) search music by id
// 3) play music
// 4) pause music
// 5) continue music
// 1) Entity
// 2) UseCase
// 3) Repo
// 4) DataSource
// 5) Implementation
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// 1 - Entity
class ArtistEntity {
final String id;
final String name;
ArtistEntity({
required this.id,
required this.name,
});
}
class MusicEntity {
final String id;
final String name;
final ArtistEntity artist;
final String album;
final String url;
MusicEntity({
required this.id,
required this.name,
required this.artist,
required this.album,
required this.url,
});
}
////////////////////////////////////////////////////////////////////////////////
// 2 - UseCase
abstract class MusicUseCase {
Future<List<MusicEntity>> searchMusicByArtist(String artist);
Future<MusicEntity> searchMusicById(String id);
Future<void> playMusic(MusicEntity music);
Future<void> pauseMusic();
Future<void> continueMusic();
}
////////////////////////////////////////////////////////////////////////////////
// 3 - Repository
abstract class MusicRepository {
Future<List<MusicEntity>> searchMusicByArtist(String artist);
Future<MusicEntity> searchMusicById(String id);
Future<void> playMusic(MusicEntity music);
Future<void> pauseMusic();
Future<void> continueMusic();
}
////////////////////////////////////////////////////////////////////////////////
// 4 - DataSource
abstract class MusicDataSource {
Future<List<MusicEntity>> searchMusicByArtist(String artist);
Future<MusicEntity> searchMusicById(String id);
Future<void> playMusic(MusicEntity music);
Future<void> pauseMusic();
Future<void> continueMusic();
}
////////////////////////////////////////////////////////////////////////////////
// 5 - Implementation
class MusicUseCaseImpl implements MusicUseCase {
final MusicRepositoryImpl _repository;
MusicUseCaseImpl({
required MusicRepositoryImpl repository,
}) : _repository = repository;
@override
Future<List<MusicEntity>> searchMusicByArtist(String artist) async {
return await _repository.searchMusicByArtist(artist);
}
@override
Future<MusicEntity> searchMusicById(String id) async {
return await _repository.searchMusicById(id);
}
@override
Future<void> playMusic(MusicEntity music) async {
return await _repository.playMusic(music);
}
@override
Future<void> pauseMusic() async {
return await _repository.pauseMusic();
}
@override
Future<void> continueMusic() async {
return await _repository.continueMusic();
}
}
abstract class MusicDataSourceImpl implements MusicDataSource {
final MusicDataSourceImpl _dataSource;
MusicDataSourceImpl({
required MusicDataSourceImpl dataSource,
}) : _dataSource = dataSource;
@override
Future<List<MusicEntity>> searchMusicByArtist(String artist) async {
return await _dataSource.searchMusicByArtist(artist);
}
@override
Future<MusicEntity> searchMusicById(String id) async {
return await _dataSource.searchMusicById(id);
}
@override
Future<void> playMusic(MusicEntity music) async {
return await _dataSource.playMusic(music);
}
@override
Future<void> pauseMusic() async {
return await _dataSource.pauseMusic();
}
@override
Future<void> continueMusic() async {
return await _dataSource.continueMusic();
}
}
abstract class MusicRepositoryImpl implements MusicRepository {
final MusicDataSourceImpl _dataSource;
MusicRepositoryImpl({
required MusicDataSourceImpl dataSource,
}) : _dataSource = dataSource;
@override
Future<List<MusicEntity>> searchMusicByArtist(String artist) async {
return await _dataSource.searchMusicByArtist(artist);
}
@override
Future<MusicEntity> searchMusicById(String id) async {
return await _dataSource.searchMusicById(id);
}
@override
Future<void> playMusic(MusicEntity music) async {
return await _dataSource.playMusic(music);
}
@override
Future<void> pauseMusic() async {
return await _dataSource.pauseMusic();
}
@override
Future<void> continueMusic() async {
return await _dataSource.continueMusic();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment