Coverage Summary for Class: ClickTrackRepository (com.vsevolodganin.clicktrack.storage)
Class |
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
ClickTrackRepository |
0%
(0/14)
|
0%
(0/4)
|
0%
(0/39)
|
0%
(0/194)
|
ClickTrackRepository$getAll$$inlined$map$1 |
0%
(0/2)
|
|
ClickTrackRepository$getAll$$inlined$map$1$2 |
0%
(0/1)
|
|
ClickTrackRepository$getAll$$inlined$map$1$2$1 |
|
ClickTrackRepository$getAll$lambda$2$$inlined$sortedBy$1 |
0%
(0/1)
|
|
ClickTrackRepository$getById$$inlined$map$1 |
0%
(0/2)
|
|
ClickTrackRepository$getById$$inlined$map$1$2 |
0%
(0/1)
|
|
ClickTrackRepository$getById$$inlined$map$1$2$1 |
|
Total |
0%
(0/21)
|
0%
(0/4)
|
0%
(0/39)
|
0%
(0/194)
|
package com.vsevolodganin.clicktrack.storage
import app.cash.sqldelight.coroutines.asFlow
import app.cash.sqldelight.coroutines.mapToList
import app.cash.sqldelight.coroutines.mapToOneOrNull
import com.vsevolodganin.clicktrack.Database
import com.vsevolodganin.clicktrack.di.component.ApplicationScope
import com.vsevolodganin.clicktrack.migration.CanMigrate
import com.vsevolodganin.clicktrack.model.ClickTrack
import com.vsevolodganin.clicktrack.model.ClickTrackId
import com.vsevolodganin.clicktrack.model.ClickTrackWithDatabaseId
import com.vsevolodganin.clicktrack.premade.PreMadeClickTracks
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.IO
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import me.tatarka.inject.annotations.Inject
import com.vsevolodganin.clicktrack.storage.ClickTrack as StorageClickTrack
@ApplicationScope
@Inject
class ClickTrackRepository(
private val database: Database,
private val json: Json,
) : CanMigrate {
override fun migrate(fromVersion: Int, toVersion: Int) {
if (fromVersion == UserPreferencesRepository.Const.NO_APP_VERSION_CODE) {
for (clickTrack in PreMadeClickTracks.DATA) {
insert(clickTrack)
}
}
}
fun getAll(): Flow<List<ClickTrackWithDatabaseId>> {
return database.sqlClickTrackQueries.getAll().asFlow()
.mapToList(Dispatchers.IO)
.map { listOfCLickTracks ->
listOfCLickTracks
.sortedBy { it.ordinal }
.map { it.toCommon() }
}
}
fun getAllNames(): List<String> {
return database.sqlClickTrackQueries.getAllNames().executeAsList()
}
fun getById(id: ClickTrackId.Database): Flow<ClickTrackWithDatabaseId?> {
return database.sqlClickTrackQueries.getById(id.value).asFlow()
.mapToOneOrNull(Dispatchers.IO)
.map { it?.toCommon() }
}
fun insert(clickTrack: ClickTrack): ClickTrackId.Database {
return database.sqlClickTrackQueries.run {
transactionWithResult {
val count = getCount().executeAsOne()
insert(
name = clickTrack.name,
serializedValue = json.encodeToString(clickTrack),
ordinal = count,
)
lastRowId().executeAsOne()
}
}.let(ClickTrackId::Database)
}
fun update(id: ClickTrackId.Database, clickTrack: ClickTrack) {
database.sqlClickTrackQueries.update(
id = id.value,
name = clickTrack.name,
serializedValue = clickTrack.serializeToString(),
)
}
fun updateOrdering(ordering: List<ClickTrackId.Database>) {
database.sqlClickTrackQueries.apply {
transaction {
ordering.forEachIndexed { index, id ->
updateOrdering(index.toLong(), id.value)
}
}
}
}
fun remove(id: ClickTrackId.Database) {
database.sqlClickTrackQueries.removeById(id.value)
}
private fun StorageClickTrack.toCommon(): ClickTrackWithDatabaseId {
return ClickTrackWithDatabaseId(
id = ClickTrackId.Database(id),
value = serializedValue.deserializeToClickTrack(),
)
}
private fun ClickTrack.serializeToString(): String = json.encodeToString(this)
private fun String.deserializeToClickTrack(): ClickTrack = json.decodeFromString(this)
}