import 'dart:io'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:tuple/tuple.dart'; import 'package:firebase_storage/firebase_storage.dart'; import '../main.dart'; class PostService { createPost(String? description, String idMusic, File? image, Tuple2? location) async { var id = MyApp.userViewModel.userCurrent.id; final post = { "user_id": id, "description": description, "date": DateTime.now(), "place": [location?.item1, location?.item2], "song_id": idMusic, "likes": [] }; var postAdd = await MyApp.db.collection("posts").add(post); var userRef = MyApp.db.collection("users").doc(id); await MyApp.db.runTransaction((transaction) async { var userSnapshot = await transaction.get(userRef); if (userSnapshot.exists) { int currentNbCapsules = userSnapshot.data()?['nbCapsules'] ?? 0; transaction.update(userRef, {'nbCapsules': currentNbCapsules + 1}); MyApp.userViewModel.userCurrent.capsules++; } }); if (image != null) { var imageRef = FirebaseStorage.instance.ref('$id${postAdd.id}.jpg'); await imageRef.putFile(image); var imageUrl = await imageRef.getDownloadURL(); postAdd.update({"selfie": imageUrl}); } } deletePost() {} Future>>> getPopularPosts(int limit) async { DateTime twentyFourHoursAgo = DateTime.now().subtract(Duration(hours: 24)); var response = await FirebaseFirestore.instance .collection("posts") .where("date", isGreaterThan: twentyFourHoursAgo) .orderBy("date", descending: true) .limit(limit) .get(); MyApp.postViewModel.lastPostDiscovery = response.docs.isNotEmpty ? response.docs.last : MyApp.postViewModel.lastPostDiscovery; var filteredPosts = response.docs.where((doc) { String user = doc["user_id"]; return user != MyApp.userViewModel.userCurrent.id; }).toList(); return filteredPosts; } Future>>> getMorePopularPosts(int limit) async { DateTime twentyFourHoursAgo = DateTime.now().subtract(Duration(hours: 24)); QuerySnapshot> response; response = await FirebaseFirestore.instance .collection("posts") .where("date", isGreaterThan: twentyFourHoursAgo) .orderBy("date", descending: true) .limit(limit) .startAfterDocument(MyApp.postViewModel.lastPostDiscovery) .get(); MyApp.postViewModel.lastPostDiscovery = response.docs.isNotEmpty ? response.docs.last : MyApp.postViewModel.lastPostDiscovery; var filteredPosts = response.docs.where((doc) { String user = doc["user_id"]; return user != MyApp.userViewModel.userCurrent.id; }).toList(); return filteredPosts; } Future>>> getPostsFriends(int limit) async { var response = await FirebaseFirestore.instance .collection("posts") .where("user_id", whereIn: [ MyApp.userViewModel.userCurrent.id, ...MyApp.userViewModel.userCurrent.followed ]) .where("") .orderBy("date", descending: true) .limit(limit) .get(); MyApp.postViewModel.lastPostFriend = response.docs.isNotEmpty ? response.docs.last : MyApp.postViewModel.lastPostFriend; return response.docs; } Future>>> getMorePostsFriends(int limit) async { var response = await FirebaseFirestore.instance .collection("posts") .where("user_id", whereIn: [ MyApp.userViewModel.userCurrent.id, ...MyApp.userViewModel.userCurrent.followed ]) .orderBy("date", descending: true) .limit(limit) .startAfterDocument(MyApp.postViewModel.lastPostFriend) .get(); MyApp.postViewModel.lastPostFriend = response.docs.isNotEmpty ? response.docs.last : MyApp.postViewModel.lastPostFriend; return response.docs; } Future getAvailable(String idUser) async { DateTime today = DateTime.now(); QuerySnapshot> response = await FirebaseFirestore .instance .collection("posts") .where("user_id", isEqualTo: idUser) .get(); bool isTodayAvailable = response.docs.any((doc) { DateTime date = doc["date"].toDate(); return date.day == today.day && date.month == today.month && date.year == today.year; }); return !isTodayAvailable; } Future> recapSevenDays(String id) async { List recapList = []; DateTime sevenDaysAgo = DateTime.now().subtract(Duration(days: 6)); QuerySnapshot> response = await FirebaseFirestore .instance .collection("posts") .where("user_id", isEqualTo: id) .get(); List?> postList = response.docs .map((DocumentSnapshot> doc) => doc.data()) .toList(); for (int i = 0; i < 7; i++) { DateTime date = sevenDaysAgo.add(Duration(days: i)); bool postExists = postList.any((post) => post?["date"] != null && post?["date"].toDate().year == date.year && post?["date"].toDate().month == date.month && post?["date"].toDate().day == date.day); recapList.add(postExists); } return recapList; } Future> getLikesByPostId(String id) async { var response = await FirebaseFirestore.instance.collection("posts").doc(id).get(); if (response.exists) { var musicFavorite = response.get("likes"); return List.from(musicFavorite); } else { return []; } } Future addOrDeleteFavoritePost(String id) async { final idUser = MyApp.userViewModel.userCurrent.id; var postRef = await FirebaseFirestore.instance.collection("posts").doc(id); var response = await postRef.get(); List likes = List.from(response.get("likes")); if (!likes.contains(idUser)) { likes.add(idUser); await postRef.update({"likes": likes}); return false; } else { likes.remove(idUser); await postRef.update({"likes": likes}); return true; } } }