refactor DAO's
This commit is contained in:
		
							parent
							
								
									8a395fbd4e
								
							
						
					
					
						commit
						a60422e004
					
				
					 4 changed files with 52 additions and 46 deletions
				
			
		| 
						 | 
				
			
			@ -12,5 +12,10 @@ interface SubjectDAO {
 | 
			
		|||
    fun deleteSubject(oldSubject: Subject)
 | 
			
		||||
 | 
			
		||||
    fun updateSubject(newSubject: Subject)
 | 
			
		||||
 | 
			
		||||
    suspend fun getTaskCount(subject: Subject): Int
 | 
			
		||||
    suspend fun getCompletedTaskCount(subject: Subject): Int
 | 
			
		||||
    fun getStudyTime(subject: Subject): Flow<Int>
 | 
			
		||||
 | 
			
		||||
    suspend fun getSubject(subjectId: String): Subject?
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -14,11 +14,5 @@ interface TaskDAO {
 | 
			
		|||
 | 
			
		||||
    fun deleteTask(oldTask: Task)
 | 
			
		||||
 | 
			
		||||
    fun toggleTaskCompleted(task: Task, completed: Boolean)
 | 
			
		||||
 | 
			
		||||
    suspend fun getTask(subjectId: String, taskId: String): Task
 | 
			
		||||
 | 
			
		||||
    suspend fun getTaskCount(subject: Subject): Int
 | 
			
		||||
 | 
			
		||||
    suspend fun getCompletedTaskCount(subject: Subject): Int
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -4,6 +4,7 @@ import be.ugent.sel.studeez.data.local.models.task.Subject
 | 
			
		|||
import be.ugent.sel.studeez.domain.AccountDAO
 | 
			
		||||
import be.ugent.sel.studeez.domain.SubjectDAO
 | 
			
		||||
import be.ugent.sel.studeez.domain.TaskDAO
 | 
			
		||||
import com.google.firebase.firestore.AggregateSource
 | 
			
		||||
import com.google.firebase.firestore.CollectionReference
 | 
			
		||||
import com.google.firebase.firestore.FirebaseFirestore
 | 
			
		||||
import com.google.firebase.firestore.ktx.snapshots
 | 
			
		||||
| 
						 | 
				
			
			@ -24,8 +25,8 @@ class FireBaseSubjectDAO @Inject constructor(
 | 
			
		|||
            .map { it.toObjects(Subject::class.java) }
 | 
			
		||||
            .map { subjects ->
 | 
			
		||||
                subjects.map { subject ->
 | 
			
		||||
                    subject.taskCount = taskDAO.getTaskCount(subject)
 | 
			
		||||
                    subject.taskCompletedCount = taskDAO.getCompletedTaskCount(subject)
 | 
			
		||||
                    subject.taskCount = getTaskCount(subject)
 | 
			
		||||
                    subject.taskCompletedCount = getCompletedTaskCount(subject)
 | 
			
		||||
                    subject
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -47,8 +48,39 @@ class FireBaseSubjectDAO @Inject constructor(
 | 
			
		|||
        currentUserSubjectsCollection().document(newSubject.id).set(newSubject)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override suspend fun getTaskCount(subject: Subject): Int {
 | 
			
		||||
        return subjectTasksCollection(subject)
 | 
			
		||||
            .nonArchived()
 | 
			
		||||
            .count()
 | 
			
		||||
            .get(AggregateSource.SERVER)
 | 
			
		||||
            .await()
 | 
			
		||||
            .count.toInt()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override suspend fun getCompletedTaskCount(subject: Subject): Int {
 | 
			
		||||
        return subjectTasksCollection(subject)
 | 
			
		||||
            .nonArchived()
 | 
			
		||||
            .completed()
 | 
			
		||||
            .count()
 | 
			
		||||
            .get(AggregateSource.SERVER)
 | 
			
		||||
            .await()
 | 
			
		||||
            .count.toInt()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun getStudyTime(subject: Subject): Flow<Int> {
 | 
			
		||||
        return taskDAO.getTasks(subject)
 | 
			
		||||
            .map { tasks -> tasks.sumOf { it.time } }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun currentUserSubjectsCollection(): CollectionReference =
 | 
			
		||||
        firestore.collection(FireBaseCollections.USER_COLLECTION)
 | 
			
		||||
            .document(auth.currentUserId)
 | 
			
		||||
            .collection(FireBaseCollections.SUBJECT_COLLECTION)
 | 
			
		||||
 | 
			
		||||
    private fun subjectTasksCollection(subject: Subject): CollectionReference =
 | 
			
		||||
        firestore.collection(FireBaseCollections.USER_COLLECTION)
 | 
			
		||||
            .document(auth.currentUserId)
 | 
			
		||||
            .collection(FireBaseCollections.SUBJECT_COLLECTION)
 | 
			
		||||
            .document(subject.id)
 | 
			
		||||
            .collection(FireBaseCollections.TASK_COLLECTION)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -5,7 +5,6 @@ import be.ugent.sel.studeez.data.local.models.task.Task
 | 
			
		|||
import be.ugent.sel.studeez.data.local.models.task.TaskDocument
 | 
			
		||||
import be.ugent.sel.studeez.domain.AccountDAO
 | 
			
		||||
import be.ugent.sel.studeez.domain.TaskDAO
 | 
			
		||||
import com.google.firebase.firestore.AggregateSource
 | 
			
		||||
import com.google.firebase.firestore.CollectionReference
 | 
			
		||||
import com.google.firebase.firestore.FirebaseFirestore
 | 
			
		||||
import com.google.firebase.firestore.Query
 | 
			
		||||
| 
						 | 
				
			
			@ -31,44 +30,20 @@ class FireBaseTaskDAO @Inject constructor(
 | 
			
		|||
        return selectedSubjectTasksCollection(subjectId).document(taskId).get().await().toObject()!!
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override suspend fun getTaskCount(subject: Subject): Int {
 | 
			
		||||
        return selectedSubjectTasksCollection(subject.id)
 | 
			
		||||
            .nonArchived()
 | 
			
		||||
            .count()
 | 
			
		||||
            .get(AggregateSource.SERVER)
 | 
			
		||||
            .await()
 | 
			
		||||
            .count.toInt()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override suspend fun getCompletedTaskCount(subject: Subject): Int {
 | 
			
		||||
        return selectedSubjectTasksCollection(subject.id)
 | 
			
		||||
            .completed()
 | 
			
		||||
            .nonArchived()
 | 
			
		||||
            .count()
 | 
			
		||||
            .get(AggregateSource.SERVER)
 | 
			
		||||
            .await()
 | 
			
		||||
            .count.toInt()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun saveTask(newTask: Task) {
 | 
			
		||||
        selectedSubjectTasksCollection(newTask.subjectId).add(newTask)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun updateTask(newTask: Task) {
 | 
			
		||||
        selectedSubjectTasksCollection(newTask.subjectId).document(newTask.id).set(newTask)
 | 
			
		||||
        selectedSubjectTasksCollection(newTask.subjectId)
 | 
			
		||||
            .document(newTask.id)
 | 
			
		||||
            .set(newTask)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun deleteTask(oldTask: Task) {
 | 
			
		||||
        selectedSubjectTasksCollection(oldTask.subjectId).document(oldTask.id).delete()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun toggleTaskCompleted(task: Task, completed: Boolean) {
 | 
			
		||||
        selectedSubjectTasksCollection(task.subjectId)
 | 
			
		||||
            .document(task.id)
 | 
			
		||||
//            .update(TaskDocument.completed, completed)
 | 
			
		||||
            .set(task.copy(completed = completed))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun selectedSubjectTasksCollection(subjectId: String): CollectionReference =
 | 
			
		||||
        firestore.collection(FireBaseCollections.USER_COLLECTION)
 | 
			
		||||
            .document(auth.currentUserId)
 | 
			
		||||
| 
						 | 
				
			
			@ -76,18 +51,18 @@ class FireBaseTaskDAO @Inject constructor(
 | 
			
		|||
            .document(subjectId)
 | 
			
		||||
            .collection(FireBaseCollections.TASK_COLLECTION)
 | 
			
		||||
 | 
			
		||||
    // Extend CollectionReference and Query with some filters
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    private fun CollectionReference.nonArchived(): Query =
 | 
			
		||||
        this.whereEqualTo(TaskDocument.archived, false)
 | 
			
		||||
// Extend CollectionReference and Query with some filters
 | 
			
		||||
 | 
			
		||||
    private fun Query.nonArchived(): Query =
 | 
			
		||||
        this.whereEqualTo(TaskDocument.archived, false)
 | 
			
		||||
fun CollectionReference.nonArchived(): Query =
 | 
			
		||||
    this.whereEqualTo(TaskDocument.archived, false)
 | 
			
		||||
 | 
			
		||||
    private fun CollectionReference.completed(): Query =
 | 
			
		||||
        this.whereEqualTo(TaskDocument.completed, true)
 | 
			
		||||
fun Query.nonArchived(): Query =
 | 
			
		||||
    this.whereEqualTo(TaskDocument.archived, false)
 | 
			
		||||
 | 
			
		||||
    private fun Query.completed(): Query =
 | 
			
		||||
        this.whereEqualTo(TaskDocument.completed, true)
 | 
			
		||||
fun CollectionReference.completed(): Query =
 | 
			
		||||
    this.whereEqualTo(TaskDocument.completed, true)
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
fun Query.completed(): Query =
 | 
			
		||||
    this.whereEqualTo(TaskDocument.completed, true)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Reference in a new issue