#74 added FeedDAO and firebase implementation
This commit is contained in:
		
							parent
							
								
									a0ea97dc52
								
							
						
					
					
						commit
						bee7101bef
					
				
					 2 changed files with 54 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -1,4 +1,10 @@
 | 
			
		|||
package be.ugent.sel.studeez.domain
 | 
			
		||||
 | 
			
		||||
import be.ugent.sel.studeez.data.local.models.FeedEntry
 | 
			
		||||
import kotlinx.coroutines.flow.Flow
 | 
			
		||||
 | 
			
		||||
interface FeedDAO {
 | 
			
		||||
 | 
			
		||||
    fun getFeedEntries(): Flow<List<FeedEntry>>
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,4 +1,51 @@
 | 
			
		|||
package be.ugent.sel.studeez.domain.implementation
 | 
			
		||||
 | 
			
		||||
class FirebaseFeedDAO {
 | 
			
		||||
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.TaskDAO
 | 
			
		||||
import kotlinx.coroutines.flow.*
 | 
			
		||||
import javax.inject.Inject
 | 
			
		||||
 | 
			
		||||
class FirebaseFeedDAO @Inject constructor(
 | 
			
		||||
    private val sessionDAO: SessionDAO,
 | 
			
		||||
    private val taskDAO: TaskDAO,
 | 
			
		||||
    private val subjectDAO: FireBaseSubjectDAO
 | 
			
		||||
) : FeedDAO {
 | 
			
		||||
 | 
			
		||||
    override fun getFeedEntries(): Flow<List<FeedEntry>> {
 | 
			
		||||
        return sessionDAO.getSessions().map {sessionReports ->
 | 
			
		||||
            sessionReports
 | 
			
		||||
                .map { sessionReport ->  sessionToFeedEntry(sessionReport) }
 | 
			
		||||
                .groupBy { it.taskId }
 | 
			
		||||
                .map { fuseFeedEntries(it.component2()) }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun fuseFeedEntries(entries: List<FeedEntry>): FeedEntry =
 | 
			
		||||
        entries.fold(entries[0]) { accEntry, newEntry ->
 | 
			
		||||
            val newStudyTime = accEntry.totalStudyTime + newEntry.totalStudyTime
 | 
			
		||||
            accEntry.copy(totalStudyTime = newStudyTime)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private suspend fun sessionToFeedEntry(sessionReport: SessionReport): FeedEntry {
 | 
			
		||||
        val subjectId: String = sessionReport.subjectId
 | 
			
		||||
        val taskId: String = sessionReport.taskId
 | 
			
		||||
 | 
			
		||||
        val task: Task = taskDAO.getTask(subjectId, taskId)
 | 
			
		||||
        val subject: Subject = subjectDAO.getSubject(subjectId)!!
 | 
			
		||||
 | 
			
		||||
        return FeedEntry(
 | 
			
		||||
            argb_color = subject.argb_color,
 | 
			
		||||
            subJectName = subject.name,
 | 
			
		||||
            taskName = task.name,
 | 
			
		||||
            taskId = task.id,
 | 
			
		||||
            subjectId = subject.id,
 | 
			
		||||
            totalStudyTime = sessionReport.studyTime
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in a new issue