Navigation refactor
This commit is contained in:
@@ -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>
|
||||
|
||||
53
data/src/main/java/com/homebox/lens/data/db/entity/Mapper.kt
Normal file
53
data/src/main/java/com/homebox/lens/data/db/entity/Mapper.kt
Normal 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 = ""
|
||||
)
|
||||
}
|
||||
@@ -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]
|
||||
Reference in New Issue
Block a user