#40 DAO to fetch the timers from the database. User timers only or combined (user + default)
This commit is contained in:
parent
2a546146a3
commit
ce57425957
2 changed files with 75 additions and 1 deletions
|
@ -1,4 +1,19 @@
|
||||||
package be.ugent.sel.studeez.domain
|
package be.ugent.sel.studeez.domain
|
||||||
|
|
||||||
|
import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo
|
||||||
|
import be.ugent.sel.studeez.data.local.models.timer_info.TimerJson
|
||||||
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
|
||||||
interface TimerDAO {
|
interface TimerDAO {
|
||||||
|
|
||||||
|
fun getUserTimers(): Flow<List<TimerInfo>>
|
||||||
|
|
||||||
|
fun getAllTimers(): Flow<List<TimerInfo>>
|
||||||
|
|
||||||
|
fun saveTimer(newTimer: TimerInfo)
|
||||||
|
|
||||||
|
fun updateTimer(timerInfo: TimerInfo)
|
||||||
|
|
||||||
|
fun deleteTimer(timerInfo: TimerInfo)
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,4 +1,63 @@
|
||||||
package be.ugent.sel.studeez.domain.implementation
|
package be.ugent.sel.studeez.domain.implementation
|
||||||
|
|
||||||
class FirebaseTimerDAO {
|
import be.ugent.sel.studeez.data.local.models.timer_info.*
|
||||||
|
import be.ugent.sel.studeez.data.local.models.timer_info.TimerType.*
|
||||||
|
import be.ugent.sel.studeez.domain.AccountDAO
|
||||||
|
import be.ugent.sel.studeez.domain.TimerDAO
|
||||||
|
import com.google.firebase.firestore.CollectionReference
|
||||||
|
import com.google.firebase.firestore.DocumentSnapshot
|
||||||
|
import com.google.firebase.firestore.FirebaseFirestore
|
||||||
|
import com.google.firebase.firestore.ktx.snapshots
|
||||||
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
import kotlinx.coroutines.flow.combine
|
||||||
|
import kotlinx.coroutines.flow.flowOf
|
||||||
|
import kotlinx.coroutines.flow.map
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class FirebaseTimerDAO @Inject constructor(
|
||||||
|
private val firestore: FirebaseFirestore,
|
||||||
|
private val configurationService: FirebaseConfigurationService,
|
||||||
|
private val auth: AccountDAO
|
||||||
|
) : TimerDAO {
|
||||||
|
|
||||||
|
override fun getUserTimers(): Flow<List<TimerInfo>> {
|
||||||
|
return currentUserTimersCollection()
|
||||||
|
.snapshots()
|
||||||
|
.map { it.toObjects(TimerJson::class.java) }
|
||||||
|
.map { ToTimerConverter().convertToTimerInfoList(it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getAllTimers(): Flow<List<TimerInfo>> {
|
||||||
|
// Wrap default timers in een flow en combineer met de userTimer flow.
|
||||||
|
val defaultTimers: List<TimerInfo> = configurationService.getDefaultTimers()
|
||||||
|
val defaultTimersFlow: Flow<List<TimerInfo>> = flowOf(defaultTimers)
|
||||||
|
val userTimersFlow: Flow<List<TimerInfo>> = getUserTimers()
|
||||||
|
return defaultTimersFlow.combine(userTimersFlow) { defaultTimersList, userTimersList ->
|
||||||
|
defaultTimersList + userTimersList
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun saveTimer(newTimer: TimerInfo) {
|
||||||
|
currentUserTimersCollection().add(newTimer.asJson())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun updateTimer(timerInfo: TimerInfo) {
|
||||||
|
currentUserTimersCollection().document(timerInfo.id).set(timerInfo.asJson())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deleteTimer(timerInfo: TimerInfo) {
|
||||||
|
currentUserTimersCollection().document(timerInfo.id).delete()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun currentUserTimersCollection(): CollectionReference =
|
||||||
|
firestore.collection(USER_COLLECTION)
|
||||||
|
.document(auth.currentUserId)
|
||||||
|
.collection(TIMER_COLLECTION)
|
||||||
|
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val TIMER_COLLECTION = "timers"
|
||||||
|
private const val USER_COLLECTION = "users"
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
Reference in a new issue