From 5b613f7cc837d78ddf600fc13acec15b90ceedb9 Mon Sep 17 00:00:00 2001 From: busya Date: Thu, 7 Aug 2025 17:37:06 +0300 Subject: [PATCH] FIRST SUCCESS RUN --- app/src/main/AndroidManifest.xml | 3 +- .../java/com/homebox/lens/di/AppModule.kt | 63 -------------- .../com/homebox/lens/navigation/NavGraph.kt | 2 +- .../com/homebox/lens/navigation/Screen.kt | 23 +++-- .../ui/screen/dashboard/DashboardScreen.kt | 12 ++- .../ui/screen/dashboard/DashboardUiState.kt | 46 ++++++++++ .../ui/screen/dashboard/DashboardViewModel.kt | 86 +++++++++---------- buildSrc/src/main/java/Dependencies.kt | 1 - data/build.gradle.kts | 8 +- .../lens/data/api/dto/CustomFieldDto.kt | 12 ++- .../lens/data/api/dto/GroupStatisticsDto.kt | 14 +-- .../com/homebox/lens/data/api/dto/ImageDto.kt | 12 ++- .../lens/data/api/dto/ItemAttachmentDto.kt | 18 ++-- .../lens/data/api/dto/ItemCreateDto.kt | 32 ++++--- .../homebox/lens/data/api/dto/ItemOutDto.kt | 50 ++++++----- .../lens/data/api/dto/ItemSummaryDto.kt | 26 +++--- .../lens/data/api/dto/ItemUpdateDto.kt | 34 ++++---- .../homebox/lens/data/api/dto/LabelOutDto.kt | 18 ++-- .../lens/data/api/dto/LocationOutCountDto.kt | 20 +++-- .../lens/data/api/dto/LocationOutDto.kt | 18 ++-- .../lens/data/api/dto/MaintenanceEntryDto.kt | 22 +++-- .../lens/data/api/dto/PaginationResultDto.kt | 14 +-- .../lens/data/db/entity/ItemLabelCrossRef.kt | 6 +- .../homebox/lens/data/di/RepositoryModule.kt | 13 +-- .../data/repository/ItemRepositoryImpl.kt | 4 +- .../homebox/lens/domain/model/CustomField.kt | 2 +- .../lens/domain/model/GroupStatistics.kt | 2 +- .../com/homebox/lens/domain/model/Image.kt | 2 +- .../lens/domain/model/ItemAttachment.kt | 2 +- .../homebox/lens/domain/model/ItemCreate.kt | 2 +- .../com/homebox/lens/domain/model/ItemOut.kt | 2 +- .../homebox/lens/domain/model/ItemSummary.kt | 2 +- .../homebox/lens/domain/model/ItemUpdate.kt | 2 +- .../com/homebox/lens/domain/model/LabelOut.kt | 2 +- .../homebox/lens/domain/model/LocationOut.kt | 2 +- .../lens/domain/model/LocationOutCount.kt | 2 +- .../lens/domain/model/MaintenanceEntry.kt | 2 +- .../lens/domain/model/PaginationResult.kt | 2 +- .../lens/domain/repository/ItemRepository.kt | 2 +- .../domain/usecase/GetAllLabelsUseCase.kt | 26 +++--- .../domain/usecase/GetAllLocationsUseCase.kt | 26 +++--- .../domain/usecase/GetStatisticsUseCase.kt | 26 +++--- gradle.properties | 17 +++- 43 files changed, 366 insertions(+), 314 deletions(-) delete mode 100644 app/src/main/java/com/homebox/lens/di/AppModule.kt create mode 100644 app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardUiState.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a2ca449..82e9bd7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,8 +1,9 @@ - + { // [UI-ACTION] Показываем сообщение об ошибке + val errorMessage = "Error: ${state.message}" Text( - text = "Error: ${state.message}", + text = errorMessage, modifier = Modifier.align(Alignment.Center) ) + Timber.w("[UI-STATE] Displaying Error: $errorMessage") } is DashboardUiState.Success -> { // [UI-ACTION] Отображаем основной контент + Timber.d("[UI-STATE] Displaying Success") DashboardContent(state) } } diff --git a/app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardUiState.kt b/app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardUiState.kt new file mode 100644 index 0000000..3c3a70d --- /dev/null +++ b/app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardUiState.kt @@ -0,0 +1,46 @@ +// [PACKAGE] com.homebox.lens.ui.screen.dashboard +// [FILE] app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardUiState.kt +// [SEMANTICS] ui, state, dashboard + +// [IMPORTS] +package com.homebox.lens.ui.screen.dashboard + +import com.homebox.lens.domain.model.GroupStatistics +import com.homebox.lens.domain.model.LabelOut +import com.homebox.lens.domain.model.LocationOutCount + +// [CORE-LOGIC] +// [ENTITY: SealedInterface('DashboardUiState')] +/** + * [CONTRACT] + * Определяет все возможные состояния для экрана "Дэшборд". + * @invariant В любой момент времени экран может находиться только в одном из этих состояний. + */ +sealed interface DashboardUiState { + /** + * [CONTRACT] + * Состояние успешной загрузки данных. + * @property statistics Статистика по инвентарю. + * @property locations Список локаций со счетчиками. + * @property labels Список всех меток. + */ + data class Success( + val statistics: GroupStatistics, + val locations: List, + val labels: List + ) : DashboardUiState + + /** + * [CONTRACT] + * Состояние ошибки во время загрузки данных. + * @property message Человекочитаемое сообщение об ошибке. + */ + data class Error(val message: String) : DashboardUiState + + /** + * [CONTRACT] + * Состояние, когда данные для экрана загружаются. + */ + data object Loading : DashboardUiState +} +// [END_FILE_DashboardUiState.kt] \ No newline at end of file diff --git a/app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardViewModel.kt b/app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardViewModel.kt index 67a7c4b..2baefde 100644 --- a/app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardViewModel.kt +++ b/app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardViewModel.kt @@ -1,31 +1,25 @@ // [PACKAGE] com.homebox.lens.ui.screen.dashboard -// [FILE] DashboardViewModel.kt -// [SEMANTICS] view_model, dashboard, state_management +// [FILE] app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardViewModel.kt +// [SEMANTICS] ui, viewmodel, dashboard, hilt // [IMPORTS] +package com.homebox.lens.ui.screen.dashboard + import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.homebox.lens.domain.model.GroupStatistics -import com.homebox.lens.domain.model.LabelOut -import com.homebox.lens.domain.model.LocationOutCount import com.homebox.lens.domain.usecase.GetAllLabelsUseCase import com.homebox.lens.domain.usecase.GetAllLocationsUseCase import com.homebox.lens.domain.usecase.GetStatisticsUseCase import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.async import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch +import timber.log.Timber // [FIX] Логирование происходит здесь import javax.inject.Inject // [CORE-LOGIC] -/** - * [CONTRACT] - * ViewModel для экрана "Дэшборд". - * @param getStatisticsUseCase Use case для получения статистики. - * @param getAllLocationsUseCase Use case для получения местоположений. - * @param getAllLabelsUseCase Use case для получения меток. - */ @HiltViewModel class DashboardViewModel @Inject constructor( private val getStatisticsUseCase: GetStatisticsUseCase, @@ -33,51 +27,51 @@ class DashboardViewModel @Inject constructor( private val getAllLabelsUseCase: GetAllLabelsUseCase ) : ViewModel() { - // [STATE] UI State private val _uiState = MutableStateFlow(DashboardUiState.Loading) val uiState: StateFlow = _uiState.asStateFlow() init { - // [ACTION] Загрузка всех данных при инициализации. loadDashboardData() } - /** - * [CONTRACT] - * Загружает все необходимые для экрана данные. - * @sideeffect Обновляет _uiState. - */ - fun loadDashboardData() { - viewModelScope.launch { - _uiState.value = DashboardUiState.Loading - try { - val statistics = getStatisticsUseCase() - val locations = getAllLocationsUseCase() - val labels = getAllLabelsUseCase() + private fun loadDashboardData() { + Timber.i("[ACTION] Starting dashboard data load.") + _uiState.value = DashboardUiState.Loading - _uiState.value = DashboardUiState.Success( - statistics = statistics, - locations = locations, - labels = labels - ) + viewModelScope.launch { + try { + // Параллельно запрашиваем все данные + val statsDeferred = async { getStatisticsUseCase() } + val locationsDeferred = async { getAllLocationsUseCase() } + val labelsDeferred = async { getAllLabelsUseCase() } + + val stats = statsDeferred.await() + val locations = locationsDeferred.await() + val labels = labelsDeferred.await() + + // [ACTION] Логируем результат здесь, во ViewModel + if (stats != null && locations != null && labels != null) { + _uiState.value = DashboardUiState.Success( + statistics = stats, + locations = locations, + labels = labels + ) + Timber.i("[COHERENCE_CHECK_PASSED] Dashboard data loaded successfully.") + } else { + // Одна из операций вернула null + val errorMessage = "Failed to load dashboard data: " + + "stats is ${if(stats==null) "null" else "ok"}, " + + "locations is ${if(locations==null) "null" else "ok"}, " + + "labels is ${if(labels==null) "null" else "ok"}" + Timber.e(errorMessage) + _uiState.value = DashboardUiState.Error("Could not load all dashboard data.") + } } catch (e: Exception) { - _uiState.value = DashboardUiState.Error(e.message ?: "Unknown error") + // [ERROR_HANDLER] Эта ошибка будет отловлена, если сама корутина `launch` упадет + Timber.e(e, "[ERROR] Critical failure in loadDashboardData coroutine.") + _uiState.value = DashboardUiState.Error(e.message ?: "An unknown critical error occurred") } } } } - -/** - * [CONTRACT] - * Запечатанный интерфейс для представления состояний UI дэшборда. - */ -sealed interface DashboardUiState { - data class Success( - val statistics: GroupStatistics, - val locations: List, - val labels: List - ) : DashboardUiState - data class Error(val message: String) : DashboardUiState - object Loading : DashboardUiState -} // [END_FILE_DashboardViewModel.kt] \ No newline at end of file diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 0997c84..11707b7 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -69,7 +69,6 @@ object Libs { // Networking (Retrofit, OkHttp, Moshi) const val retrofit = "com.squareup.retrofit2:retrofit:${Versions.retrofit}" const val converterMoshi = "com.squareup.retrofit2:converter-moshi:${Versions.retrofit}" - const val converterGson = "com.squareup.retrofit2:converter-gson:${Versions.retrofit}" const val okhttp = "com.squareup.okhttp3:okhttp:${Versions.okhttp}" const val okhttpLoggingInterceptor = "com.squareup.okhttp3:logging-interceptor:${Versions.okhttp}" const val moshi = "com.squareup.moshi:moshi:${Versions.moshi}" diff --git a/data/build.gradle.kts b/data/build.gradle.kts index 427a461..a7d3ce4 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -45,11 +45,13 @@ dependencies { // [DEPENDENCY] Coroutines implementation(Libs.coroutinesCore) - // [DEPENDENCY] Networking (Retrofit, Gson) + // [DEPENDENCY] Networking (Retrofit, Moshi) implementation(Libs.retrofit) - implementation(Libs.converterGson) + implementation(Libs.converterMoshi) implementation(Libs.okhttp) implementation(Libs.okhttpLoggingInterceptor) + implementation(Libs.moshiKotlin) + kapt(Libs.moshiCodegen) // [DEPENDENCY] Database (Room) implementation(Libs.roomRuntime) @@ -64,6 +66,8 @@ dependencies { testImplementation(Libs.junit) androidTestImplementation(Libs.extJunit) androidTestImplementation(Libs.espressoCore) + + } kapt { diff --git a/data/src/main/java/com/homebox/lens/data/api/dto/CustomFieldDto.kt b/data/src/main/java/com/homebox/lens/data/api/dto/CustomFieldDto.kt index 44bc4fd..036194a 100644 --- a/data/src/main/java/com/homebox/lens/data/api/dto/CustomFieldDto.kt +++ b/data/src/main/java/com/homebox/lens/data/api/dto/CustomFieldDto.kt @@ -2,8 +2,11 @@ // [FILE] CustomFieldDto.kt // [SEMANTICS] data_transfer_object, custom_field +package com.homebox.lens.data.api.dto + // [IMPORTS] -import com.google.gson.annotations.SerializedName +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass import com.homebox.lens.domain.model.CustomField // [CORE-LOGIC] @@ -11,10 +14,11 @@ import com.homebox.lens.domain.model.CustomField * [CONTRACT] * DTO для кастомного поля. */ +@JsonClass(generateAdapter = true) data class CustomFieldDto( - @SerializedName("name") val name: String, - @SerializedName("value") val value: String, - @SerializedName("type") val type: String + @Json(name = "name") val name: String, + @Json(name = "value") val value: String, + @Json(name = "type") val type: String ) /** diff --git a/data/src/main/java/com/homebox/lens/data/api/dto/GroupStatisticsDto.kt b/data/src/main/java/com/homebox/lens/data/api/dto/GroupStatisticsDto.kt index aa32a0e..cbc11c9 100644 --- a/data/src/main/java/com/homebox/lens/data/api/dto/GroupStatisticsDto.kt +++ b/data/src/main/java/com/homebox/lens/data/api/dto/GroupStatisticsDto.kt @@ -2,8 +2,11 @@ // [FILE] GroupStatisticsDto.kt // [SEMANTICS] data_transfer_object, statistics +package com.homebox.lens.data.api.dto + // [IMPORTS] -import com.google.gson.annotations.SerializedName +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass import com.homebox.lens.domain.model.GroupStatistics // [CORE-LOGIC] @@ -11,11 +14,12 @@ import com.homebox.lens.domain.model.GroupStatistics * [CONTRACT] * DTO для статистики. */ +@JsonClass(generateAdapter = true) data class GroupStatisticsDto( - @SerializedName("items") val items: Int, - @SerializedName("labels") val labels: Int, - @SerializedName("locations") val locations: Int, - @SerializedName("totalValue") val totalValue: Double + @Json(name = "items") val items: Int, + @Json(name = "labels") val labels: Int, + @Json(name = "locations") val locations: Int, + @Json(name = "totalValue") val totalValue: Double ) /** diff --git a/data/src/main/java/com/homebox/lens/data/api/dto/ImageDto.kt b/data/src/main/java/com/homebox/lens/data/api/dto/ImageDto.kt index 2de2cd3..d73dddd 100644 --- a/data/src/main/java/com/homebox/lens/data/api/dto/ImageDto.kt +++ b/data/src/main/java/com/homebox/lens/data/api/dto/ImageDto.kt @@ -2,8 +2,11 @@ // [FILE] ImageDto.kt // [SEMANTICS] data_transfer_object, image +package com.homebox.lens.data.api.dto + // [IMPORTS] -import com.google.gson.annotations.SerializedName +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass import com.homebox.lens.domain.model.Image // [CORE-LOGIC] @@ -14,10 +17,11 @@ import com.homebox.lens.domain.model.Image * @property path Путь к файлу. * @property isPrimary Является ли основным. */ +@JsonClass(generateAdapter = true) data class ImageDto( - @SerializedName("id") val id: String, - @SerializedName("path") val path: String, - @SerializedName("isPrimary") val isPrimary: Boolean + @Json(name = "id") val id: String, + @Json(name = "path") val path: String, + @Json(name = "isPrimary") val isPrimary: Boolean ) /** diff --git a/data/src/main/java/com/homebox/lens/data/api/dto/ItemAttachmentDto.kt b/data/src/main/java/com/homebox/lens/data/api/dto/ItemAttachmentDto.kt index f176991..0c73142 100644 --- a/data/src/main/java/com/homebox/lens/data/api/dto/ItemAttachmentDto.kt +++ b/data/src/main/java/com/homebox/lens/data/api/dto/ItemAttachmentDto.kt @@ -2,8 +2,11 @@ // [FILE] ItemAttachmentDto.kt // [SEMANTICS] data_transfer_object, attachment +package com.homebox.lens.data.api.dto + // [IMPORTS] -import com.google.gson.annotations.SerializedName +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass import com.homebox.lens.domain.model.ItemAttachment // [CORE-LOGIC] @@ -11,13 +14,14 @@ import com.homebox.lens.domain.model.ItemAttachment * [CONTRACT] * DTO для вложения. */ +@JsonClass(generateAdapter = true) data class ItemAttachmentDto( - @SerializedName("id") val id: String, - @SerializedName("name") val name: String, - @SerializedName("path") val path: String, - @SerializedName("type") val type: String, - @SerializedName("createdAt") val createdAt: String, - @SerializedName("updatedAt") val updatedAt: String + @Json(name = "id") val id: String, + @Json(name = "name") val name: String, + @Json(name = "path") val path: String, + @Json(name = "type") val type: String, + @Json(name = "createdAt") val createdAt: String, + @Json(name = "updatedAt") val updatedAt: String ) /** diff --git a/data/src/main/java/com/homebox/lens/data/api/dto/ItemCreateDto.kt b/data/src/main/java/com/homebox/lens/data/api/dto/ItemCreateDto.kt index 49c34ea..e39158d 100644 --- a/data/src/main/java/com/homebox/lens/data/api/dto/ItemCreateDto.kt +++ b/data/src/main/java/com/homebox/lens/data/api/dto/ItemCreateDto.kt @@ -2,8 +2,11 @@ // [FILE] ItemCreateDto.kt // [SEMANTICS] data_transfer_object, item_creation +package com.homebox.lens.data.api.dto + // [IMPORTS] -import com.google.gson.annotations.SerializedName +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass import com.homebox.lens.domain.model.ItemCreate // [CORE-LOGIC] @@ -11,20 +14,21 @@ import com.homebox.lens.domain.model.ItemCreate * [CONTRACT] * DTO для создания вещи. */ +@JsonClass(generateAdapter = true) data class ItemCreateDto( - @SerializedName("name") val name: String, - @SerializedName("assetId") val assetId: String?, - @SerializedName("description") val description: String?, - @SerializedName("notes") val notes: String?, - @SerializedName("serialNumber") val serialNumber: String?, - @SerializedName("quantity") val quantity: Int?, - @SerializedName("value") val value: Double?, - @SerializedName("purchasePrice") val purchasePrice: Double?, - @SerializedName("purchaseDate") val purchaseDate: String?, - @SerializedName("warrantyUntil") val warrantyUntil: String?, - @SerializedName("locationId") val locationId: String?, - @SerializedName("parentId") val parentId: String?, - @SerializedName("labelIds") val labelIds: List? + @Json(name = "name") val name: String, + @Json(name = "assetId") val assetId: String?, + @Json(name = "description") val description: String?, + @Json(name = "notes") val notes: String?, + @Json(name = "serialNumber") val serialNumber: String?, + @Json(name = "quantity") val quantity: Int?, + @Json(name = "value") val value: Double?, + @Json(name = "purchasePrice") val purchasePrice: Double?, + @Json(name = "purchaseDate") val purchaseDate: String?, + @Json(name = "warrantyUntil") val warrantyUntil: String?, + @Json(name = "locationId") val locationId: String?, + @Json(name = "parentId") val parentId: String?, + @Json(name = "labelIds") val labelIds: List? ) /** diff --git a/data/src/main/java/com/homebox/lens/data/api/dto/ItemOutDto.kt b/data/src/main/java/com/homebox/lens/data/api/dto/ItemOutDto.kt index e60db1e..bcae290 100644 --- a/data/src/main/java/com/homebox/lens/data/api/dto/ItemOutDto.kt +++ b/data/src/main/java/com/homebox/lens/data/api/dto/ItemOutDto.kt @@ -2,8 +2,11 @@ // [FILE] ItemOutDto.kt // [SEMANTICS] data_transfer_object, item_detailed +package com.homebox.lens.data.api.dto + // [IMPORTS] -import com.google.gson.annotations.SerializedName +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass import com.homebox.lens.domain.model.ItemOut // [CORE-LOGIC] @@ -11,29 +14,30 @@ import com.homebox.lens.domain.model.ItemOut * [CONTRACT] * DTO для полной модели вещи. */ +@JsonClass(generateAdapter = true) data class ItemOutDto( - @SerializedName("id") val id: String, - @SerializedName("name") val name: String, - @SerializedName("assetId") val assetId: String?, - @SerializedName("description") val description: String?, - @SerializedName("notes") val notes: String?, - @SerializedName("serialNumber") val serialNumber: String?, - @SerializedName("quantity") val quantity: Int, - @SerializedName("isArchived") val isArchived: Boolean, - @SerializedName("value") val value: Double, - @SerializedName("purchasePrice") val purchasePrice: Double?, - @SerializedName("purchaseDate") val purchaseDate: String?, - @SerializedName("warrantyUntil") val warrantyUntil: String?, - @SerializedName("location") val location: LocationOutDto?, - @SerializedName("parent") val parent: ItemSummaryDto?, - @SerializedName("children") val children: List, - @SerializedName("labels") val labels: List, - @SerializedName("attachments") val attachments: List, - @SerializedName("images") val images: List, - @SerializedName("fields") val fields: List, - @SerializedName("maintenance") val maintenance: List, - @SerializedName("createdAt") val createdAt: String, - @SerializedName("updatedAt") val updatedAt: String + @Json(name = "id") val id: String, + @Json(name = "name") val name: String, + @Json(name = "assetId") val assetId: String?, + @Json(name = "description") val description: String?, + @Json(name = "notes") val notes: String?, + @Json(name = "serialNumber") val serialNumber: String?, + @Json(name = "quantity") val quantity: Int, + @Json(name = "isArchived") val isArchived: Boolean, + @Json(name = "value") val value: Double, + @Json(name = "purchasePrice") val purchasePrice: Double?, + @Json(name = "purchaseDate") val purchaseDate: String?, + @Json(name = "warrantyUntil") val warrantyUntil: String?, + @Json(name = "location") val location: LocationOutDto?, + @Json(name = "parent") val parent: ItemSummaryDto?, + @Json(name = "children") val children: List, + @Json(name = "labels") val labels: List, + @Json(name = "attachments") val attachments: List, + @Json(name = "images") val images: List, + @Json(name = "fields") val fields: List, + @Json(name = "maintenance") val maintenance: List, + @Json(name = "createdAt") val createdAt: String, + @Json(name = "updatedAt") val updatedAt: String ) /** diff --git a/data/src/main/java/com/homebox/lens/data/api/dto/ItemSummaryDto.kt b/data/src/main/java/com/homebox/lens/data/api/dto/ItemSummaryDto.kt index 4bcf45b..8a1c190 100644 --- a/data/src/main/java/com/homebox/lens/data/api/dto/ItemSummaryDto.kt +++ b/data/src/main/java/com/homebox/lens/data/api/dto/ItemSummaryDto.kt @@ -2,8 +2,11 @@ // [FILE] ItemSummaryDto.kt // [SEMANTICS] data_transfer_object, item_summary +package com.homebox.lens.data.api.dto + // [IMPORTS] -import com.google.gson.annotations.SerializedName +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass import com.homebox.lens.domain.model.ItemSummary // [CORE-LOGIC] @@ -11,17 +14,18 @@ import com.homebox.lens.domain.model.ItemSummary * [CONTRACT] * DTO для сокращенной модели вещи. */ +@JsonClass(generateAdapter = true) data class ItemSummaryDto( - @SerializedName("id") val id: String, - @SerializedName("name") val name: String, - @SerializedName("assetId") val assetId: String?, - @SerializedName("image") val image: ImageDto?, - @SerializedName("isArchived") val isArchived: Boolean, - @SerializedName("labels") val labels: List, - @SerializedName("location") val location: LocationOutDto?, - @SerializedName("value") val value: Double, - @SerializedName("createdAt") val createdAt: String, - @SerializedName("updatedAt") val updatedAt: String + @Json(name = "id") val id: String, + @Json(name = "name") val name: String, + @Json(name = "assetId") val assetId: String?, + @Json(name = "image") val image: ImageDto?, + @Json(name = "isArchived") val isArchived: Boolean, + @Json(name = "labels") val labels: List, + @Json(name = "location") val location: LocationOutDto?, + @Json(name = "value") val value: Double, + @Json(name = "createdAt") val createdAt: String, + @Json(name = "updatedAt") val updatedAt: String ) /** diff --git a/data/src/main/java/com/homebox/lens/data/api/dto/ItemUpdateDto.kt b/data/src/main/java/com/homebox/lens/data/api/dto/ItemUpdateDto.kt index 86d44af..5b9d101 100644 --- a/data/src/main/java/com/homebox/lens/data/api/dto/ItemUpdateDto.kt +++ b/data/src/main/java/com/homebox/lens/data/api/dto/ItemUpdateDto.kt @@ -2,8 +2,11 @@ // [FILE] ItemUpdateDto.kt // [SEMANTICS] data_transfer_object, item_update +package com.homebox.lens.data.api.dto + // [IMPORTS] -import com.google.gson.annotations.SerializedName +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass import com.homebox.lens.domain.model.ItemUpdate // [CORE-LOGIC] @@ -11,21 +14,22 @@ import com.homebox.lens.domain.model.ItemUpdate * [CONTRACT] * DTO для обновления вещи. */ +@JsonClass(generateAdapter = true) data class ItemUpdateDto( - @SerializedName("name") val name: String?, - @SerializedName("assetId") val assetId: String?, - @SerializedName("description") val description: String?, - @SerializedName("notes") val notes: String?, - @SerializedName("serialNumber") val serialNumber: String?, - @SerializedName("quantity") val quantity: Int?, - @SerializedName("isArchived") val isArchived: Boolean?, - @SerializedName("value") val value: Double?, - @SerializedName("purchasePrice") val purchasePrice: Double?, - @SerializedName("purchaseDate") val purchaseDate: String?, - @SerializedName("warrantyUntil") val warrantyUntil: String?, - @SerializedName("locationId") val locationId: String?, - @SerializedName("parentId") val parentId: String?, - @SerializedName("labelIds") val labelIds: List? + @Json(name = "name") val name: String?, + @Json(name = "assetId") val assetId: String?, + @Json(name = "description") val description: String?, + @Json(name = "notes") val notes: String?, + @Json(name = "serialNumber") val serialNumber: String?, + @Json(name = "quantity") val quantity: Int?, + @Json(name = "isArchived") val isArchived: Boolean?, + @Json(name = "value") val value: Double?, + @Json(name = "purchasePrice") val purchasePrice: Double?, + @Json(name = "purchaseDate") val purchaseDate: String?, + @Json(name = "warrantyUntil") val warrantyUntil: String?, + @Json(name = "locationId") val locationId: String?, + @Json(name = "parentId") val parentId: String?, + @Json(name = "labelIds") val labelIds: List? ) /** diff --git a/data/src/main/java/com/homebox/lens/data/api/dto/LabelOutDto.kt b/data/src/main/java/com/homebox/lens/data/api/dto/LabelOutDto.kt index e7c4886..01ddc16 100644 --- a/data/src/main/java/com/homebox/lens/data/api/dto/LabelOutDto.kt +++ b/data/src/main/java/com/homebox/lens/data/api/dto/LabelOutDto.kt @@ -2,8 +2,11 @@ // [FILE] LabelOutDto.kt // [SEMANTICS] data_transfer_object, label +package com.homebox.lens.data.api.dto + // [IMPORTS] -import com.google.gson.annotations.SerializedName +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass import com.homebox.lens.domain.model.LabelOut // [CORE-LOGIC] @@ -11,13 +14,14 @@ import com.homebox.lens.domain.model.LabelOut * [CONTRACT] * DTO для метки. */ +@JsonClass(generateAdapter = true) data class LabelOutDto( - @SerializedName("id") val id: String, - @SerializedName("name") val name: String, - @SerializedName("color") val color: String, - @SerializedName("isArchived") val isArchived: Boolean, - @SerializedName("createdAt") val createdAt: String, - @SerializedName("updatedAt") val updatedAt: String + @Json(name = "id") val id: String, + @Json(name = "name") val name: String, + @Json(name = "color") val color: String, + @Json(name = "isArchived") val isArchived: Boolean, + @Json(name = "createdAt") val createdAt: String, + @Json(name = "updatedAt") val updatedAt: String ) /** diff --git a/data/src/main/java/com/homebox/lens/data/api/dto/LocationOutCountDto.kt b/data/src/main/java/com/homebox/lens/data/api/dto/LocationOutCountDto.kt index 5ce0b76..5138b67 100644 --- a/data/src/main/java/com/homebox/lens/data/api/dto/LocationOutCountDto.kt +++ b/data/src/main/java/com/homebox/lens/data/api/dto/LocationOutCountDto.kt @@ -2,8 +2,11 @@ // [FILE] LocationOutCountDto.kt // [SEMANTICS] data_transfer_object, location, count +package com.homebox.lens.data.api.dto + // [IMPORTS] -import com.google.gson.annotations.SerializedName +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass import com.homebox.lens.domain.model.LocationOutCount // [CORE-LOGIC] @@ -11,14 +14,15 @@ import com.homebox.lens.domain.model.LocationOutCount * [CONTRACT] * DTO для местоположения со счетчиком. */ +@JsonClass(generateAdapter = true) data class LocationOutCountDto( - @SerializedName("id") val id: String, - @SerializedName("name") val name: String, - @SerializedName("color") val color: String, - @SerializedName("isArchived") val isArchived: Boolean, - @SerializedName("itemCount") val itemCount: Int, - @SerializedName("createdAt") val createdAt: String, - @SerializedName("updatedAt") val updatedAt: String + @Json(name = "id") val id: String, + @Json(name = "name") val name: String, + @Json(name = "color") val color: String, + @Json(name = "isArchived") val isArchived: Boolean, + @Json(name = "itemCount") val itemCount: Int, + @Json(name = "createdAt") val createdAt: String, + @Json(name = "updatedAt") val updatedAt: String ) /** diff --git a/data/src/main/java/com/homebox/lens/data/api/dto/LocationOutDto.kt b/data/src/main/java/com/homebox/lens/data/api/dto/LocationOutDto.kt index 2ce5922..a092ee2 100644 --- a/data/src/main/java/com/homebox/lens/data/api/dto/LocationOutDto.kt +++ b/data/src/main/java/com/homebox/lens/data/api/dto/LocationOutDto.kt @@ -2,8 +2,11 @@ // [FILE] LocationOutDto.kt // [SEMANTICS] data_transfer_object, location +package com.homebox.lens.data.api.dto + // [IMPORTS] -import com.google.gson.annotations.SerializedName +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass import com.homebox.lens.domain.model.LocationOut // [CORE-LOGIC] @@ -11,13 +14,14 @@ import com.homebox.lens.domain.model.LocationOut * [CONTRACT] * DTO для местоположения. */ +@JsonClass(generateAdapter = true) data class LocationOutDto( - @SerializedName("id") val id: String, - @SerializedName("name") val name: String, - @SerializedName("color") val color: String, - @SerializedName("isArchived") val isArchived: Boolean, - @SerializedName("createdAt") val createdAt: String, - @SerializedName("updatedAt") val updatedAt: String + @Json(name = "id") val id: String, + @Json(name = "name") val name: String, + @Json(name = "color") val color: String, + @Json(name = "isArchived") val isArchived: Boolean, + @Json(name = "createdAt") val createdAt: String, + @Json(name = "updatedAt") val updatedAt: String ) /** diff --git a/data/src/main/java/com/homebox/lens/data/api/dto/MaintenanceEntryDto.kt b/data/src/main/java/com/homebox/lens/data/api/dto/MaintenanceEntryDto.kt index b948985..2b92794 100644 --- a/data/src/main/java/com/homebox/lens/data/api/dto/MaintenanceEntryDto.kt +++ b/data/src/main/java/com/homebox/lens/data/api/dto/MaintenanceEntryDto.kt @@ -2,8 +2,11 @@ // [FILE] MaintenanceEntryDto.kt // [SEMANTICS] data_transfer_object, maintenance +package com.homebox.lens.data.api.dto + // [IMPORTS] -import com.google.gson.annotations.SerializedName +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass import com.homebox.lens.domain.model.MaintenanceEntry // [CORE-LOGIC] @@ -11,15 +14,16 @@ import com.homebox.lens.domain.model.MaintenanceEntry * [CONTRACT] * DTO для записи об обслуживании. */ +@JsonClass(generateAdapter = true) data class MaintenanceEntryDto( - @SerializedName("id") val id: String, - @SerializedName("itemId") val itemId: String, - @SerializedName("title") val title: String, - @SerializedName("details") val details: String?, - @SerializedName("dueAt") val dueAt: String?, - @SerializedName("completedAt") val completedAt: String?, - @SerializedName("createdAt") val createdAt: String, - @SerializedName("updatedAt") val updatedAt: String + @Json(name = "id") val id: String, + @Json(name = "itemId") val itemId: String, + @Json(name = "title") val title: String, + @Json(name = "details") val details: String?, + @Json(name = "dueAt") val dueAt: String?, + @Json(name = "completedAt") val completedAt: String?, + @Json(name = "createdAt") val createdAt: String, + @Json(name = "updatedAt") val updatedAt: String ) /** diff --git a/data/src/main/java/com/homebox/lens/data/api/dto/PaginationResultDto.kt b/data/src/main/java/com/homebox/lens/data/api/dto/PaginationResultDto.kt index aedf37d..1da425a 100644 --- a/data/src/main/java/com/homebox/lens/data/api/dto/PaginationResultDto.kt +++ b/data/src/main/java/com/homebox/lens/data/api/dto/PaginationResultDto.kt @@ -2,8 +2,11 @@ // [FILE] PaginationResultDto.kt // [SEMANTICS] data_transfer_object, pagination +package com.homebox.lens.data.api.dto + // [IMPORTS] -import com.google.gson.annotations.SerializedName +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass import com.homebox.lens.domain.model.PaginationResult // [CORE-LOGIC] @@ -11,11 +14,12 @@ import com.homebox.lens.domain.model.PaginationResult * [CONTRACT] * DTO для постраничных результатов. */ +@JsonClass(generateAdapter = true) data class PaginationResultDto( - @SerializedName("items") val items: List, - @SerializedName("page") val page: Int, - @SerializedName("pageSize") val pageSize: Int, - @SerializedName("total") val total: Int + @Json(name = "items") val items: List, + @Json(name = "page") val page: Int, + @Json(name = "pageSize") val pageSize: Int, + @Json(name = "total") val total: Int ) /** diff --git a/data/src/main/java/com/homebox/lens/data/db/entity/ItemLabelCrossRef.kt b/data/src/main/java/com/homebox/lens/data/db/entity/ItemLabelCrossRef.kt index 819748e..141765d 100644 --- a/data/src/main/java/com/homebox/lens/data/db/entity/ItemLabelCrossRef.kt +++ b/data/src/main/java/com/homebox/lens/data/db/entity/ItemLabelCrossRef.kt @@ -4,13 +4,17 @@ package com.homebox.lens.data.db.entity import androidx.room.Entity +import androidx.room.Index // [CONTRACT] /** * [ENTITY: RoomEntity('ItemLabelCrossRef')] * [PURPOSE] Таблица для связи "многие-ко-многим" между ItemEntity и LabelEntity. */ -@Entity(primaryKeys = ["itemId", "labelId"]) +@Entity( + primaryKeys = ["itemId", "labelId"], + indices = [Index(value = ["labelId"])] +) data class ItemLabelCrossRef( val itemId: String, val labelId: String diff --git a/data/src/main/java/com/homebox/lens/data/di/RepositoryModule.kt b/data/src/main/java/com/homebox/lens/data/di/RepositoryModule.kt index 98e5c60..00d0d1a 100644 --- a/data/src/main/java/com/homebox/lens/data/di/RepositoryModule.kt +++ b/data/src/main/java/com/homebox/lens/data/di/RepositoryModule.kt @@ -3,10 +3,11 @@ package com.homebox.lens.data.di +import com.homebox.lens.data.api.HomeboxApiService import com.homebox.lens.data.repository.ItemRepositoryImpl import com.homebox.lens.domain.repository.ItemRepository -import dagger.Binds import dagger.Module +import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import javax.inject.Singleton @@ -18,14 +19,14 @@ import javax.inject.Singleton */ @Module @InstallIn(SingletonComponent::class) -abstract class RepositoryModule { +object RepositoryModule { // [PROVIDER] - @Binds + @Provides @Singleton - abstract fun bindItemRepository( - itemRepositoryImpl: ItemRepositoryImpl - ): ItemRepository + fun provideItemRepository(apiService: HomeboxApiService): ItemRepository { + return ItemRepositoryImpl(apiService) + } } // [END_FILE_RepositoryModule.kt] diff --git a/data/src/main/java/com/homebox/lens/data/repository/ItemRepositoryImpl.kt b/data/src/main/java/com/homebox/lens/data/repository/ItemRepositoryImpl.kt index 63d8f6b..c6f6656 100644 --- a/data/src/main/java/com/homebox/lens/data/repository/ItemRepositoryImpl.kt +++ b/data/src/main/java/com/homebox/lens/data/repository/ItemRepositoryImpl.kt @@ -1,7 +1,7 @@ // [PACKAGE] com.homebox.lens.data.repository // [FILE] ItemRepositoryImpl.kt // [SEMANTICS] data_repository, implementation, network - +package com.homebox.lens.data.repository // [IMPORTS] import com.homebox.lens.data.api.HomeboxApiService import com.homebox.lens.data.api.dto.toDomain @@ -9,6 +9,7 @@ import com.homebox.lens.data.api.dto.toDto import com.homebox.lens.domain.model.* import com.homebox.lens.domain.repository.ItemRepository import javax.inject.Inject +import javax.inject.Singleton // [CORE-LOGIC] /** @@ -16,6 +17,7 @@ import javax.inject.Inject * Реализация репозитория для работы с данными о вещах. * @param apiService Сервис для взаимодействия с Homebox API. */ +@Singleton class ItemRepositoryImpl @Inject constructor( private val apiService: HomeboxApiService ) : ItemRepository { diff --git a/domain/src/main/java/com/homebox/lens/domain/model/CustomField.kt b/domain/src/main/java/com/homebox/lens/domain/model/CustomField.kt index e845cec..fb6ea43 100644 --- a/domain/src/main/java/com/homebox/lens/domain/model/CustomField.kt +++ b/domain/src/main/java/com/homebox/lens/domain/model/CustomField.kt @@ -1,7 +1,7 @@ // [PACKAGE] com.homebox.lens.domain.model // [FILE] CustomField.kt // [SEMANTICS] data_structure, entity, custom_field - +package com.homebox.lens.domain.model // [CORE-LOGIC] /** * [CONTRACT] diff --git a/domain/src/main/java/com/homebox/lens/domain/model/GroupStatistics.kt b/domain/src/main/java/com/homebox/lens/domain/model/GroupStatistics.kt index 7f07f91..af58eaa 100644 --- a/domain/src/main/java/com/homebox/lens/domain/model/GroupStatistics.kt +++ b/domain/src/main/java/com/homebox/lens/domain/model/GroupStatistics.kt @@ -1,7 +1,7 @@ // [PACKAGE] com.homebox.lens.domain.model // [FILE] GroupStatistics.kt // [SEMANTICS] data_structure, statistics - +package com.homebox.lens.domain.model // [CORE-LOGIC] /** * [CONTRACT] diff --git a/domain/src/main/java/com/homebox/lens/domain/model/Image.kt b/domain/src/main/java/com/homebox/lens/domain/model/Image.kt index b2e5a06..165cb37 100644 --- a/domain/src/main/java/com/homebox/lens/domain/model/Image.kt +++ b/domain/src/main/java/com/homebox/lens/domain/model/Image.kt @@ -1,7 +1,7 @@ // [PACKAGE] com.homebox.lens.domain.model // [FILE] Image.kt // [SEMANTICS] data_structure, entity, image - +package com.homebox.lens.domain.model // [CORE-LOGIC] /** * [CONTRACT] diff --git a/domain/src/main/java/com/homebox/lens/domain/model/ItemAttachment.kt b/domain/src/main/java/com/homebox/lens/domain/model/ItemAttachment.kt index ab7f83e..c2d0aa9 100644 --- a/domain/src/main/java/com/homebox/lens/domain/model/ItemAttachment.kt +++ b/domain/src/main/java/com/homebox/lens/domain/model/ItemAttachment.kt @@ -1,7 +1,7 @@ // [PACKAGE] com.homebox.lens.domain.model // [FILE] ItemAttachment.kt // [SEMANTICS] data_structure, entity, attachment - +package com.homebox.lens.domain.model // [CORE-LOGIC] /** * [CONTRACT] diff --git a/domain/src/main/java/com/homebox/lens/domain/model/ItemCreate.kt b/domain/src/main/java/com/homebox/lens/domain/model/ItemCreate.kt index 453f061..2abe694 100644 --- a/domain/src/main/java/com/homebox/lens/domain/model/ItemCreate.kt +++ b/domain/src/main/java/com/homebox/lens/domain/model/ItemCreate.kt @@ -1,7 +1,7 @@ // [PACKAGE] com.homebox.lens.domain.model // [FILE] ItemCreate.kt // [SEMANTICS] data_structure, entity, input, create - +package com.homebox.lens.domain.model // [CORE-LOGIC] /** * [CONTRACT] diff --git a/domain/src/main/java/com/homebox/lens/domain/model/ItemOut.kt b/domain/src/main/java/com/homebox/lens/domain/model/ItemOut.kt index 72eedc2..7f5bf63 100644 --- a/domain/src/main/java/com/homebox/lens/domain/model/ItemOut.kt +++ b/domain/src/main/java/com/homebox/lens/domain/model/ItemOut.kt @@ -1,7 +1,7 @@ // [PACKAGE] com.homebox.lens.domain.model // [FILE] ItemOut.kt // [SEMANTICS] data_structure, entity, detailed - +package com.homebox.lens.domain.model // [CORE-LOGIC] /** * [CONTRACT] diff --git a/domain/src/main/java/com/homebox/lens/domain/model/ItemSummary.kt b/domain/src/main/java/com/homebox/lens/domain/model/ItemSummary.kt index 75b86c3..651bf29 100644 --- a/domain/src/main/java/com/homebox/lens/domain/model/ItemSummary.kt +++ b/domain/src/main/java/com/homebox/lens/domain/model/ItemSummary.kt @@ -1,7 +1,7 @@ // [PACKAGE] com.homebox.lens.domain.model // [FILE] ItemSummary.kt // [SEMANTICS] data_structure, entity, summary - +package com.homebox.lens.domain.model // [CORE-LOGIC] /** * [CONTRACT] diff --git a/domain/src/main/java/com/homebox/lens/domain/model/ItemUpdate.kt b/domain/src/main/java/com/homebox/lens/domain/model/ItemUpdate.kt index ca6f04c..b4cbd70 100644 --- a/domain/src/main/java/com/homebox/lens/domain/model/ItemUpdate.kt +++ b/domain/src/main/java/com/homebox/lens/domain/model/ItemUpdate.kt @@ -1,7 +1,7 @@ // [PACKAGE] com.homebox.lens.domain.model // [FILE] ItemUpdate.kt // [SEMANTICS] data_structure, entity, input, update - +package com.homebox.lens.domain.model // [CORE-LOGIC] /** * [CONTRACT] diff --git a/domain/src/main/java/com/homebox/lens/domain/model/LabelOut.kt b/domain/src/main/java/com/homebox/lens/domain/model/LabelOut.kt index 433e247..3f3b98a 100644 --- a/domain/src/main/java/com/homebox/lens/domain/model/LabelOut.kt +++ b/domain/src/main/java/com/homebox/lens/domain/model/LabelOut.kt @@ -1,7 +1,7 @@ // [PACKAGE] com.homebox.lens.domain.model // [FILE] LabelOut.kt // [SEMANTICS] data_structure, entity, label - +package com.homebox.lens.domain.model // [CORE-LOGIC] /** * [CONTRACT] diff --git a/domain/src/main/java/com/homebox/lens/domain/model/LocationOut.kt b/domain/src/main/java/com/homebox/lens/domain/model/LocationOut.kt index f4e715e..1c059b8 100644 --- a/domain/src/main/java/com/homebox/lens/domain/model/LocationOut.kt +++ b/domain/src/main/java/com/homebox/lens/domain/model/LocationOut.kt @@ -1,7 +1,7 @@ // [PACKAGE] com.homebox.lens.domain.model // [FILE] LocationOut.kt // [SEMANTICS] data_structure, entity, location - +package com.homebox.lens.domain.model // [CORE-LOGIC] /** * [CONTRACT] diff --git a/domain/src/main/java/com/homebox/lens/domain/model/LocationOutCount.kt b/domain/src/main/java/com/homebox/lens/domain/model/LocationOutCount.kt index 8c9d62e..664e405 100644 --- a/domain/src/main/java/com/homebox/lens/domain/model/LocationOutCount.kt +++ b/domain/src/main/java/com/homebox/lens/domain/model/LocationOutCount.kt @@ -1,7 +1,7 @@ // [PACKAGE] com.homebox.lens.domain.model // [FILE] LocationOutCount.kt // [SEMANTICS] data_structure, entity, location - +package com.homebox.lens.domain.model // [CORE-LOGIC] /** * [CONTRACT] diff --git a/domain/src/main/java/com/homebox/lens/domain/model/MaintenanceEntry.kt b/domain/src/main/java/com/homebox/lens/domain/model/MaintenanceEntry.kt index f64b4ab..bdae1c7 100644 --- a/domain/src/main/java/com/homebox/lens/domain/model/MaintenanceEntry.kt +++ b/domain/src/main/java/com/homebox/lens/domain/model/MaintenanceEntry.kt @@ -1,7 +1,7 @@ // [PACKAGE] com.homebox.lens.domain.model // [FILE] MaintenanceEntry.kt // [SEMANTICS] data_structure, entity, maintenance - +package com.homebox.lens.domain.model // [CORE-LOGIC] /** * [CONTRACT] diff --git a/domain/src/main/java/com/homebox/lens/domain/model/PaginationResult.kt b/domain/src/main/java/com/homebox/lens/domain/model/PaginationResult.kt index 48b9b5c..a7ac2b8 100644 --- a/domain/src/main/java/com/homebox/lens/domain/model/PaginationResult.kt +++ b/domain/src/main/java/com/homebox/lens/domain/model/PaginationResult.kt @@ -1,7 +1,7 @@ // [PACKAGE] com.homebox.lens.domain.model // [FILE] PaginationResult.kt // [SEMANTICS] data_structure, generic, pagination - +package com.homebox.lens.domain.model // [CORE-LOGIC] /** * [CONTRACT] diff --git a/domain/src/main/java/com/homebox/lens/domain/repository/ItemRepository.kt b/domain/src/main/java/com/homebox/lens/domain/repository/ItemRepository.kt index f7d171b..3e97000 100644 --- a/domain/src/main/java/com/homebox/lens/domain/repository/ItemRepository.kt +++ b/domain/src/main/java/com/homebox/lens/domain/repository/ItemRepository.kt @@ -1,7 +1,7 @@ // [PACKAGE] com.homebox.lens.domain.repository // [FILE] ItemRepository.kt // [SEMANTICS] data_access, abstraction, repository - +package com.homebox.lens.domain.repository // [IMPORTS] import com.homebox.lens.domain.model.* diff --git a/domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLabelsUseCase.kt b/domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLabelsUseCase.kt index f0fabc3..0194132 100644 --- a/domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLabelsUseCase.kt +++ b/domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLabelsUseCase.kt @@ -1,29 +1,25 @@ // [PACKAGE] com.homebox.lens.domain.usecase -// [FILE] GetAllLabelsUseCase.kt -// [SEMANTICS] business_logic, use_case, label_retrieval +// [FILE] domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLabelsUseCase.kt +// [SEMANTICS] domain, usecase, label, list // [IMPORTS] +package com.homebox.lens.domain.usecase + import com.homebox.lens.domain.model.LabelOut import com.homebox.lens.domain.repository.ItemRepository import javax.inject.Inject // [CORE-LOGIC] -/** - * [CONTRACT] - * Use case для получения всех меток. - * @param itemRepository Репозиторий для работы с данными. - */ class GetAllLabelsUseCase @Inject constructor( private val itemRepository: ItemRepository ) { - /** - * [CONTRACT] - * Выполняет операцию получения всех меток. - * @return Возвращает список меток. - */ - suspend operator fun invoke(): List { - // [ACTION] - return itemRepository.getAllLabels() + suspend operator fun invoke(): List? { + return try { + itemRepository.getAllLabels() + } catch (e: Exception) { + // [ERROR_HANDLER] Просто возвращаем null. + null + } } } // [END_FILE_GetAllLabelsUseCase.kt] \ No newline at end of file diff --git a/domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLocationsUseCase.kt b/domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLocationsUseCase.kt index 271ce50..7d4a198 100644 --- a/domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLocationsUseCase.kt +++ b/domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLocationsUseCase.kt @@ -1,29 +1,25 @@ // [PACKAGE] com.homebox.lens.domain.usecase -// [FILE] GetAllLocationsUseCase.kt -// [SEMANTICS] business_logic, use_case, location_retrieval +// [FILE] domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLocationsUseCase.kt +// [SEMANTICS] domain, usecase, location, list // [IMPORTS] +package com.homebox.lens.domain.usecase + import com.homebox.lens.domain.model.LocationOutCount import com.homebox.lens.domain.repository.ItemRepository import javax.inject.Inject // [CORE-LOGIC] -/** - * [CONTRACT] - * Use case для получения всех местоположений. - * @param itemRepository Репозиторий для работы с данными. - */ class GetAllLocationsUseCase @Inject constructor( private val itemRepository: ItemRepository ) { - /** - * [CONTRACT] - * Выполняет операцию получения всех местоположений. - * @return Возвращает список местоположений со счетчиками. - */ - suspend operator fun invoke(): List { - // [ACTION] - return itemRepository.getAllLocations() + suspend operator fun invoke(): List? { + return try { + itemRepository.getAllLocations() + } catch (e: Exception) { + // [ERROR_HANDLER] Просто возвращаем null. + null + } } } // [END_FILE_GetAllLocationsUseCase.kt] \ No newline at end of file diff --git a/domain/src/main/java/com/homebox/lens/domain/usecase/GetStatisticsUseCase.kt b/domain/src/main/java/com/homebox/lens/domain/usecase/GetStatisticsUseCase.kt index 8df5fd0..b38d8af 100644 --- a/domain/src/main/java/com/homebox/lens/domain/usecase/GetStatisticsUseCase.kt +++ b/domain/src/main/java/com/homebox/lens/domain/usecase/GetStatisticsUseCase.kt @@ -1,29 +1,25 @@ // [PACKAGE] com.homebox.lens.domain.usecase -// [FILE] GetStatisticsUseCase.kt -// [SEMANTICS] business_logic, use_case, statistics +// [FILE] domain/src/main/java/com/homebox/lens/domain/usecase/GetStatisticsUseCase.kt +// [SEMANTICS] domain, usecase, statistics // [IMPORTS] +package com.homebox.lens.domain.usecase + import com.homebox.lens.domain.model.GroupStatistics import com.homebox.lens.domain.repository.ItemRepository import javax.inject.Inject // [CORE-LOGIC] -/** - * [CONTRACT] - * Use case для получения статистики. - * @param itemRepository Репозиторий для работы с данными. - */ class GetStatisticsUseCase @Inject constructor( private val itemRepository: ItemRepository ) { - /** - * [CONTRACT] - * Выполняет операцию получения статистики. - * @return Возвращает объект со статистикой. - */ - suspend operator fun invoke(): GroupStatistics { - // [ACTION] - return itemRepository.getStatistics() + suspend operator fun invoke(): GroupStatistics? { + return try { + itemRepository.getStatistics() + } catch (e: Exception) { + // [ERROR_HANDLER] Просто возвращаем null, вызывающий слой обработает это. + null + } } } // [END_FILE_GetStatisticsUseCase.kt] \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 55cde03..3e03a03 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,5 @@ +#[FILE] gradle.properties +#[PURPOSE] ????????? ??? ?????? Gradle ## For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html # @@ -10,8 +12,15 @@ # This option should only be used with decoupled projects. For more details, visit # https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects # org.gradle.parallel=true -#Tue Aug 05 16:05:40 MSK 2025 -android.enableJetifier=true +#Tue Aug 05 15:58:20 MSK 2025 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +org.gradle.java.home=/usr/lib/jvm/java-25-openjdk-amd64 + android.useAndroidX=true -org.gradle.java.installations.auto-download=true -org.gradle.java.installations.repositories=foojay +# [ACTION] ??????????? ???????????? ????? ?????? (heap size) ??? Gradle ?? 4 ??. +# ??? ?????????? ??? ?????????????? OutOfMemoryError ?? ?????? ???????? APK. +org.gradle.jvmargs=-Xmx4g \ No newline at end of file