historic page
continuous-integration/drone/push Build is passing Details

HISTORIC_CAPSULE_LDE
Lucas Delanier 2 years ago
parent 7b9f81b543
commit 3b9a39407d

@ -26,16 +26,12 @@ class _HistoricComponentState extends State<HistoricComponent> {
} }
getHistoric() {} getHistoric() {}
List<Tuple2<int, Music>> historic = [
Tuple2(1, MyApp.postViewModel.bestPosts.first.music),
Tuple2(3, MyApp.postViewModel.bestPosts.first.music),
Tuple2(11, MyApp.postViewModel.bestPosts.first.music)
];
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return FutureBuilder( return FutureBuilder(
future: , future: MyApp.musicViewModel
.getHistoryCapsulesMonthWhitIdUser(MyApp.userViewModel.userCurrent.id, widget.month, widget.year),
builder: (context, snapshot) { builder: (context, snapshot) {
if (snapshot.hasData) { if (snapshot.hasData) {
return Wrap( return Wrap(
@ -43,11 +39,14 @@ class _HistoricComponentState extends State<HistoricComponent> {
runSpacing: 14, runSpacing: 14,
children: List.generate(getNumberOfDaysInMonth(widget.year, widget.month), (index) { children: List.generate(getNumberOfDaysInMonth(widget.year, widget.month), (index) {
Tuple2<int, Music>? checkCapsule; Tuple2<int, Music>? checkCapsule;
for (var element in historic) { if (snapshot.data != null) {
for (var element in snapshot.data!) {
if (element.item1 == index + 1) { if (element.item1 == index + 1) {
checkCapsule = element; checkCapsule = element;
} }
} }
}
if ((widget.year > DateTime.now().year || widget.month > DateTime.now().month) || if ((widget.year > DateTime.now().year || widget.month > DateTime.now().month) ||
(widget.year == DateTime.now().year && (widget.year == DateTime.now().year &&
widget.month == DateTime.now().month && widget.month == DateTime.now().month &&
@ -79,7 +78,8 @@ class _HistoricComponentState extends State<HistoricComponent> {
child: Center( child: Center(
child: Text( child: Text(
(index + 1).toString(), (index + 1).toString(),
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontSize: 22, fontWeight: FontWeight.w800), style:
GoogleFonts.plusJakartaSans(color: Colors.white, fontSize: 22, fontWeight: FontWeight.w800),
), ),
), ),
); );
@ -88,11 +88,9 @@ class _HistoricComponentState extends State<HistoricComponent> {
// Generate widgets // Generate widgets
}), }),
); );
} } else {
else{
return CupertinoActivityIndicator(); return CupertinoActivityIndicator();
} }
}); });
} }
} }

