Navigation refactor

This commit is contained in:
2025-08-11 15:20:30 +03:00
parent 585ae0eb5f
commit a69c5d95ae
25 changed files with 784 additions and 580 deletions

View File

@@ -7,6 +7,7 @@ import androidx.room.*
import com.homebox.lens.data.db.entity.ItemEntity
import com.homebox.lens.data.db.entity.ItemLabelCrossRef
import com.homebox.lens.data.db.entity.ItemWithLabels
import kotlinx.coroutines.flow.Flow
// [CONTRACT]
/**
@@ -16,6 +17,10 @@ import com.homebox.lens.data.db.entity.ItemWithLabels
@Dao
interface ItemDao {
@Transaction
@Query("SELECT * FROM items ORDER BY createdAt DESC LIMIT :limit")
fun getRecentlyAddedItems(limit: Int): Flow<List<ItemWithLabels>>
@Transaction
@Query("SELECT * FROM items")
suspend fun getItems(): List<ItemWithLabels>

View File

@@ -0,0 +1,53 @@
// [PACKAGE] com.homebox.lens.data.db.entity
// [FILE] Mapper.kt
package com.homebox.lens.data.db.entity
import com.homebox.lens.domain.model.Image
import com.homebox.lens.domain.model.ItemSummary
import com.homebox.lens.domain.model.LabelOut
import com.homebox.lens.domain.model.LocationOut
/**
* [CONTRACT]
* Преобразует [ItemWithLabels] (сущность БД) в [ItemSummary] (доменную модель).
*
* [COHERENCE_NOTE] Так как сущности БД содержат только подмножество полей доменной модели,
* недостающие поля заполняются значениями по умолчанию (false, 0.0, пустые строки) или null.
* Это компромисс для обеспечения компиляции и базовой функциональности.
*/
fun ItemWithLabels.toDomain(): ItemSummary {
return ItemSummary(
id = this.item.id,
name = this.item.name,
// Предполагаем, что `image` в БД - это URL. Создаем объект Image или null.
image = this.item.image?.let { Image(id = "", path = it, isPrimary = true) },
// `location` в ItemEntity - это только ID. Создаем базовый LocationOut.
location = this.item.locationId?.let { LocationOut(id = it, name = "", color = "", isArchived = false, createdAt = "", updatedAt = "") },
labels = this.labels.map { it.toDomain() },
// Заполняем недостающие поля значениями по умолчанию.
assetId = null,
isArchived = false,
value = this.item.value?.toDouble() ?: 0.0,
createdAt = this.item.createdAt ?: "",
updatedAt = ""
)
}
/**
* [CONTRACT]
* Преобразует [LabelEntity] (сущность БД) в [LabelOut] (доменную модель).
*
* [COHERENCE_NOTE] Заполняет недостающие поля значениями по умолчанию.
*/
fun LabelEntity.toDomain(): LabelOut {
return LabelOut(
id = this.id,
name = this.name,
// Заполняем недостающие поля значениями по умолчанию.
color = "#CCCCCC", // Серый цвет по умолчанию
isArchived = false,
createdAt = "",
updatedAt = ""
)
}

View File

@@ -8,8 +8,12 @@ package com.homebox.lens.data.repository
import com.homebox.lens.data.api.HomeboxApiService
import com.homebox.lens.data.api.dto.toDomain
import com.homebox.lens.data.api.dto.toDto
import com.homebox.lens.data.db.dao.ItemDao
import com.homebox.lens.data.db.entity.toDomain
import com.homebox.lens.domain.model.*
import com.homebox.lens.domain.repository.ItemRepository
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import javax.inject.Inject
import javax.inject.Singleton
@@ -18,12 +22,14 @@ import javax.inject.Singleton
* [CONTRACT]
* Реализация репозитория для работы с данными о вещах.
* @param apiService Сервис для взаимодействия с Homebox API.
* @param itemDao DAO для доступа к локальной базе данных.
* [COHERENCE_NOTE] Метод 'login' был полностью удален из этого класса, так как его ответственность
* была передана в AuthRepositoryImpl. Это устраняет ошибку компиляции "'login' overrides nothing".
*/
@Singleton
class ItemRepositoryImpl @Inject constructor(
private val apiService: HomeboxApiService,
private val itemDao: ItemDao
) : ItemRepository {
// [DELETED] Метод login был здесь, но теперь он удален.
@@ -100,5 +106,14 @@ class ItemRepositoryImpl @Inject constructor(
val resultDto = apiService.getItems(query = query)
return resultDto.toDomain { it.toDomain() }
}
/**
* [CONTRACT] @see ItemRepository.getRecentlyAddedItems
*/
override fun getRecentlyAddedItems(limit: Int): Flow<List<ItemSummary>> {
return itemDao.getRecentlyAddedItems(limit).map { entities ->
entities.map { it.toDomain() }
}
}
}
// [END_FILE_ItemRepositoryImpl.kt]