Coverage Summary for Class: WorkspaceRepositoryImpl (com.georgeci.moneysurfer.data.repository)

Class Method, % Branch, % Line, % Instruction, %
WorkspaceRepositoryImpl 80% (8/10) 50% (3/6) 86.7% (39/45) 83.2% (238/286)
WorkspaceRepositoryImpl$delete$1
WorkspaceRepositoryImpl$getAll$$inlined$map$1 0% (0/2)
WorkspaceRepositoryImpl$getAll$$inlined$map$1$1
WorkspaceRepositoryImpl$getAll$$inlined$map$1$2 0% (0/1)
WorkspaceRepositoryImpl$getAll$$inlined$map$1$2$1
WorkspaceRepositoryImpl$getById$1
WorkspaceRepositoryImpl$getByUserId-SyNjzC0$$inlined$map$1 0% (0/2)
WorkspaceRepositoryImpl$getByUserId-SyNjzC0$$inlined$map$1$1
WorkspaceRepositoryImpl$getByUserId-SyNjzC0$$inlined$map$1$2 0% (0/1)
WorkspaceRepositoryImpl$getByUserId-SyNjzC0$$inlined$map$1$2$1
WorkspaceRepositoryImpl$insert$1
WorkspaceRepositoryImpl$update$1
Total 50% (8/16) 50% (3/6) 86.7% (39/45) 83.2% (238/286)


 package com.georgeci.moneysurfer.data.repository
 
 import com.georgeci.moneysurfer.data.db.dao.WorkspaceDao
 import com.georgeci.moneysurfer.data.db.entity.WorkspaceEntity
 import com.georgeci.moneysurfer.domain.model.Workspace
 import com.georgeci.moneysurfer.domain.primitives.ClockUseCase
 import com.georgeci.moneysurfer.domain.primitives.CurrencyCode
 import com.georgeci.moneysurfer.domain.primitives.UserId
 import com.georgeci.moneysurfer.domain.primitives.WorkspaceId
 import com.georgeci.moneysurfer.domain.repositories.WorkspaceRepository
 import com.georgeci.moneysurfer.domain.sync.SyncEntityTypes
 import com.georgeci.moneysurfer.sync.repository.MutationOperation
 import com.georgeci.moneysurfer.sync.repository.OutboxEnqueuer
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.map
 import org.koin.core.annotation.Single
 
 @Single(binds = [WorkspaceRepository::class])
 class WorkspaceRepositoryImpl(
     private val dao: WorkspaceDao,
     private val outboxEnqueuer: OutboxEnqueuer,
     private val clock: ClockUseCase,
     private val timeFormatter: TimeFormatter,
 ) : WorkspaceRepository {
 
     override fun getAll(): Flow<List<Workspace>> =
         dao.getAll().map { list -> list.map { it.toDomain() } }
 
     override fun getByUserId(userId: UserId): Flow<List<Workspace>> =
         dao.getByUserId(userId.value).map { list -> list.map { it.toDomain() } }
 
     override suspend fun getById(id: WorkspaceId): Workspace? =
         dao.getById(id.value)?.toDomain()
 
     override suspend fun insert(workspace: Workspace) {
         val entity = workspace.toEntity()
         dao.insert(entity)
         enqueueUpsert(entity, MutationOperation.INSERT)
     }
 
     override suspend fun update(workspace: Workspace) {
         val existingCreatedAt = dao.getById(workspace.id.value)?.createdAt
         val entity = workspace.toEntity().copy(
             createdAt = existingCreatedAt ?: workspace.toEntity().createdAt,
             updatedAt = clock.now().toEpochMilliseconds(),
         )
         dao.update(entity)
         enqueueUpsert(entity, MutationOperation.UPDATE)
     }
 
     override suspend fun delete(id: WorkspaceId) {
         dao.delete(id.value)
         outboxEnqueuer.enqueueDelete(
             entityType = SyncEntityTypes.WORKSPACE,
             entityId = id.value,
             scopeKey = id.value,
         )
     }
 
     private suspend fun enqueueUpsert(entity: WorkspaceEntity, operation: MutationOperation) {
         outboxEnqueuer.enqueueUpsert(
             entityType = SyncEntityTypes.WORKSPACE,
             entityId = entity.id,
             scopeKey = entity.id,
             operation = operation,
         )
     }
 
     private fun WorkspaceEntity.toDomain() = Workspace(
         id = WorkspaceId(id),
         name = name,
         description = description,
         baseCurrency = CurrencyCode(baseCurrency),
         ownerId = UserId(ownerId),
         createdAt = timeFormatter.parseInstant(createdAt),
         updatedAt = timeFormatter.parseInstant(updatedAt),
         archived = archived,
     )
 
     private fun Workspace.toEntity() = WorkspaceEntity(
         id = id.value,
         name = name,
         description = description,
         baseCurrency = baseCurrency.value,
         ownerId = ownerId.value,
         createdAt = timeFormatter.formatInstant(createdAt),
         archived = archived,
         updatedAt = timeFormatter.formatInstant(updatedAt),
     )
 }