@@ -4,23 +4,40 @@ import 'package:firebase_auth/firebase_auth.dart';
44import 'package:flutter/foundation.dart' ;
55import 'package:spotify_with_flutter/data/models/songs/songs.dart' ;
66import 'package:spotify_with_flutter/domain/entities/songs/songs.dart' ;
7+ import 'package:spotify_with_flutter/domain/usecase/song/is_favorite_song.dart' ;
8+ import 'package:spotify_with_flutter/service_locator.dart' ;
79
810abstract class SongFirebaseService {
911 Future <Either > getNewsSongs ();
1012 Future <Either > getPlayList ();
11- Future <Either > addOrRemoveFavoriteSong ();
13+ Future <Either > addOrRemoveFavoriteSong (String songId);
14+ Future <bool > isFavoriteSong (String songId);
1215}
1316
1417class SongFirebaseServiceImpl extends SongFirebaseService {
1518 @override
1619 Future <Either > getNewsSongs () async {
1720 try {
1821 List <SongEntity > songs = [];
19- var data = await FirebaseFirestore .instance.collection ('Songs' ).orderBy ('releaseDate' , descending: true ).limit (3 ).get ();
22+ var data = await FirebaseFirestore .instance
23+ .collection ('Songs' )
24+ .orderBy (
25+ 'releaseDate' ,
26+ descending: true ,
27+ )
28+ .limit (3 )
29+ .get ();
2030
2131 for (var element in data.docs) {
2232 var songModel = SongModel .fromJson (element.data ());
23- songs.add (songModel.toEntity ());
33+ bool isFavorite = await sl <IsFavoriteSongUseCase >().call (
34+ params: element.reference.id,
35+ );
36+ songModel.isFavorite = isFavorite;
37+ songModel.songId = element.reference.id;
38+ songs.add (
39+ songModel.toEntity (),
40+ );
2441 }
2542
2643 return right (songs);
@@ -36,11 +53,26 @@ class SongFirebaseServiceImpl extends SongFirebaseService {
3653 Future <Either > getPlayList () async {
3754 try {
3855 List <SongEntity > songs = [];
39- var data = await FirebaseFirestore .instance.collection ('Songs' ).orderBy ('releaseDate' , descending: true ).get ();
56+ var data = await FirebaseFirestore .instance
57+ .collection ('Songs' )
58+ .orderBy (
59+ 'releaseDate' ,
60+ descending: true ,
61+ )
62+ .get ();
4063
4164 for (var element in data.docs) {
4265 var songModel = SongModel .fromJson (element.data ());
43- songs.add (songModel.toEntity ());
66+
67+ bool isFavorite = await sl <IsFavoriteSongUseCase >().call (
68+ params: element.reference.id,
69+ );
70+ songModel.isFavorite = isFavorite;
71+ songModel.songId = element.reference.id;
72+
73+ songs.add (
74+ songModel.toEntity (),
75+ );
4476 }
4577
4678 return right (songs);
@@ -53,15 +85,75 @@ class SongFirebaseServiceImpl extends SongFirebaseService {
5385 }
5486
5587 @override
56- Future <Either > addOrRemoveFavoriteSong () async {
57- final FirebaseAuth firebaseAuth = FirebaseAuth .instance;
88+ Future <Either > addOrRemoveFavoriteSong (String songId) async {
89+ try {
90+ final FirebaseAuth firebaseAuth = FirebaseAuth .instance;
91+
92+ final FirebaseFirestore firebaseFirestore = FirebaseFirestore .instance;
93+
94+ late bool isFavorite;
5895
59- final FirebaseFirestore firebaseFirestore = FirebaseFirestore .instance ;
96+ var user = await firebaseAuth.currentUser ;
6097
61- var user = await firebaseAuth.currentUser ;
98+ String uID = user ! .uid ;
6299
63- String uID = us
100+ QuerySnapshot favoriteSongs = await firebaseFirestore
101+ .collection ('Users' )
102+ .doc (uID)
103+ .collection ('Favorites' )
104+ .where (
105+ 'songId' ,
106+ isEqualTo: songId,
107+ )
108+ .get ();
109+
110+ if (favoriteSongs.docs.isNotEmpty) {
111+ await favoriteSongs.docs.first.reference.delete ();
112+ isFavorite = false ;
113+ } else {
114+ await firebaseFirestore.collection ('Users' ).doc (uID).collection ('Favorites' ).add (
115+ {
116+ 'songId' : songId,
117+ 'addedDate' : Timestamp .now (),
118+ },
119+ );
120+ isFavorite = true ;
121+ }
122+
123+ return Right (isFavorite);
124+ } catch (e) {
125+ return const Left ('An error occurred' );
126+ }
127+ }
64128
65-
129+ @override
130+ Future <bool > isFavoriteSong (String songId) async {
131+ try {
132+ final FirebaseAuth firebaseAuth = FirebaseAuth .instance;
133+
134+ final FirebaseFirestore firebaseFirestore = FirebaseFirestore .instance;
135+
136+ var user = await firebaseAuth.currentUser;
137+
138+ String uID = user! .uid;
139+
140+ QuerySnapshot favoriteSongs = await firebaseFirestore
141+ .collection ('Users' )
142+ .doc (uID)
143+ .collection ('Favorites' )
144+ .where (
145+ 'songId' ,
146+ isEqualTo: songId,
147+ )
148+ .get ();
149+
150+ if (favoriteSongs.docs.isNotEmpty) {
151+ return true ;
152+ } else {
153+ return false ;
154+ }
155+ } catch (e) {
156+ return false ;
157+ }
66158 }
67159}
0 commit comments