@ -5,8 +5,7 @@ import '../main.dart';
class MusicService { class MusicService {
Future<dynamic> getFavoriteMusicsByUserId(String id) async { Future<dynamic> getFavoriteMusicsByUserId(String id) async {
var response = var response = await FirebaseFirestore.instance.collection("users").doc(id).get();
await FirebaseFirestore.instance.collection("users").doc(id).get();
if (response.exists) { if (response.exists) {
var musicFavorite = response.get("musics_likes"); var musicFavorite = response.get("musics_likes");
return List.from(musicFavorite); return List.from(musicFavorite);
@ -16,9 +15,7 @@ class MusicService {
} }
deleteFavoriteMusic(String id) async { deleteFavoriteMusic(String id) async {
var userRef = await FirebaseFirestore.instance var userRef = await FirebaseFirestore.instance.collection("users").doc(MyApp.userViewModel.userCurrent.id);
.collection("users")
.doc(MyApp.userViewModel.userCurrent.id);
var response = await userRef.get(); var response = await userRef.get();
List<dynamic> musicFavorite = List.from(response.get("musics_likes")); List<dynamic> musicFavorite = List.from(response.get("musics_likes"));
@ -31,9 +28,7 @@ class MusicService {
} }
Future<bool> addOrDeleteFavoriteMusic(String id) async { Future<bool> addOrDeleteFavoriteMusic(String id) async {
var userRef = await FirebaseFirestore.instance var userRef = await FirebaseFirestore.instance.collection("users").doc(MyApp.userViewModel.userCurrent.id);
.collection("users")
.doc(MyApp.userViewModel.userCurrent.id);
var response = await userRef.get(); var response = await userRef.get();
List<dynamic> musicFavorite = List.from(response.get("musics_likes")); List<dynamic> musicFavorite = List.from(response.get("musics_likes"));
@ -48,9 +43,8 @@ class MusicService {
} }
} }
Future<List<Tuple2<String, String>>> getHistoryCapsulesMonthWhitIdUser( Future<List<Tuple2<int, String>>> getHistoryCapsulesMonthWhitIdUser(String idUser, int month, int year) async {
String idUser, int month, int year) async { List<Tuple2<int, String>> capsules = [];
List<Tuple2<String, String>> capsules = [];
var querySnapshot = await FirebaseFirestore.instance var querySnapshot = await FirebaseFirestore.instance
.collection('posts') .collection('posts')
@ -61,8 +55,7 @@ class MusicService {
.get(); .get();
for (var document in querySnapshot.docs) { for (var document in querySnapshot.docs) {
capsules.add(Tuple2(document.data()['date'].toDate().day.toString(), capsules.add(Tuple2(document.data()['date'].toDate().day, document.data()['song_id']));
document.data()['idMusic']));
} }
return capsules; return capsules;

@ -7,8 +7,7 @@ import 'package:firebase_storage/firebase_storage.dart';
import '../main.dart'; import '../main.dart';
class PostService { class PostService {
createPost(String? description, String idMusic, File? image, createPost(String? description, String idMusic, File? image, Tuple2<String, String>? location) async {
Tuple2<String, String>? location) async {
var id = MyApp.userViewModel.userCurrent.id; var id = MyApp.userViewModel.userCurrent.id;
final post = <String, dynamic>{ final post = <String, dynamic>{
"user_id": id, "user_id": id,
@ -42,14 +41,11 @@ class PostService {
deletePost() {} deletePost() {}
Future<List<QueryDocumentSnapshot<Map<String, dynamic>>>> getPopularPosts( Future<List<QueryDocumentSnapshot<Map<String, dynamic>>>> getPopularPosts({int limit = 10, int offset = 0}) async {
{int limit = 10, int offset = 0}) async {
DateTime twentyFourHoursAgo = DateTime.now().subtract(Duration(hours: 24)); DateTime twentyFourHoursAgo = DateTime.now().subtract(Duration(hours: 24));
Timestamp twentyFourHoursAgoTimestamp = Timestamp twentyFourHoursAgoTimestamp = Timestamp.fromDate(twentyFourHoursAgo);
Timestamp.fromDate(twentyFourHoursAgo);
QuerySnapshot<Map<String, dynamic>> response = await FirebaseFirestore QuerySnapshot<Map<String, dynamic>> response = await FirebaseFirestore.instance
.instance
.collection("posts") .collection("posts")
.where("date", isGreaterThan: twentyFourHoursAgoTimestamp) .where("date", isGreaterThan: twentyFourHoursAgoTimestamp)
.limit(limit) .limit(limit)
@ -67,8 +63,7 @@ class PostService {
return Timestamp.fromDate(twentyFourHoursAgo); return Timestamp.fromDate(twentyFourHoursAgo);
} }
Future<List<QueryDocumentSnapshot<Map<String, dynamic>>>> getPostsFriends( Future<List<QueryDocumentSnapshot<Map<String, dynamic>>>> getPostsFriends({int limit = 10, int offset = 0}) async {
{int limit = 10, int offset = 0}) async {
var timestamp = _getTwentyFourHoursAgoTimestamp(); var timestamp = _getTwentyFourHoursAgoTimestamp();
var response = await FirebaseFirestore.instance var response = await FirebaseFirestore.instance
.collection("posts") .collection("posts")
@ -84,17 +79,12 @@ class PostService {
Future<bool> getAvailable(String idUser) async { Future<bool> getAvailable(String idUser) async {
DateTime today = DateTime.now(); DateTime today = DateTime.now();
QuerySnapshot<Map<String, dynamic>> response = await FirebaseFirestore QuerySnapshot<Map<String, dynamic>> response =
.instance await FirebaseFirestore.instance.collection("posts").where("user_id", isEqualTo: idUser).get();
.collection("posts")
.where("user_id", isEqualTo: idUser)
.get();
bool isTodayAvailable = response.docs.any((doc) { bool isTodayAvailable = response.docs.any((doc) {
DateTime date = doc["date"].toDate(); // Assuming the field name is "date" DateTime date = doc["date"].toDate(); // Assuming the field name is "date"
return date.day == today.day && return date.day == today.day && date.month == today.month && date.year == today.year;
date.month == today.month &&
date.year == today.year;
}); });
return !isTodayAvailable; return !isTodayAvailable;
@ -105,15 +95,11 @@ class PostService {
DateTime sevenDaysAgo = DateTime.now().subtract(Duration(days: 6)); DateTime sevenDaysAgo = DateTime.now().subtract(Duration(days: 6));
QuerySnapshot<Map<String, dynamic>> response = await FirebaseFirestore QuerySnapshot<Map<String, dynamic>> response =
.instance await FirebaseFirestore.instance.collection("posts").where("user_id", isEqualTo: id).get();
.collection("posts")
.where("user_id", isEqualTo: id)
.get();
List<Map<String, dynamic>?> postList = response.docs List<Map<String, dynamic>?> postList =
.map((DocumentSnapshot<Map<String, dynamic>> doc) => doc.data()) response.docs.map((DocumentSnapshot<Map<String, dynamic>> doc) => doc.data()).toList();
.toList();
for (int i = 0; i < 7; i++) { for (int i = 0; i < 7; i++) {
DateTime date = sevenDaysAgo.add(Duration(days: i)); DateTime date = sevenDaysAgo.add(Duration(days: i));

@ -28,8 +28,7 @@ class MusicViewModel {
return _getMusicFromResponse(responseData); return _getMusicFromResponse(responseData);
} else { } else {
throw Exception( throw Exception('Error retrieving music information : ${response.statusCode} ${response.reasonPhrase}');
'Error retrieving music information : ${response.statusCode} ${response.reasonPhrase}');
} }
} }
@ -49,13 +48,10 @@ class MusicViewModel {
artists); artists);
} }
Future<List<Music>> getMusicsWithName(String name, Future<List<Music>> getMusicsWithName(String name, {int limit = 20, int offset = 0, String market = "FR"}) async {
{int limit = 20, int offset = 0, String market = "FR"}) async {
var accessToken = await _token.getAccessToken(); var accessToken = await _token.getAccessToken();
var response = await http.get( var response = await http
Uri.parse( .get(Uri.parse('$API_URL/search?q=track%3A$name&type=track&market=fr&limit=$limit&offset=$offset'), headers: {
'$API_URL/search?q=track%3A$name&type=track&market=fr&limit=$limit&offset=$offset'),
headers: {
'Authorization': 'Bearer $accessToken', 'Authorization': 'Bearer $accessToken',
}); });
@ -65,18 +61,15 @@ class MusicViewModel {
return _getMusicFromResponse(track); return _getMusicFromResponse(track);
})); }));
} else { } else {
throw Exception( throw Exception('Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}');
'Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}');
} }
} }
Future<List<Music>> getMusicsWithArtistName(String name, Future<List<Music>> getMusicsWithArtistName(String name,
{int limit = 20, int offset = 0, String market = "FR"}) async { {int limit = 20, int offset = 0, String market = "FR"}) async {
var accessToken = await _token.getAccessToken(); var accessToken = await _token.getAccessToken();
var response = await http.get( var response = await http
Uri.parse( .get(Uri.parse('$API_URL/search?q=artist%3A$name&type=track&market=fr&limit=$limit&offset=$offset'), headers: {
'$API_URL/search?q=artist%3A$name&type=track&market=fr&limit=$limit&offset=$offset'),
headers: {
'Authorization': 'Bearer $accessToken', 'Authorization': 'Bearer $accessToken',
}); });
@ -86,24 +79,19 @@ class MusicViewModel {
return _getMusicFromResponse(track); return _getMusicFromResponse(track);
})); }));
} else { } else {
throw Exception( throw Exception('Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}');
'Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}');
} }
} }
Future<Artist> getArtistWithName(String name, {String market = "FR"}) async { Future<Artist> getArtistWithName(String name, {String market = "FR"}) async {
var accessToken = await _token.getAccessToken(); var accessToken = await _token.getAccessToken();
var response = await http.get( var response = await http.get(Uri.parse('$API_URL/search?q=artist%3A$name&type=artist&market=$market'), headers: {
Uri.parse(
'$API_URL/search?q=artist%3A$name&type=artist&market=$market'),
headers: {
'Authorization': 'Bearer $accessToken', 'Authorization': 'Bearer $accessToken',
}); });
if (response.statusCode == 200) { if (response.statusCode == 200) {
final responseData = jsonDecode(response.body); final responseData = jsonDecode(response.body);
List<Artist> artists = List<Artist> artists = List<Artist>.from(responseData['artists']['items'].map((artist) {
List<Artist>.from(responseData['artists']['items'].map((artist) {
String image = ''; String image = '';
if (!artist['images'].isEmpty) { if (!artist['images'].isEmpty) {
image = artist['images'][0]['url']; image = artist['images'][0]['url'];
@ -119,25 +107,21 @@ class MusicViewModel {
throw Exception('Artist not found : ${name}'); throw Exception('Artist not found : ${name}');
} else { } else {
throw Exception( throw Exception('Error retrieving artist information : ${response.statusCode} ${response.reasonPhrase}');
'Error retrieving artist information : ${response.statusCode} ${response.reasonPhrase}');
} }
} }
Future<List<Artist>> getArtistsWithName(String name, Future<List<Artist>> getArtistsWithName(String name, {int limit = 20, int offset = 0, String market = "FR"}) async {
{int limit = 20, int offset = 0, String market = "FR"}) async {
var accessToken = await _token.getAccessToken(); var accessToken = await _token.getAccessToken();
var response = await http.get( var response = await http.get(
Uri.parse( Uri.parse('$API_URL/search?q=artist%3A$name&type=artist&market=$market&limit=$limit&offset=$offset'),
'$API_URL/search?q=artist%3A$name&type=artist&market=$market&limit=$limit&offset=$offset'),
headers: { headers: {
'Authorization': 'Bearer $accessToken', 'Authorization': 'Bearer $accessToken',
}); });
if (response.statusCode == 200) { if (response.statusCode == 200) {
final responseData = jsonDecode(response.body); final responseData = jsonDecode(response.body);
List<Artist> artists = List<Artist> artists = List<Artist>.from(responseData['artists']['items'].map((artist) {
List<Artist>.from(responseData['artists']['items'].map((artist) {
String image = ''; String image = '';
if (!artist['images'].isEmpty) { if (!artist['images'].isEmpty) {
image = artist['images'][0]['url']; image = artist['images'][0]['url'];
@ -147,17 +131,13 @@ class MusicViewModel {
return artists; return artists;
} else { } else {
throw Exception( throw Exception('Error while retrieving artist : ${response.statusCode} ${response.reasonPhrase}');
'Error while retrieving artist : ${response.statusCode} ${response.reasonPhrase}');
} }
} }
Future<List<Music>> getTopMusicsWithArtistId(String id, Future<List<Music>> getTopMusicsWithArtistId(String id, {String market = "FR"}) async {
{String market = "FR"}) async {
var accessToken = await _token.getAccessToken(); var accessToken = await _token.getAccessToken();
var response = await http.get( var response = await http.get(Uri.parse('$API_URL/artists/$id/top-tracks?market=$market'), headers: {
Uri.parse('$API_URL/artists/$id/top-tracks?market=$market'),
headers: {
'Authorization': 'Bearer $accessToken', 'Authorization': 'Bearer $accessToken',
}); });
@ -167,16 +147,13 @@ class MusicViewModel {
return _getMusicFromResponse(track); return _getMusicFromResponse(track);
})); }));
} else { } else {
throw Exception( throw Exception('Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}');
'Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}');
} }
} }
Future<List<Music>> getMusicsWithPlaylistId(String id, Future<List<Music>> getMusicsWithPlaylistId(String id, {String market = "FR"}) async {
{String market = "FR"}) async {
var accessToken = await _token.getAccessToken(); var accessToken = await _token.getAccessToken();
var response = await http var response = await http.get(Uri.parse('$API_URL/playlists/$id?market=$market'), headers: {
.get(Uri.parse('$API_URL/playlists/$id?market=$market'), headers: {
'Authorization': 'Bearer $accessToken', 'Authorization': 'Bearer $accessToken',
}); });
@ -192,13 +169,11 @@ class MusicViewModel {
return musics; return musics;
} else { } else {
throw Exception( throw Exception('Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}');
'Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}');
} }
} }
Future<List<Music>> getMusicsWithIds(List<String> ids, Future<List<Music>> getMusicsWithIds(List<String> ids, {String market = "FR"}) async {
{String market = "FR"}) async {
var accessToken = await _token.getAccessToken(); var accessToken = await _token.getAccessToken();
String url = API_URL + '/tracks?market=$market&ids='; String url = API_URL + '/tracks?market=$market&ids=';
@ -216,8 +191,7 @@ class MusicViewModel {
return _getMusicFromResponse(track); return _getMusicFromResponse(track);
})); }));
} else { } else {
throw Exception( throw Exception('Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}');
'Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}');
} }
} }
@ -227,12 +201,10 @@ class MusicViewModel {
List<Music> musics = []; List<Music> musics = [];
Artist artist = await getArtistWithName(name, market: market); Artist artist = await getArtistWithName(name, market: market);
musics.addAll(await getTopMusicsWithArtistId(artist.id)); musics.addAll(await getTopMusicsWithArtistId(artist.id));
musics.addAll(await getMusicsWithName(name, musics.addAll(await getMusicsWithName(name, limit: limit, offset: offset, market: market));
limit: limit, offset: offset, market: market));
return musics; return musics;
} catch (e) { } catch (e) {
return await getMusicsWithName(name, return await getMusicsWithName(name, limit: limit, offset: offset, market: market);
limit: limit, offset: offset, market: market);
} }
} }
@ -255,21 +227,18 @@ class MusicViewModel {
} }
} }
Future<List<Tuple2<String, Music>>> getHistoryCapsulesMonthWhitIdUser( Future<List<Tuple2<int, Music>>> getHistoryCapsulesMonthWhitIdUser(String idUser, int month, int year) async {
String idUser, int month, int year) async {
try { try {
List<Tuple2<String, Music>> capsules = []; List<Tuple2<int, Music>> capsules = [];
var capsulesData = await _musicService.getHistoryCapsulesMonthWhitIdUser( var capsulesData = await _musicService.getHistoryCapsulesMonthWhitIdUser(idUser, month, year);
idUser, month, year);
var musics = await getMusicsWithIds( var musics = await getMusicsWithIds(capsulesData.map((capsule) => capsule.item2).toList());
capsulesData.map((capsule) => capsule.item2).toList());
for (var capsule in capsulesData) { for (var capsule in capsulesData) {
var music = musics.firstWhere((music) => music.id == capsule.item2); var music = musics.firstWhere((music) => music.id == capsule.item2);
print(capsule.item1);
capsules.add(Tuple2(capsule.item1, music)); capsules.add(Tuple2(capsule.item1, music));
} }
return capsules; return capsules;
} catch (e) { } catch (e) {
print(e); print(e);

Loading…
Cancel
Save