From 43b46dd4a15318e4e19f2d593b27677b428898c3 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Tue, 16 May 2023 10:05:37 +0200 Subject: [PATCH] changed some DAOs to take ids and added a friends feed getter --- .../be/ugent/sel/studeez/domain/FeedDAO.kt | 3 + .../be/ugent/sel/studeez/domain/SessionDAO.kt | 6 +- .../be/ugent/sel/studeez/domain/SubjectDAO.kt | 1 + .../domain/implementation/FirebaseFeedDAO.kt | 66 +++++++++++++++++-- .../implementation/FirebaseSessionDAO.kt | 22 +------ .../implementation/FirebaseSubjectDAO.kt | 13 ++-- 6 files changed, 75 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/FeedDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/FeedDAO.kt index 2d91781..e9e95b9 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/FeedDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/FeedDAO.kt @@ -7,4 +7,7 @@ interface FeedDAO { fun getFeedEntries(): Flow>> + suspend fun getFeedEntriesFromUser(id: String): Map> + + fun getFriendsSessions(): Flow>>> } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/SessionDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/SessionDAO.kt index 53d6996..4ac2891 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/SessionDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/SessionDAO.kt @@ -1,5 +1,6 @@ package be.ugent.sel.studeez.domain +import be.ugent.sel.studeez.data.local.models.FeedEntry import be.ugent.sel.studeez.data.local.models.SessionReport import be.ugent.sel.studeez.data.local.models.User import be.ugent.sel.studeez.data.local.models.task.Task @@ -11,11 +12,6 @@ interface SessionDAO { fun getSessions(): Flow> suspend fun getSessionsOfUser(userId: String): List - /** - * Return a list of pairs, containing the username and all the studysessions of that user. - */ - fun getFriendsSessions(): Flow>>> - fun saveSession(newSessionReport: SessionReport) fun deleteSession(newTimer: TimerInfo) diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/SubjectDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/SubjectDAO.kt index d887ef5..7b89bba 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/SubjectDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/SubjectDAO.kt @@ -20,4 +20,5 @@ interface SubjectDAO { fun getStudyTime(subject: Subject): Flow suspend fun getSubject(subjectId: String): Subject? + suspend fun getSubjectOfUSer(subjectId: String, userId: String): Subject } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFeedDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFeedDAO.kt index 6c445bf..be4893d 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFeedDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFeedDAO.kt @@ -5,19 +5,19 @@ import be.ugent.sel.studeez.data.local.models.FeedEntry import be.ugent.sel.studeez.data.local.models.SessionReport import be.ugent.sel.studeez.data.local.models.task.Subject import be.ugent.sel.studeez.data.local.models.task.Task -import be.ugent.sel.studeez.domain.FeedDAO -import be.ugent.sel.studeez.domain.SessionDAO -import be.ugent.sel.studeez.domain.SubjectDAO -import be.ugent.sel.studeez.domain.TaskDAO +import be.ugent.sel.studeez.domain.* import com.google.firebase.Timestamp import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import javax.inject.Inject class FirebaseFeedDAO @Inject constructor( + private val friendshipDAO: FriendshipDAO, private val sessionDAO: SessionDAO, private val taskDAO: TaskDAO, - private val subjectDAO: SubjectDAO + private val subjectDAO: SubjectDAO, + private val auth: AccountDAO, + private val userDAO: UserDAO, ) : FeedDAO { /** @@ -37,6 +37,45 @@ class FirebaseFeedDAO @Inject constructor( } } + /** + * Return a map as with key the day and value a list of feedentries for that day. + */ + override suspend fun getFeedEntriesFromUser(id: String): Map> { + return sessionDAO.getSessionsOfUser(id) + .map { sessionReport -> sessionToFeedEntryFromUser(sessionReport, id) } + .sortedByDescending { it.endTime } + .groupBy { getFormattedTime(it) } + .mapValues { (_, entries) -> + entries + .groupBy { it.taskId } + .map { fuseFeedEntries(it.component2()) } + } + } + + override fun getFriendsSessions(): Flow>>> { + return friendshipDAO.getAllFriendships(auth.currentUserId) + .map { friendships -> + friendships.map { friendship -> + val userId: String = friendship.friendId + val username = userDAO.getUsername(userId) + val friendFeed = getFeedEntriesFromUser(userId) + Pair(username, friendFeed) + } + }.map { + mergeNameAndEntries(it) + } + } + + private fun mergeNameAndEntries(l: List>>>): Map>> { + val new: MutableMap>> = mutableMapOf() + for ((name, map) in l) { + for ((day, feedEntries: List) in map) { + new[day] = new.getOrDefault(day, listOf()) + feedEntries.map { Pair(name, it) } + } + } + return new + } + private fun getFormattedTime(entry: FeedEntry): String { return DateFormat.getDateInstance().format(entry.endTime.toDate()) } @@ -67,6 +106,10 @@ class FirebaseFeedDAO @Inject constructor( val task: Task = taskDAO.getTask(subjectId, taskId) val subject: Subject = subjectDAO.getSubject(subjectId)!! + return makeFeedEntry(sessionReport, subject, task) + } + + private fun makeFeedEntry(sessionReport: SessionReport, subject: Subject, task: Task): FeedEntry { return FeedEntry( argb_color = subject.argb_color, subJectName = subject.name, @@ -78,4 +121,17 @@ class FirebaseFeedDAO @Inject constructor( isArchived = task.archived || subject.archived ) } + + /** + * Convert a sessionReport to a feedEntry. Fetch Task and Subject to get names + */ + private suspend fun sessionToFeedEntryFromUser(sessionReport: SessionReport, id: String): FeedEntry { + val subjectId: String = sessionReport.subjectId + val taskId: String = sessionReport.taskId + + val task: Task = taskDAO.getTaskFromUser(subjectId, taskId, id) + val subject: Subject = subjectDAO.getSubjectOfUSer(subjectId, id) + + return makeFeedEntry(sessionReport, subject, task) + } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSessionDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSessionDAO.kt index 7072de6..df271c6 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSessionDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSessionDAO.kt @@ -1,5 +1,6 @@ package be.ugent.sel.studeez.domain.implementation +import be.ugent.sel.studeez.data.local.models.FeedEntry import be.ugent.sel.studeez.data.local.models.SessionReport import be.ugent.sel.studeez.data.local.models.User import be.ugent.sel.studeez.data.local.models.task.Task @@ -25,9 +26,6 @@ import javax.inject.Inject class FirebaseSessionDAO @Inject constructor( private val firestore: FirebaseFirestore, private val auth: AccountDAO, - private val userDAO: UserDAO, - private val friendshipDAO: FriendshipDAO, - private val taskDAO: TaskDAO, ) : SessionDAO { override fun getSessions(): Flow> { @@ -44,24 +42,6 @@ class FirebaseSessionDAO @Inject constructor( .map { it.toObject(SessionReport::class.java) } } - override fun getFriendsSessions(): Flow>>> { - return friendshipDAO.getAllFriendships(auth.currentUserId) - .map { friendships -> - friendships.map { friendship -> - val userId: String = friendship.friendId - val username = userDAO.getUsername(userId) - val userTasks = getSessionsOfUser(userId) - .map { sessionReport -> - taskDAO.getTaskFromUser( - sessionReport.subjectId, - sessionReport.taskId, - userId - ) - } - Pair(username, userTasks) - } - } - } override fun saveSession(newSessionReport: SessionReport) { currentUserSessionsCollection().add(newSessionReport) diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSubjectDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSubjectDAO.kt index f1571d7..65c11a5 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSubjectDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSubjectDAO.kt @@ -1,6 +1,5 @@ package be.ugent.sel.studeez.domain.implementation -import android.util.Log import be.ugent.sel.studeez.data.local.models.task.Subject import be.ugent.sel.studeez.data.local.models.task.SubjectDocument import be.ugent.sel.studeez.data.local.models.task.Task @@ -35,6 +34,10 @@ class FirebaseSubjectDAO @Inject constructor( return currentUserSubjectsCollection().document(subjectId).get().await().toObject() } + override suspend fun getSubjectOfUSer(subjectId: String, userId: String): Subject { + return currentUserSubjectsCollection(userId).document(subjectId).get().await().toObject()!! + } + override fun saveSubject(newSubject: Subject) { currentUserSubjectsCollection().add(newSubject) } @@ -74,14 +77,14 @@ class FirebaseSubjectDAO @Inject constructor( .map { tasks -> tasks.sumOf { it.time } } } - private fun currentUserSubjectsCollection(): CollectionReference = + private fun currentUserSubjectsCollection(id: String = auth.currentUserId): CollectionReference = firestore.collection(FirebaseCollections.USER_COLLECTION) - .document(auth.currentUserId) + .document(id) .collection(FirebaseCollections.SUBJECT_COLLECTION) - private fun subjectTasksCollection(subject: Subject): CollectionReference = + private fun subjectTasksCollection(subject: Subject, id: String = auth.currentUserId): CollectionReference = firestore.collection(FirebaseCollections.USER_COLLECTION) - .document(auth.currentUserId) + .document(id) .collection(FirebaseCollections.SUBJECT_COLLECTION) .document(subject.id) .collection(FirebaseCollections.TASK_COLLECTION)