Coverage Summary for Class: ClickSoundsRepository (com.vsevolodganin.clicktrack.storage)

Class Method, % Branch, % Line, % Instruction, %
ClickSoundsRepository 0% (0/12) 0% (0/4) 0% (0/25) 2.4% (4/167)
ClickSoundsRepository$getAll$$inlined$map$1 0% (0/2)
ClickSoundsRepository$getAll$$inlined$map$1$2 0% (0/1)
ClickSoundsRepository$getAll$$inlined$map$1$2$1
ClickSoundsRepository$getById$$inlined$map$1 0% (0/2)
ClickSoundsRepository$getById$$inlined$map$1$2 0% (0/1)
ClickSoundsRepository$getById$$inlined$map$1$2$1
ClickSoundsRepository$WhenMappings
Total 0% (0/18) 0% (0/4) 0% (0/25) 2.4% (4/167)


 package com.vsevolodganin.clicktrack.storage
 
 import app.cash.sqldelight.coroutines.asFlow
 import com.vsevolodganin.clicktrack.Database
 import com.vsevolodganin.clicktrack.di.component.ApplicationScope
 import com.vsevolodganin.clicktrack.model.ClickSoundSource
 import com.vsevolodganin.clicktrack.model.ClickSoundType
 import com.vsevolodganin.clicktrack.model.ClickSoundsId
 import com.vsevolodganin.clicktrack.model.UriClickSounds
 import com.vsevolodganin.clicktrack.model.UserClickSounds
 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.ClickSounds as StorageClickSounds
 
 @ApplicationScope
 @Inject
 class ClickSoundsRepository(
     private val database: Database,
     private val json: Json,
 ) {
     fun getAll(): Flow<List<UserClickSounds>> {
         return database.sqlClickSoundsQueries.getAll().asFlow()
             .map { it.executeAsList().map { elem -> elem.toCommon() } }
     }
 
     fun getById(id: ClickSoundsId.Database): Flow<UserClickSounds?> {
         return database.sqlClickSoundsQueries.getById(id.value).asFlow()
             .map { it.executeAsOneOrNull()?.toCommon() }
     }
 
     fun insert(clickSounds: UriClickSounds) {
         database.sqlClickSoundsQueries.insert(
             serializedValue = json.encodeToString(clickSounds),
         )
     }
 
     fun update(id: ClickSoundsId.Database, clickSounds: UriClickSounds) {
         database.sqlClickSoundsQueries.update(
             id = id.value,
             serializedValue = clickSounds.serializeToString(),
         )
     }
 
     fun update(id: ClickSoundsId.Database, type: ClickSoundType, source: ClickSoundSource.Uri) {
         database.sqlClickSoundsQueries.transaction {
             val current = database.sqlClickSoundsQueries.getById(id.value).executeAsOneOrNull()?.toCommon() ?: return@transaction
             val updated = when (type) {
                 ClickSoundType.STRONG -> current.copy(value = current.value.copy(strongBeat = source))
                 ClickSoundType.WEAK -> current.copy(value = current.value.copy(weakBeat = source))
             }
             update(updated)
         }
     }
 
     fun update(data: UserClickSounds) = update(data.id, data.value)
 
     fun remove(id: ClickSoundsId.Database) {
         database.sqlClickSoundsQueries.removeById(id.value)
     }
 
     private fun StorageClickSounds.toCommon() = UserClickSounds(
         id = ClickSoundsId.Database(id),
         value = serializedValue.deserializeToClickSounds(),
     )
 
     private fun UriClickSounds.serializeToString(): String = json.encodeToString(this)
 
     private fun String.deserializeToClickSounds(): UriClickSounds = json.decodeFromString(this)
 }