Files
homebox_lens/tech_spec/PROJECT_MANIFEST.xml
2025-09-26 10:30:59 +03:00

1534 lines
144 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version='1.0' encoding='utf-8'?>
<PROJECT_MANIFEST>
<METADATA>
<PROJECT_INFO>
<name>Homebox Lens</name>
<description>Android-клиент для системы управления инвентарем Homebox. Позволяет пользователям управлять своим инвентарем, взаимодействуя с экземпляром сервера Homebox.</description>
</PROJECT_INFO>
<TECHNICAL_DECISIONS>
<DECISION id="tech_ui_framework" status="implemented">
<summary>UI Framework</summary>
<description>Пользовательский интерфейс приложения построен с использованием Jetpack Compose, современного декларативного UI-фреймворка от Google. Это обеспечивает быстрое создание, гибкость и поддержку динамических данных.</description>
</DECISION>
<DECISION id="tech_async" status="implemented">
<summary>Асинхронные операции</summary>
<description>Все асинхронные операции, такие как сетевые запросы или доступ к базе данных, выполняются с использованием Kotlin Coroutines. Это обеспечивает эффективное управление фоновыми задачами без блокировки основного потока.</description>
</DECISION>
<DECISION id="tech_networking" status="implemented">
<summary>Сетевое взаимодействие</summary>
<description>Для взаимодействия с API сервера Homebox используется стек технологий: Retrofit для создания типобезопасных HTTP-клиентов, OkHttp в качестве HTTP-клиента и Moshi для парсинга JSON.</description>
</DECISION>
<DECISION id="tech_database" status="implemented">
<summary>Локальное хранилище</summary>
<description>Для кэширования данных на устройстве используется библиотека Room. Она предоставляет абстракцию над SQLite и обеспечивает надежное локальное хранение данных.</description>
</DECISION>
<DECISION id="tech_logging" status="implemented">
<summary>Библиотека логирования</summary>
<description>В проекте используется Timber (timber.log.Timber) для всех целей логирования. Он предоставляет простой и расширяемый API для логирования.</description>
</DECISION>
<DECISION id="tech_i18n" status="implemented">
<summary>Интернационализация (Мультиязычность)</summary>
<description>
Приложение должно поддерживать несколько языков для обеспечения доступности для глобальной аудитории.
- Все строки, видимые пользователю, вынесены в `app/src/main/res/values/strings.xml`.
- Язык по умолчанию - русский (ru).
- В коде для доступа к строкам используются ссылки на ресурсы (например, `R.string.app_name`).
</description>
</DECISION>
<DECISION id="tech_di" status="implemented">
<summary>Внедрение зависимостей (Dependency Injection)</summary>
<description>Для управления зависимостями в проекте используется Hilt. Он интегрирован с компонентами Jetpack и упрощает внедрение зависимостей в Android-приложениях.</description>
</DECISION>
<DECISION id="di_app" status="implemented">
<summary>Модуль Hilt для зависимостей уровня приложения</summary>
<description>AppModule.kt предоставляет зависимости на уровне приложения, такие как контекст приложения и другие синглтоны.</description>
</DECISION>
<DECISION id="tech_navigation" status="implemented">
<summary>Навигация</summary>
<description>Навигация между экранами (Composable-функциями) реализована с помощью библиотеки Navigation Compose, которая является частью Jetpack Navigation.</description>
</DECISION>
<DECISION id="nav_graph" status="implemented">
<summary>Навигационный граф</summary>
<description>NavGraph.kt определяет структуру навигации приложения, связывая экраны и их маршруты.</description>
</DECISION>
<DECISION id="nav_screen" status="implemented">
<summary>Определение маршрутов экранов</summary>
<description>Screen.kt определяет все возможные маршруты (экраны) в приложении в виде запечатанного класса для типобезопасной навигации.</description>
</DECISION>
</TECHNICAL_DECISIONS>
<SECURITY_SPEC>
<Description>Спецификация безопасности проекта.</Description>
<PRINCIPLE>Все сетевые взаимодействия должны быть защищены HTTPS. Аутентификация пользователя хранится в EncryptedSharedPreferences. Обработка ошибок аутентификации должна включать logout и редирект на экран логина.</PRINCIPLE>
<RULE name="AuthHandling">Использовать JWT или API-ключ для авторизации запросов. При истечении токена автоматически обновлять.</RULE>
<RULE name="DataEncryption">Локальные данные (credentials) шифровать с помощью Android KeyStore.</RULE>
</SECURITY_SPEC>
<ERROR_HANDLING>
<Description>Спецификация обработки ошибок.</Description>
<PRINCIPLE>Все потенциальные ошибки (сеть, БД, валидация) должны быть обработаны с использованием sealed classes для ошибок (e.g., NetworkError, ValidationError) и отображаться пользователю через Snackbar или Dialog.</PRINCIPLE>
<SCENARIO name="NetworkFailure">При сетевых ошибках показывать сообщение "No internet connection" и предлагать retry.</SCENARIO>
<SCENARIO name="ServerError">Для HTTP 4xx/5xx отображать user-friendly сообщение на основе response body.</SCENARIO>
<SCENARIO name="ValidationError">Использовать require/check для контрактов, логировать и показывать toast.</SCENARIO>
</ERROR_HANDLING>
<ICONOGRAPHY_GUIDE>
<summary>Руководство по использованию иконок</summary>
<description>Этот раздел определяет стандартный набор иконок 'androidx.compose.material.icons.Icons.Filled' для использования в приложении. Для некоторых иконок указаны их AutoMirrored версии для корректного отображения в RTL-языках.</description>
<ICON name="AccountBox" path="Icons.Filled.AccountBox" />
<ICON name="AccountCircle" path="Icons.Filled.AccountCircle" />
<ICON name="Add" path="Icons.Filled.Add" />
<ICON name="AddCircle" path="Icons.Filled.AddCircle" />
<ICON name="ArrowBack" path="Icons.AutoMirrored.Filled.ArrowBack" note="Использовать AutoMirrored версию" />
<ICON name="ArrowDropDown" path="Icons.Filled.ArrowDropDown" />
<ICON name="ArrowForward" path="Icons.AutoMirrored.Filled.ArrowForward" note="Использовать AutoMirrored версию" />
<ICON name="Build" path="Icons.Filled.Build" />
<ICON name="Call" path="Icons.Filled.Call" />
<ICON name="Check" path="Icons.Filled.Check" />
<ICON name="CheckCircle" path="Icons.Filled.CheckCircle" />
<ICON name="Clear" path="Icons.Filled.Clear" />
<ICON name="Close" path="Icons.Filled.Close" />
<ICON name="Create" path="Icons.Filled.Create" />
<ICON name="DateRange" path="Icons.Filled.DateRange" />
<ICON name="Delete" path="Icons.Filled.Delete" />
<ICON name="Done" path="Icons.Filled.Done" />
<ICON name="Edit" path="Icons.Filled.Edit" />
<ICON name="Email" path="Icons.Filled.Email" />
<ICON name="ExitToApp" path="Icons.AutoMirrored.Filled.ExitToApp" note="Использовать AutoMirrored версию" />
<ICON name="Face" path="Icons.Filled.Face" />
<ICON name="Favorite" path="Icons.Filled.Favorite" />
<ICON name="FavoriteBorder" path="Icons.Filled.FavoriteBorder" />
<ICON name="Home" path="Icons.Filled.Home" />
<ICON name="Info" path="Icons.AutoMirrored.Filled.Info" note="Использовать AutoMirrored версию" />
<ICON name="KeyboardArrowDown" path="Icons.Filled.KeyboardArrowDown" />
<ICON name="KeyboardArrowLeft" path="Icons.AutoMirrored.Filled.KeyboardArrowLeft" note="Использовать AutoMirrored версию" />
<ICON name="KeyboardArrowRight" path="Icons.AutoMirrored.Filled.KeyboardArrowRight" note="Использовать AutoMirrored версию" />
<ICON name="KeyboardArrowUp" path="Icons.Filled.KeyboardArrowUp" />
<ICON name="Label" path="Icons.AutoMirrored.Filled.Label" note="Использовать AutoMirrored версию" />
<ICON name="List" path="Icons.AutoMirrored.Filled.List" note="Использовать AutoMirrored версию" />
<ICON name="LocationOn" path="Icons.Filled.LocationOn" />
<ICON name="Lock" path="Icons.Filled.Lock" />
<ICON name="MailOutline" path="Icons.Filled.MailOutline" />
<ICON name="Menu" path="Icons.Filled.Menu" />
<ICON name="MoreVert" path="Icons.Filled.MoreVert" />
<ICON name="Notifications" path="Icons.Filled.Notifications" />
<ICON name="Person" path="Icons.Filled.Person" />
<ICON name="Phone" path="Icons.Filled.Phone" />
<ICON name="Place" path="Icons.Filled.Place" />
<ICON name="PlayArrow" path="Icons.Filled.PlayArrow" />
<ICON name="Refresh" path="Icons.Filled.Refresh" />
<ICON name="Search" path="Icons.Filled.Search" />
<ICON name="Send" path="Icons.AutoMirrored.Filled.Send" note="Использовать AutoMirrored версию" />
<ICON name="Settings" path="Icons.Filled.Settings" />
<ICON name="Share" path="Icons.Filled.Share" />
<ICON name="ShoppingCart" path="Icons.Filled.ShoppingCart" />
<ICON name="Star" path="Icons.Filled.Star" />
<ICON name="ThumbUp" path="Icons.Filled.ThumbUp" />
<ICON name="Warning" path="Icons.Filled.Warning" />
</ICONOGRAPHY_GUIDE>
</METADATA>
<PROJECT_GRAPH>
<NODE id="object_versions" type="Object" name="Versions" file_path="./buildSrc/src/main/java/Dependencies.kt" package="buildsrc.dependencies">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>build, dependencies</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="object_libs" type="Object" name="Libs" file_path="./buildSrc/src/main/java/Dependencies.kt" package="buildsrc.dependencies">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>build, dependencies</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_navgraph" type="Function" name="NavGraph" file_path="./app/src/main/java/com/homebox/lens/navigation/NavGraph.kt" package="com.homebox.lens.navigation">
<SUMMARY>Определяет граф навигации для всего приложения с использованием Jetpack Compose Navigation.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>navigation, compose, nav_host</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="NavHostController" />
<RELATION type="CREATES_INSTANCE_OF" target_id="NavigationActions" />
</RELATIONS>
</NODE>
<NODE id="sealed_class_screen" type="SealedClass" name="Screen" file_path="./app/src/main/java/com/homebox/lens/navigation/Screen.kt" package="com.homebox.lens.navigation">
<SUMMARY>Запечатанный класс для определения маршрутов навигации в приложении.</SUMMARY>
<DESCRIPTION>Обеспечивает типобезопасность при навигации. @param route Строковый идентификатор маршрута. / sealed class Screen(val route: String) { // [ENTITY: Object('Setup')] data object Setup : Screen("setup_screen") // [END_ENTITY: Object('Setup')] // [ENTITY: Object('Dashboard')] data object Dashboard : Screen("dashboard_screen") // [END_ENTITY: Object('Dashboard')] // [ENTITY: Object('InventoryList')] data object InventoryList : Screen("inventory_list_screen") { // [ENTITY: Function('withFilter')] /** @summary Создает маршрут для экрана списка инвентаря с параметром фильтра. @param key Ключ фильтра (например, "label" или "location"). @param value Значение фильтра (например, ID метки или местоположения). @return Строку полного маршрута с query-параметром. @throws IllegalArgumentException если ключ или значение пустые. / fun withFilter(key: String, value: String): String { require(key.isNotBlank()) { "Filter key cannot be blank." } require(value.isNotBlank()) { "Filter value cannot be blank." } val constructedRoute = "inventory_list_screen?$key=$value" check(constructedRoute.contains("?$key=$value")) { "Route must contain the filter query." } return constructedRoute } // [END_ENTITY: Function('withFilter')] } // [END_ENTITY: Object('InventoryList')] // [ENTITY: Object('ItemDetails')] data object ItemDetails : Screen("item_details_screen/{itemId}") { // [ENTITY: Function('createRoute')] /** @summary Создает маршрут для экрана деталей элемента с указанным ID. @param itemId ID элемента для отображения. @return Строку полного маршрута. @throws IllegalArgumentException если itemId пустой. / fun createRoute(itemId: String): String { require(itemId.isNotBlank()) { "itemId не может быть пустым." } val route = "item_details_screen/$itemId" check(route.endsWith(itemId)) { "Маршрут должен заканчиваться на itemId." } return route } // [END_ENTITY: Function('createRoute')] } // [END_ENTITY: Object('ItemDetails')] // [ENTITY: Object('ItemEdit')] data object ItemEdit : Screen("item_edit_screen?itemId={itemId}") { // [ENTITY: Function('createRoute')] /** @summary Создает маршрут для экрана редактирования элемента с указанным ID. @param itemId ID элемента для редактирования. Null, если создается новый элемент. @return Строку полного маршрута. / fun createRoute(itemId: String? = null): String { return itemId?.let { "item_edit_screen?itemId=$it" } ?: "item_edit_screen" } // [END_ENTITY: Function('createRoute')] } // [END_ENTITY: Object('ItemEdit')] // [ENTITY: Object('LabelsList')] data object LabelsList : Screen("labels_list_screen") // [END_ENTITY: Object('LabelsList')] // [ENTITY: Object('LabelEdit')] data object LabelEdit : Screen("label_edit_screen?labelId={labelId}") { // [ENTITY: Function('createRoute')] /** @summary Создает маршрут для экрана редактирования метки с указанным ID. @param labelId ID метки для редактирования. Null, если создается новая метка. @return Строку полного маршрута. / fun createRoute(labelId: String? = null): String { return labelId?.let { "label_edit_screen?labelId=$it" } ?: "label_edit_screen" } // [END_ENTITY: Function('createRoute')] } // [END_ENTITY: Object('LabelEdit')] // [ENTITY: Object('LocationsList')] data object LocationsList : Screen("locations_list_screen") // [END_ENTITY: Object('LocationsList')] // [ENTITY: Object('LocationEdit')] data object LocationEdit : Screen("location_edit_screen/{locationId}") { // [ENTITY: Function('createRoute')] /** @summary Создает маршрут для экрана редактирования местоположения с указанным ID. @param locationId ID местоположения для редактирования. @return Строку полного маршрута. @throws IllegalArgumentException если locationId пустой. / fun createRoute(locationId: String): String { require(locationId.isNotBlank()) { "locationId не может быть пустым." } val route = "location_edit_screen/$locationId" check(route.endsWith(locationId)) { "Маршрут должен заканчиваться на locationId." } return route } // [END_ENTITY: Function('createRoute')] } // [END_ENTITY: Object('LocationEdit')] // [ENTITY: Object('Search')] data object Search : Screen("search_screen") // [END_ENTITY: Object('Search')] }</DESCRIPTION>
<SEMANTICS_TAGS>navigation, routes, sealed_class</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="class_navigationactions" type="Class" name="NavigationActions" file_path="./app/src/main/java/com/homebox/lens/navigation/NavigationActions.kt" package="com.homebox.lens.navigation">
<SUMMARY>Класс-обертка над NavHostController для предоставления типизированных навигационных действий.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>navigation, controller, actions</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="NavHostController" />
</RELATIONS>
</NODE>
<NODE id="application_mainapplication" type="Application" name="MainApplication" file_path="./app/src/main/java/com/homebox/lens/MainApplication.kt" package="com.homebox.lens">
<SUMMARY>Точка входа в приложение. Инициализирует Hilt и Timber.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>application, hilt, timber</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_appdrawercontent" type="Function" name="AppDrawerContent" file_path="./app/src/main/java/com/homebox/lens/ui/common/AppDrawer.kt" package="com.homebox.lens.ui.common">
<SUMMARY>Контент для бокового навигационного меню (Drawer).</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, common, navigation_drawer</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="NavigationActions" />
</RELATIONS>
</NODE>
<NODE id="function_mainscaffold" type="Function" name="MainScaffold" file_path="./app/src/main/java/com/homebox/lens/ui/common/MainScaffold.kt" package="com.homebox.lens.ui.common">
<SUMMARY>Общая обертка для экранов, включающая Scaffold и Navigation Drawer.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, common, scaffold, navigation_drawer</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="NavigationActions" />
<RELATION type="CALLS" target_id="AppDrawerContent" />
</RELATIONS>
</NODE>
<NODE id="function_homeboxlenstheme" type="Function" name="HomeboxLensTheme" file_path="./app/src/main/java/com/homebox/lens/ui/theme/Theme.kt" package="com.homebox.lens.ui.theme">
<SUMMARY>The main theme for the Homebox Lens application.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, theme</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="Typography" />
</RELATIONS>
</NODE>
<NODE id="data_structure_typography" type="DataStructure" name="Typography" file_path="./app/src/main/java/com/homebox/lens/ui/theme/Typography.kt" package="com.homebox.lens.ui.theme">
<SUMMARY>Defines the typography for the application.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, theme, typography</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="sealed_interface_dashboarduistate" type="SealedInterface" name="DashboardUiState" file_path="./app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardUiState.kt" package="com.homebox.lens.ui.screen.dashboard">
<SUMMARY>Определяет все возможные состояния для экрана "Дэшборд".</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, state, dashboard</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="GroupStatistics" />
<RELATION type="DEPENDS_ON" target_id="LocationOutCount" />
<RELATION type="DEPENDS_ON" target_id="LabelOut" />
<RELATION type="DEPENDS_ON" target_id="ItemSummary" />
</RELATIONS>
</NODE>
<NODE id="function_dashboardscreen" type="Function" name="DashboardScreen" file_path="./app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardScreen.kt" package="com.homebox.lens.ui.screen.dashboard">
<SUMMARY>Главная Composable-функция для экрана "Панель управления".</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, dashboard, compose, navigation</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="DashboardViewModel" />
<RELATION type="DEPENDS_ON" target_id="NavigationActions" />
<RELATION type="CALLS" target_id="MainScaffold" />
</RELATIONS>
</NODE>
<NODE id="function_dashboardcontent" type="Function" name="DashboardContent" file_path="./app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardScreen.kt" package="com.homebox.lens.ui.screen.dashboard">
<SUMMARY>Отображает основной контент экрана в зависимости от uiState.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, dashboard, compose, navigation</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="CONSUMES_STATE" target_id="DashboardUiState" />
</RELATIONS>
</NODE>
<NODE id="function_statisticssection" type="Function" name="StatisticsSection" file_path="./app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardScreen.kt" package="com.homebox.lens.ui.screen.dashboard">
<SUMMARY>Секция для отображения общей статистики.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, dashboard, compose, navigation</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="GroupStatistics" />
</RELATIONS>
</NODE>
<NODE id="function_statisticcard" type="Function" name="StatisticCard" file_path="./app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardScreen.kt" package="com.homebox.lens.ui.screen.dashboard">
<SUMMARY>Карточка для отображения одного статистического показателя.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, dashboard, compose, navigation</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_recentlyaddedsection" type="Function" name="RecentlyAddedSection" file_path="./app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardScreen.kt" package="com.homebox.lens.ui.screen.dashboard">
<SUMMARY>Секция для отображения недавно добавленных элементов.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, dashboard, compose, navigation</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="ItemSummary" />
</RELATIONS>
</NODE>
<NODE id="function_itemcard" type="Function" name="ItemCard" file_path="./app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardScreen.kt" package="com.homebox.lens.ui.screen.dashboard">
<SUMMARY>Карточка для отображения краткой информации об элементе.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, dashboard, compose, navigation</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="ItemSummary" />
</RELATIONS>
</NODE>
<NODE id="function_locationssection" type="Function" name="LocationsSection" file_path="./app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardScreen.kt" package="com.homebox.lens.ui.screen.dashboard">
<SUMMARY>Секция для отображения местоположений в виде чипсов.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, dashboard, compose, navigation</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="LocationOutCount" />
</RELATIONS>
</NODE>
<NODE id="function_labelssection" type="Function" name="LabelsSection" file_path="./app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardScreen.kt" package="com.homebox.lens.ui.screen.dashboard">
<SUMMARY>Секция для отображения меток в виде чипсов.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, dashboard, compose, navigation</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="LabelOut" />
</RELATIONS>
</NODE>
<NODE id="function_dashboardcontentsuccesspreview" type="Function" name="DashboardContentSuccessPreview" file_path="./app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardScreen.kt" package="com.homebox.lens.ui.screen.dashboard">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, dashboard, compose, navigation</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_dashboardcontentloadingpreview" type="Function" name="DashboardContentLoadingPreview" file_path="./app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardScreen.kt" package="com.homebox.lens.ui.screen.dashboard">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, dashboard, compose, navigation</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_dashboardcontenterrorpreview" type="Function" name="DashboardContentErrorPreview" file_path="./app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardScreen.kt" package="com.homebox.lens.ui.screen.dashboard">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, dashboard, compose, navigation</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="view_model_dashboardviewmodel" type="ViewModel" name="DashboardViewModel" file_path="./app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardViewModel.kt" package="com.homebox.lens.ui.screen.dashboard">
<SUMMARY>ViewModel для главного экрана (Dashboard).</SUMMARY>
<DESCRIPTION>Оркестрирует загрузку данных для Dashboard, используя строгую модель состояний (`DashboardUiState`), и обрабатывает параллельные запросы без состояний гонки. @invariant `uiState` всегда является одним из состояний, определенных в `DashboardUiState`. / @HiltViewModel class DashboardViewModel @Inject constructor( private val getStatisticsUseCase: GetStatisticsUseCase, private val getAllLocationsUseCase: GetAllLocationsUseCase, private val getAllLabelsUseCase: GetAllLabelsUseCase, private val getRecentlyAddedItemsUseCase: GetRecentlyAddedItemsUseCase ) : ViewModel() { private val _uiState = MutableStateFlow&lt;DashboardUiState&gt;(DashboardUiState.Loading) val uiState = _uiState.asStateFlow() init { loadDashboardData() } // [ENTITY: Function('loadDashboardData')] /** @summary Загружает все необходимые данные для экрана Dashboard. @description Выполняет UseCase'ы параллельно и обновляет UI, переключая его между состояниями `Loading`, `Success` и `Error` из `DashboardUiState`. @sideeffect Асинхронно обновляет `_uiState` одним из состояний `DashboardUiState`. / fun loadDashboardData() { viewModelScope.launch { _uiState.value = DashboardUiState.Loading Timber.i("[INFO][ENTRYPOINT][loading_dashboard_data] Starting dashboard data collection.") val statsFlow = flow { emit(getStatisticsUseCase()) } val locationsFlow = flow { emit(getAllLocationsUseCase()) } val labelsFlow = flow { emit(getAllLabelsUseCase()) } val recentItemsFlow = getRecentlyAddedItemsUseCase(limit = 10) combine(statsFlow, locationsFlow, labelsFlow, recentItemsFlow) { stats, locations, labels, recentItems -&gt; DashboardUiState.Success( statistics = stats, locations = locations, labels = labels, recentlyAddedItems = recentItems ) }.catch { exception -&gt; Timber.e(exception, "[ERROR][EXCEPTION][loading_failed] Failed to load dashboard data. State -&gt; Error.") _uiState.value = DashboardUiState.Error( message = exception.message ?: "Could not load dashboard data." ) }.collect { successState -&gt; Timber.i("[INFO][SUCCESS][dashboard_data_loaded] Dashboard data loaded successfully. State -&gt; Success.") _uiState.value = successState } } } // [END_ENTITY: Function('loadDashboardData')] }</DESCRIPTION>
<SEMANTICS_TAGS>ui_logic, dashboard, state_management, sealed_state, parallel_data_loading, timber_logging</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="GetStatisticsUseCase" />
<RELATION type="DEPENDS_ON" target_id="GetAllLocationsUseCase" />
<RELATION type="DEPENDS_ON" target_id="GetAllLabelsUseCase" />
<RELATION type="DEPENDS_ON" target_id="GetRecentlyAddedItemsUseCase" />
<RELATION type="EMITS_STATE" target_id="DashboardUiState" />
</RELATIONS>
</NODE>
<NODE id="function_labeleditscreen" type="Function" name="LabelEditScreen" file_path="./app/src/main/java/com/homebox/lens/ui/screen/labeledit/LabelEditScreen.kt" package="com.homebox.lens.ui.screen.labeledit">
<SUMMARY>Composable-функция для экрана "Редактирование метки".</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, label, edit</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="view_model_labeleditviewmodel" />
</RELATIONS>
</NODE>
<NODE id="view_model_labeleditviewmodel" type="ViewModel" name="LabelEditViewModel" file_path="./app/src/main/java/com/homebox/lens/ui/screen/labeledit/LabelEditViewModel.kt" package="com.homebox.lens.ui.screen.labeledit">
<SUMMARY>ViewModel для экрана редактирования/создания метки.</SUMMARY>
<DESCRIPTION>Управляет состоянием и логикой экрана, включая загрузку, создание и обновление метки.</DESCRIPTION>
<SEMANTICS_TAGS>ui, viewmodel, label_management, hilt</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="GetLabelDetailsUseCase" />
<RELATION type="DEPENDS_ON" target_id="use_case_createlabelusecase" />
<RELATION type="DEPENDS_ON" target_id="use_case_updatelabelusecase" />
<RELATION type="EMITS_STATE" target_id="data_class_labeledituistate" />
</RELATIONS>
</NODE>
<NODE id="data_class_labeledituistate" type="DataClass" name="LabelEditUiState" file_path="./app/src/main/java/com/homebox/lens/ui/screen/labeledit/LabelEditViewModel.kt" package="com.homebox.lens.ui.screen.labeledit">
<SUMMARY>Состояние UI для экрана редактирования метки.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, viewmodel, label_management</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_inventorylistscreen" type="Function" name="InventoryListScreen" file_path="./app/src/main/java/com/homebox/lens/ui/screen/inventorylist/InventoryListScreen.kt" package="com.homebox.lens.ui.screen.inventorylist">
<SUMMARY>Composable-функция для экрана "Список инвентаря".</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, inventory, list</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="NavigationActions" />
<RELATION type="CALLS" target_id="MainScaffold" />
</RELATIONS>
</NODE>
<NODE id="view_model_inventorylistviewmodel" type="ViewModel" name="InventoryListViewModel" file_path="./app/src/main/java/com/homebox/lens/ui/screen/inventorylist/InventoryListViewModel.kt" package="com.homebox.lens.ui.screen.inventorylist">
<SUMMARY>ViewModel for the inventory list screen.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, viewmodel, inventory_list</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_setupuistate" type="DataClass" name="SetupUiState" file_path="./app/src/main/java/com/homebox/lens/ui/screen/setup/SetupUiState.kt" package="com.homebox.lens.ui.screen.setup">
<SUMMARY>Неизменяемая модель данных, представляющая полное состояние экрана настройки (Setup Screen).</SUMMARY>
<DESCRIPTION>Использование `data class` предоставляет метод `copy()` для легкого создания новых состояний. @param serverUrl URL-адрес сервера Homebox. @param username Имя пользователя для входа. @param password Пароль пользователя. @param isLoading Флаг, указывающий, выполняется ли в данный момент сетевой запрос. @param error Сообщение об ошибке для отображения пользователю, или `null` при отсутствии ошибки. @param isSetupComplete Флаг, указывающий на успешное завершение настройки и входа. / data class SetupUiState( val serverUrl: String = "", val username: String = "", val password: String = "", val isLoading: Boolean = false, val error: String? = null, val isSetupComplete: Boolean = false )</DESCRIPTION>
<SEMANTICS_TAGS>ui_state, data_model, immutable</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_setupscreen" type="Function" name="SetupScreen" file_path="./app/src/main/java/com/homebox/lens/ui/screen/setup/SetupScreen.kt" package="com.homebox.lens.ui.screen.setup">
<SUMMARY>Главная Composable-функция для экрана настройки соединения с сервером.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, setup, compose</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="SetupViewModel" />
<RELATION type="CALLS" target_id="SetupScreenContent" />
</RELATIONS>
</NODE>
<NODE id="function_setupscreencontent" type="Function" name="SetupScreenContent" file_path="./app/src/main/java/com/homebox/lens/ui/screen/setup/SetupScreen.kt" package="com.homebox.lens.ui.screen.setup">
<SUMMARY>Отображает контент экрана настройки: поля ввода и кнопку.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, setup, compose</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="CONSUMES_STATE" target_id="SetupUiState" />
</RELATIONS>
</NODE>
<NODE id="function_setupscreenpreview" type="Function" name="SetupScreenPreview" file_path="./app/src/main/java/com/homebox/lens/ui/screen/setup/SetupScreen.kt" package="com.homebox.lens.ui.screen.setup">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, setup, compose</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="view_model_setupviewmodel" type="ViewModel" name="SetupViewModel" file_path="./app/src/main/java/com/homebox/lens/ui/screen/setup/SetupViewModel.kt" package="com.homebox.lens.ui.screen.setup">
<SUMMARY>ViewModel для экрана первоначальной настройки (Setup).</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui_logic, viewmodel, state_management, user_setup, authentication_flow</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="CredentialsRepository" />
<RELATION type="DEPENDS_ON" target_id="LoginUseCase" />
<RELATION type="EMITS_STATE" target_id="SetupUiState" />
</RELATIONS>
</NODE>
<NODE id="function_labelslistscreen" type="Function" name="LabelsListScreen" file_path="./app/src/main/java/com/homebox/lens/ui/screen/labelslist/LabelsListScreen.kt" package="com.homebox.lens.ui.screen.labelslist">
<SUMMARY>Отображает экран со списком всех меток.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, labels_list, state_management, compose, dialog</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="LabelsListViewModel" />
<RELATION type="DEPENDS_ON" target_id="NavController" />
</RELATIONS>
</NODE>
<NODE id="function_labelslist" type="Function" name="LabelsList" file_path="./app/src/main/java/com/homebox/lens/ui/screen/labelslist/LabelsListScreen.kt" package="com.homebox.lens.ui.screen.labelslist">
<SUMMARY>Composable-функция для отображения списка меток.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, labels_list, state_management, compose, dialog</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="Label" />
</RELATIONS>
</NODE>
<NODE id="function_labellistitem" type="Function" name="LabelListItem" file_path="./app/src/main/java/com/homebox/lens/ui/screen/labelslist/LabelsListScreen.kt" package="com.homebox.lens.ui.screen.labelslist">
<SUMMARY>Composable-функция для отображения одного элемента в списке меток.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, labels_list, state_management, compose, dialog</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="Label" />
</RELATIONS>
</NODE>
<NODE id="view_model_labelslistviewmodel" type="ViewModel" name="LabelsListViewModel" file_path="./app/src/main/java/com/homebox/lens/ui/screen/labelslist/LabelsListViewModel.kt" package="com.homebox.lens.ui.screen.labelslist">
<SUMMARY>ViewModel для экрана со списком меток.</SUMMARY>
<DESCRIPTION>Управляет состоянием экрана, загружает список меток, обрабатывает ошибки и управляет диалогом создания новой метки. @invariant `uiState` всегда является одним из состояний, определенных в `LabelsListUiState`. / @HiltViewModel class LabelsListViewModel @Inject constructor( private val getAllLabelsUseCase: GetAllLabelsUseCase ) : ViewModel() { private val _uiState = MutableStateFlow&lt;LabelsListUiState&gt;(LabelsListUiState.Loading) val uiState = _uiState.asStateFlow() init { loadLabels() } // [ENTITY: Function('loadLabels')] /** @summary Загружает список меток. @description Выполняет `GetAllLabelsUseCase` и обновляет UI, переключая его между состояниями `Loading`, `Success` и `Error`. @sideeffect Асинхронно обновляет `_uiState`. / fun loadLabels() { viewModelScope.launch { _uiState.value = LabelsListUiState.Loading Timber.i("[INFO][ENTRYPOINT][loading_labels] Starting labels list load. State -&gt; Loading.") val result = runCatching { getAllLabelsUseCase() } result.fold( onSuccess = { labelOuts -&gt; Timber.i("[INFO][SUCCESS][labels_loaded] Labels loaded successfully. Count: ${labelOuts.size}. State -&gt; Success.") val labels = labelOuts.map { labelOut -&gt; Label( id = labelOut.id, name = labelOut.name ) } _uiState.value = LabelsListUiState.Success(labels, isShowingCreateDialog = false) }, onFailure = { exception -&gt; Timber.e(exception, "[ERROR][EXCEPTION][loading_failed] Failed to load labels. State -&gt; Error.") _uiState.value = LabelsListUiState.Error( message = exception.message ?: "Could not load labels." ) } ) } } // [END_ENTITY: Function('loadLabels')] // [ENTITY: Function('onShowCreateDialog')] /** @summary Инициирует отображение диалога для создания метки. @description Обновляет состояние `uiState`, устанавливая `isShowingCreateDialog` в `true`. @sideeffect Обновляет `_uiState`. / fun onShowCreateDialog() { Timber.i("[INFO][ACTION][show_create_dialog] Show create label dialog requested.") if (_uiState.value is LabelsListUiState.Success) { _uiState.update { (it as LabelsListUiState.Success).copy(isShowingCreateDialog = true) } } } // [END_ENTITY: Function('onShowCreateDialog')] // [ENTITY: Function('onDismissCreateDialog')] /** @summary Скрывает диалог создания метки. @description Обновляет состояние `uiState`, устанавливая `isShowingCreateDialog` в `false`. @sideeffect Обновляет `_uiState`. / fun onDismissCreateDialog() { Timber.i("[INFO][ACTION][dismiss_create_dialog] Dismiss create label dialog requested.") if (_uiState.value is LabelsListUiState.Success) { _uiState.update { (it as LabelsListUiState.Success).copy(isShowingCreateDialog = false) } } } // [END_ENTITY: Function('onDismissCreateDialog')] // [ENTITY: Function('createLabel')] /** @summary Создает новую метку. [MVP_SCOPE] ЗАГЛУШКА. @description В текущей реализации (План Б, Этап 1), эта функция только логирует действие и скрывает диалог. Реальная логика сохранения будет добавлена на следующем этапе. @param name Название новой метки. @precondition `name` не должен быть пустым. @sideeffect Логирует действие, обновляет `_uiState`, чтобы скрыть диалог. / fun createLabel(name: String) { require(name.isNotBlank()) { "[CONTRACT_VIOLATION] Label name cannot be blank." } Timber.i("[INFO][ACTION][create_label] Create label called with name: '$name'. [STUBBED]") // [AI_NOTE]: Здесь будет вызов CreateLabelUseCase. onDismissCreateDialog() } // [END_ENTITY: Function('createLabel')] }</DESCRIPTION>
<SEMANTICS_TAGS>ui_logic, labels_list, state_management, dialog_management</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="GetAllLabelsUseCase" />
<RELATION type="EMITS_STATE" target_id="LabelsListUiState" />
</RELATIONS>
</NODE>
<NODE id="sealed_interface_labelslistuistate" type="SealedInterface" name="LabelsListUiState" file_path="./app/src/main/java/com/homebox/lens/ui/screen/labelslist/LabelsListUiState.kt" package="com.homebox.lens.ui.screen.labelslist">
<SUMMARY>Определяет все возможные состояния для UI экрана со списком меток.</SUMMARY>
<DESCRIPTION>Использование sealed-интерфейса позволяет исчерпывающе обрабатывать все состояния в Composable-функциях. / sealed interface LabelsListUiState { // [ENTITY: DataClass('Success')] // [RELATION: DataClass('Success')] -&gt; [DEPENDS_ON] -&gt; [DataClass('Label')] /** @summary Состояние успеха, содержит список меток и состояние диалога. @param labels Список меток для отображения. @param isShowingCreateDialog Флаг, показывающий, должен ли быть отображен диалог создания метки. @invariant labels не может быть null. / data class Success( val labels: List&lt;Label&gt;, val isShowingCreateDialog: Boolean = false ) : LabelsListUiState // [END_ENTITY: DataClass('Success')] // [ENTITY: DataClass('Error')] /** @summary Состояние ошибки. @param message Текст ошибки для отображения пользователю. @invariant message не может быть пустой. / data class Error(val message: String) : LabelsListUiState // [END_ENTITY: DataClass('Error')] // [ENTITY: Object('Loading')] /** @summary Состояние загрузки данных. @description Указывает, что идет процесс загрузки меток. / data object Loading : LabelsListUiState // [END_ENTITY: Object('Loading')] }</DESCRIPTION>
<SEMANTICS_TAGS>ui_state, sealed_interface, contract</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="Label" />
</RELATIONS>
</NODE>
<NODE id="screen_scan" type="Screen" name="ScanScreen" file_path="./feature/scan/src/main/java/com/homebox/lens/feature/scan/ScanScreen.kt" package="com.homebox.lens.feature.scan">
<SUMMARY>Экран для сканирования QR-кодов и штрих-кодов.</SUMMARY>
<SEMANTICS_TAGS>ui, screen, scan, camera, qrcode, barcode</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="view_model_scanviewmodel" />
</RELATIONS>
</NODE>
<NODE id="view_model_scanviewmodel" type="ViewModel" name="ScanViewModel" file_path="./feature/scan/src/main/java/com/homebox/lens/feature/scan/ScanViewModel.kt" package="com.homebox.lens.feature.scan">
<SUMMARY>ViewModel для экрана сканирования.</SUMMARY>
<SEMANTICS_TAGS>ui_logic, viewmodel, scan, camera</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="EMITS_STATE" target_id="sealed_interface_scanuistate" />
</RELATIONS>
</NODE>
<NODE id="sealed_interface_scanuistate" type="SealedInterface" name="ScanUiState" file_path="./feature/scan/src/main/java/com/homebox/lens/feature/scan/ScanUiState.kt" package="com.homebox.lens.feature.scan">
<SUMMARY>Определяет все возможные состояния для UI экрана сканирования.</SUMMARY>
<SEMANTICS_TAGS>ui_state, sealed_interface, contract</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="class_barcodeanalyzer" type="Class" name="BarcodeAnalyzer" file_path="./feature/scan/src/main/java/com/homebox/lens/feature/scan/BarcodeAnalyzer.kt" package="com.homebox.lens.feature.scan">
<SUMMARY>Анализатор изображений для обнаружения штрих-кодов.</SUMMARY>
<SEMANTICS_TAGS>data, service, barcode_scanning</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_itemeditscreen" type="Function" name="ItemEditScreen" file_path="./app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditScreen.kt" package="com.homebox.lens.ui.screen.itemedit">
<SUMMARY>Composable-функция для экрана "Редактирование элемента".</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, item, edit</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="NavigationActions" />
<RELATION type="DEPENDS_ON" target_id="ItemEditViewModel" />
<RELATION type="CONSUMES_STATE" target_id="ItemEditUiState" />
<RELATION type="CALLS" target_id="MainScaffold" />
</RELATIONS>
</NODE>
<NODE id="data_class_itemedituistate" type="DataClass" name="ItemEditUiState" file_path="./app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditViewModel.kt" package="com.homebox.lens.ui.screen.itemedit">
<SUMMARY>UI state for the item edit screen.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, viewmodel, item_edit</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="view_model_itemeditviewmodel" type="ViewModel" name="ItemEditViewModel" file_path="./app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditViewModel.kt" package="com.homebox.lens.ui.screen.itemedit">
<SUMMARY>ViewModel for the item edit screen.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, viewmodel, item_edit</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="CreateItemUseCase" />
<RELATION type="DEPENDS_ON" target_id="UpdateItemUseCase" />
<RELATION type="DEPENDS_ON" target_id="GetItemDetailsUseCase" />
<RELATION type="EMITS_STATE" target_id="ItemEditUiState" />
</RELATIONS>
</NODE>
<NODE id="function_searchscreen" type="Function" name="SearchScreen" file_path="./app/src/main/java/com/homebox/lens/ui/screen/search/SearchScreen.kt" package="com.homebox.lens.ui.screen.search">
<SUMMARY>Composable-функция для экрана "Поиск".</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, search</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="NavigationActions" />
<RELATION type="CALLS" target_id="MainScaffold" />
</RELATIONS>
</NODE>
<NODE id="view_model_searchviewmodel" type="ViewModel" name="SearchViewModel" file_path="./app/src/main/java/com/homebox/lens/ui/screen/search/SearchViewModel.kt" package="com.homebox.lens.ui.screen.search">
<SUMMARY>ViewModel for the search screen.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, viewmodel, search</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_locationeditscreen" type="Function" name="LocationEditScreen" file_path="./app/src/main/java/com/homebox/lens/ui/screen/locationedit/LocationEditScreen.kt" package="com.homebox.lens.ui.screen.locationedit">
<SUMMARY>Composable-функция для экрана "Редактирование местоположения".</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, location, edit</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="view_model_itemdetailsviewmodel" type="ViewModel" name="ItemDetailsViewModel" file_path="./app/src/main/java/com/homebox/lens/ui/screen/itemdetails/ItemDetailsViewModel.kt" package="com.homebox.lens.ui.screen.itemdetails">
<SUMMARY>ViewModel for the item details screen.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, viewmodel, item_details</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_itemdetailsscreen" type="Function" name="ItemDetailsScreen" file_path="./app/src/main/java/com/homebox/lens/ui/screen/itemdetails/ItemDetailsScreen.kt" package="com.homebox.lens.ui.screen.itemdetails">
<SUMMARY>Composable-функция для экрана "Детали элемента".</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, item, details</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="NavigationActions" />
<RELATION type="CALLS" target_id="MainScaffold" />
</RELATIONS>
</NODE>
<NODE id="function_locationslistscreen" type="Function" name="LocationsListScreen" file_path="./app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListScreen.kt" package="com.homebox.lens.ui.screen.locationslist">
<SUMMARY>Composable-функция для экрана "Список местоположений".</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, locations, list</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="LocationsListViewModel" />
<RELATION type="DEPENDS_ON" target_id="NavigationActions" />
<RELATION type="CALLS" target_id="MainScaffold" />
</RELATIONS>
</NODE>
<NODE id="function_locationslistcontent" type="Function" name="LocationsListContent" file_path="./app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListScreen.kt" package="com.homebox.lens.ui.screen.locationslist">
<SUMMARY>Отображает основной контент экрана в зависимости от `uiState`.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, locations, list</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="CONSUMES_STATE" target_id="LocationsListUiState" />
</RELATIONS>
</NODE>
<NODE id="function_locationcard" type="Function" name="LocationCard" file_path="./app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListScreen.kt" package="com.homebox.lens.ui.screen.locationslist">
<SUMMARY>Карточка для отображения одного местоположения.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, locations, list</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="LocationOutCount" />
</RELATIONS>
</NODE>
<NODE id="function_locationslistsuccesspreview" type="Function" name="LocationsListSuccessPreview" file_path="./app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListScreen.kt" package="com.homebox.lens.ui.screen.locationslist">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, locations, list</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_locationslistemptypreview" type="Function" name="LocationsListEmptyPreview" file_path="./app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListScreen.kt" package="com.homebox.lens.ui.screen.locationslist">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, locations, list</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_locationslistloadingpreview" type="Function" name="LocationsListLoadingPreview" file_path="./app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListScreen.kt" package="com.homebox.lens.ui.screen.locationslist">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, locations, list</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_locationslisterrorpreview" type="Function" name="LocationsListErrorPreview" file_path="./app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListScreen.kt" package="com.homebox.lens.ui.screen.locationslist">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>ui, screen, locations, list</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="view_model_locationslistviewmodel" type="ViewModel" name="LocationsListViewModel" file_path="./app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListViewModel.kt" package="com.homebox.lens.ui.screen.locationslist">
<SUMMARY>ViewModel для экрана списка местоположений.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, viewmodel, locations, hilt</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="GetAllLocationsUseCase" />
<RELATION type="EMITS_STATE" target_id="LocationsListUiState" />
</RELATIONS>
</NODE>
<NODE id="sealed_interface_locationslistuistate" type="SealedInterface" name="LocationsListUiState" file_path="./app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListUiState.kt" package="com.homebox.lens.ui.screen.locationslist">
<SUMMARY>Определяет возможные состояния UI для экрана списка местоположений.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, state, locations</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="LocationOutCount" />
</RELATIONS>
</NODE>
<NODE id="function_colorpicker" type="Function" name="ColorPicker" file_path="./app/src/main/java/com/homebox/lens/ui/components/ColorPicker.kt" package="com.homebox.lens.ui.components">
<SUMMARY>Компонент для выбора цвета.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, component, color_selection</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_loadingoverlay" type="Function" name="LoadingOverlay" file_path="./app/src/main/java/com/homebox/lens/ui/components/LoadingOverlay.kt" package="com.homebox.lens.ui.components">
<SUMMARY>Полноэкранный оверлей с индикатором загрузки.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, component, loading</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="activity_mainactivity" type="Activity" name="MainActivity" file_path="./app/src/main/java/com/homebox/lens/MainActivity.kt" package="com.homebox.lens">
<SUMMARY>Главная и единственная Activity в приложении.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>ui, activity, entrypoint</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="CALLS" target_id="HomeboxLensTheme" />
<RELATION type="CALLS" target_id="NavGraph" />
</RELATIONS>
</NODE>
<NODE id="function_greeting" type="Function" name="Greeting" file_path="./app/src/main/java/com/homebox/lens/MainActivity.kt" package="com.homebox.lens">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>ui, activity, entrypoint</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_greetingpreview" type="Function" name="GreetingPreview" file_path="./app/src/main/java/com/homebox/lens/MainActivity.kt" package="com.homebox.lens">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>ui, activity, entrypoint</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="class_updateitemusecasetest" type="Class" name="UpdateItemUseCaseTest" file_path="./domain/src/test/java/com/homebox/lens/domain/usecase/UpdateItemUseCaseTest.kt" package="com.homebox.lens.domain.usecase">
<SUMMARY>Unit tests for [UpdateItemUseCase].</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>testing, usecase, unit_test</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="TESTS" target_id="UpdateItemUseCase" />
</RELATIONS>
</NODE>
<NODE id="use_case_updatelabelusecase" type="UseCase" name="UpdateLabelUseCase" file_path="./domain/src/main/java/com/homebox/lens/domain/usecase/UpdateLabelUseCase.kt" package="com.homebox.lens.domain.usecase">
<SUMMARY>Сценарий использования для обновления метки.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>business_logic, use_case, label, update</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="ItemRepository" />
</RELATIONS>
</NODE>
<NODE id="use_case_updatelocationusecase" type="UseCase" name="UpdateLocationUseCase" file_path="./domain/src/main/java/com/homebox/lens/domain/usecase/UpdateLocationUseCase.kt" package="com.homebox.lens.domain.usecase">
<SUMMARY>Сценарий использования для обновления местоположения.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>business_logic, use_case, location, update</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="ItemRepository" />
</RELATIONS>
</NODE>
<NODE id="use_case_deleteitemusecase" type="UseCase" name="DeleteItemUseCase" file_path="./domain/src/main/java/com/homebox/lens/domain/usecase/DeleteItemUseCase.kt" package="com.homebox.lens.domain.usecase">
<SUMMARY>Use case для удаления вещи.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>business_logic, use_case, item_deletion</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="ItemRepository" />
</RELATIONS>
</NODE>
<NODE id="use_case_getalllocationsusecase" type="UseCase" name="GetAllLocationsUseCase" file_path="./domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLocationsUseCase.kt" package="com.homebox.lens.domain.usecase">
<SUMMARY>Получает список всех локаций.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>domain, usecase</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="ItemRepository" />
<RELATION type="RETURNS" target_id="List&lt;LocationOutCount&gt;" />
</RELATIONS>
</NODE>
<NODE id="use_case_getrecentlyaddeditemsusecase" type="UseCase" name="GetRecentlyAddedItemsUseCase" file_path="./domain/src/main/java/com/homebox/lens/domain/usecase/GetRecentlyAddedItemsUseCase.kt" package="com.homebox.lens.domain.usecase">
<SUMMARY>Сценарий использования для получения списка недавно добавленных товаров.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>domain, usecase</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="ItemRepository" />
<RELATION type="RETURNS" target_id="Flow&lt;List&lt;ItemSummary&gt;&gt;" />
</RELATIONS>
</NODE>
<NODE id="use_case_getitemdetailsusecase" type="UseCase" name="GetItemDetailsUseCase" file_path="./domain/src/main/java/com/homebox/lens/domain/usecase/GetItemDetailsUseCase.kt" package="com.homebox.lens.domain.usecase">
<SUMMARY>Use case для получения детальной информации о вещи.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>business_logic, use_case, item_retrieval</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="ItemRepository" />
</RELATIONS>
</NODE>
<NODE id="use_case_getstatisticsusecase" type="UseCase" name="GetStatisticsUseCase" file_path="./domain/src/main/java/com/homebox/lens/domain/usecase/GetStatisticsUseCase.kt" package="com.homebox.lens.domain.usecase">
<SUMMARY>Получает статистику инвентаря.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>domain, usecase</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="ItemRepository" />
<RELATION type="RETURNS" target_id="GroupStatistics" />
</RELATIONS>
</NODE>
<NODE id="use_case_loginusecase" type="UseCase" name="LoginUseCase" file_path="./domain/src/main/java/com/homebox/lens/domain/usecase/LoginUseCase.kt" package="com.homebox.lens.domain.usecase">
<SUMMARY>Use case для выполнения входа пользователя.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>domain, usecase, authentication</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="AuthRepository" />
</RELATIONS>
</NODE>
<NODE id="use_case_createitemusecase" type="UseCase" name="CreateItemUseCase" file_path="./domain/src/main/java/com/homebox/lens/domain/usecase/CreateItemUseCase.kt" package="com.homebox.lens.domain.usecase">
<SUMMARY>Use case для создания новой вещи.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>business_logic, use_case, item_creation</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="ItemRepository" />
</RELATIONS>
</NODE>
<NODE id="use_case_syncinventoryusecase" type="UseCase" name="SyncInventoryUseCase" file_path="./domain/src/main/java/com/homebox/lens/domain/usecase/SyncInventoryUseCase.kt" package="com.homebox.lens.domain.usecase">
<SUMMARY>Use case для синхронизации (получения) списка вещей.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>business_logic, use_case, data_sync</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="ItemRepository" />
</RELATIONS>
</NODE>
<NODE id="use_case_searchitemsusecase" type="UseCase" name="SearchItemsUseCase" file_path="./domain/src/main/java/com/homebox/lens/domain/usecase/SearchItemsUseCase.kt" package="com.homebox.lens.domain.usecase">
<SUMMARY>Use case для поиска вещей по текстовому запросу.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>business_logic, use_case, search</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="ItemRepository" />
</RELATIONS>
</NODE>
<NODE id="use_case_createlocationusecase" type="UseCase" name="CreateLocationUseCase" file_path="./domain/src/main/java/com/homebox/lens/domain/usecase/CreateLocationUseCase.kt" package="com.homebox.lens.domain.usecase">
<SUMMARY>Сценарий использования для создания нового местоположения.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>business_logic, use_case, location, create</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="ItemRepository" />
</RELATIONS>
</NODE>
<NODE id="use_case_deletelocationusecase" type="UseCase" name="DeleteLocationUseCase" file_path="./domain/src/main/java/com/homebox/lens/domain/usecase/DeleteLocationUseCase.kt" package="com.homebox.lens.domain.usecase">
<SUMMARY>Сценарий использования для удаления местоположения.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>business_logic, use_case, location, delete</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="ItemRepository" />
</RELATIONS>
</NODE>
<NODE id="use_case_deletelabelusecase" type="UseCase" name="DeleteLabelUseCase" file_path="./domain/src/main/java/com/homebox/lens/domain/usecase/DeleteLabelUseCase.kt" package="com.homebox.lens.domain.usecase">
<SUMMARY>Сценарий использования для удаления метки.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>business_logic, use_case, label, delete</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="ItemRepository" />
</RELATIONS>
</NODE>
<NODE id="use_case_getlabeldetailsusecase" type="UseCase" name="GetLabelDetailsUseCase" file_path="./domain/src/main/java/com/homebox/lens/domain/usecase/GetLabelDetailsUseCase.kt" package="com.homebox.lens.domain.usecase">
<SUMMARY>Получает детальную информацию о метке по ее ID.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>business_logic, use_case, label_retrieval</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="ItemRepository" />
</RELATIONS>
</NODE>
<NODE id="use_case_updateitemusecase" type="UseCase" name="UpdateItemUseCase" file_path="./domain/src/main/java/com/homebox/lens/domain/usecase/UpdateItemUseCase.kt" package="com.homebox.lens.domain.usecase">
<SUMMARY>Use case для обновления существующей вещи.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>business_logic, use_case, item_management</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="ItemRepository" />
<RELATION type="CALLS" target_id="ItemRepository.updateItem" />
</RELATIONS>
</NODE>
<NODE id="use_case_createlabelusecase" type="UseCase" name="CreateLabelUseCase" file_path="./domain/src/main/java/com/homebox/lens/domain/usecase/CreateLabelUseCase.kt" package="com.homebox.lens.domain.usecase">
<SUMMARY>Сценарий использования для создания новой метки.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>business_logic, use_case, label, create</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="ItemRepository" />
</RELATIONS>
</NODE>
<NODE id="use_case_getalllabelsusecase" type="UseCase" name="GetAllLabelsUseCase" file_path="./domain/src/main/java/com/homebox/lens/domain/usecase/GetAllLabelsUseCase.kt" package="com.homebox.lens.domain.usecase">
<SUMMARY>Получает список всех меток.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>domain, usecase</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="ItemRepository" />
<RELATION type="RETURNS" target_id="List&lt;LabelOut&gt;" />
</RELATIONS>
</NODE>
<NODE id="data_class_labelcreate" type="DataClass" name="LabelCreate" file_path="./domain/src/main/java/com/homebox/lens/domain/model/LabelCreate.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Модель с данными, необходимыми для создания новой метки.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_structure, contract, label, create</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_groupstatistics" type="DataClass" name="GroupStatistics" file_path="./domain/src/main/java/com/homebox/lens/domain/model/GroupStatistics.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Модель данных для представления агрегированной статистики.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_structure, statistics</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_itemcreate" type="DataClass" name="ItemCreate" file_path="./domain/src/main/java/com/homebox/lens/domain/model/ItemCreate.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Модель данных для создания новой "Вещи".</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_structure, entity, input, create</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_label" type="DataClass" name="Label" file_path="./domain/src/main/java/com/homebox/lens/domain/model/Label.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Представляет собой метку (тег), которую можно присвоить вещи.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>domain, model</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_locationupdate" type="DataClass" name="LocationUpdate" file_path="./domain/src/main/java/com/homebox/lens/domain/model/LocationUpdate.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Модель с данными, необходимыми для обновления местоположения.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_structure, contract, location, update</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_tokenresponse" type="DataClass" name="TokenResponse" file_path="./domain/src/main/java/com/homebox/lens/domain/model/TokenResponse.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Модель данных, представляющая ответ от сервера с токеном аутентификации.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, authentication, model</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="sealed_class_result" type="SealedClass" name="Result" file_path="./domain/src/main/java/com/homebox/lens/domain/model/Result.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Представляет собой результат операции, который может быть либо успешным, либо неуспешным.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>domain, model, result</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_customfield" type="DataClass" name="CustomField" file_path="./domain/src/main/java/com/homebox/lens/domain/model/CustomField.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Модель данных для представления кастомного поля.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_structure, entity, custom_field</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_labelsummary" type="DataClass" name="LabelSummary" file_path="./domain/src/main/java/com/homebox/lens/domain/model/LabelSummary.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Представляет краткую информацию о метке, обычно возвращаемую после создания.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_structure, entity, label, summary</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_locationout" type="DataClass" name="LocationOut" file_path="./domain/src/main/java/com/homebox/lens/domain/model/LocationOut.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Модель данных для представления местоположения (без счетчика).</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_structure, entity, location</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_labelupdate" type="DataClass" name="LabelUpdate" file_path="./domain/src/main/java/com/homebox/lens/domain/model/LabelUpdate.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Модель с данными, необходимыми для обновления метки.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_structure, contract, label, update</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_image" type="DataClass" name="Image" file_path="./domain/src/main/java/com/homebox/lens/domain/model/Image.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Модель данных для представления изображения, привязанного к вещи.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_structure, entity, image</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_locationcreate" type="DataClass" name="LocationCreate" file_path="./domain/src/main/java/com/homebox/lens/domain/model/LocationCreate.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Модель с данными, необходимыми для создания нового местоположения.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_structure, contract, location, create</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_credentials" type="DataClass" name="Credentials" file_path="./domain/src/main/java/com/homebox/lens/domain/model/Credentials.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Data class to hold server credentials.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>domain, model, credentials</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_itemout" type="DataClass" name="ItemOut" file_path="./domain/src/main/java/com/homebox/lens/domain/model/ItemOut.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Полная модель данных для представления "Вещи" со всеми полями.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_structure, entity, detailed</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_itemupdate" type="DataClass" name="ItemUpdate" file_path="./domain/src/main/java/com/homebox/lens/domain/model/ItemUpdate.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Модель данных для обновления существующей "Вещи".</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_structure, entity, input, update</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_labelout" type="DataClass" name="LabelOut" file_path="./domain/src/main/java/com/homebox/lens/domain/model/LabelOut.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Модель данных для представления метки (тега).</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_structure, entity, label</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_itemattachment" type="DataClass" name="ItemAttachment" file_path="./domain/src/main/java/com/homebox/lens/domain/model/ItemAttachment.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Модель данных для представления вложения (файла), привязанного к вещи.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_structure, entity, attachment</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_itemsummary" type="DataClass" name="ItemSummary" file_path="./domain/src/main/java/com/homebox/lens/domain/model/ItemSummary.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Сокращенная модель данных для представления "Вещи" в списках.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_structure, entity, summary</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_statistics" type="DataClass" name="Statistics" file_path="./domain/src/main/java/com/homebox/lens/domain/model/Statistics.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Представляет собой статистику по инвентарю.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>domain, model</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_locationoutcount" type="DataClass" name="LocationOutCount" file_path="./domain/src/main/java/com/homebox/lens/domain/model/LocationOutCount.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Модель данных для представления местоположения со счетчиком вещей.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_structure, entity, location</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_location" type="DataClass" name="Location" file_path="./domain/src/main/java/com/homebox/lens/domain/model/Location.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Представляет собой местоположение, где может находиться вещь.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>domain, model</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_paginationresult" type="DataClass" name="PaginationResult" file_path="./domain/src/main/java/com/homebox/lens/domain/model/PaginationResult.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Генерик-класс для представления постраничных результатов от API.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_structure, generic, pagination</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_maintenanceentry" type="DataClass" name="MaintenanceEntry" file_path="./domain/src/main/java/com/homebox/lens/domain/model/MaintenanceEntry.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Модель данных для записи о техническом обслуживании.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_structure, entity, maintenance</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_item" type="DataClass" name="Item" file_path="./domain/src/main/java/com/homebox/lens/domain/model/Item.kt" package="com.homebox.lens.domain.model">
<SUMMARY>Представляет собой вещь в инвентаре.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>domain, model</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="Location" />
<RELATION type="DEPENDS_ON" target_id="Label" />
</RELATIONS>
</NODE>
<NODE id="interface_authrepository" type="Interface" name="AuthRepository" file_path="./domain/src/main/java/com/homebox/lens/domain/repository/AuthRepository.kt" package="com.homebox.lens.domain.repository">
<SUMMARY>Репозиторий для управления аутентификацией.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>authentication, data_access, repository</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="interface_itemrepository" type="Interface" name="ItemRepository" file_path="./domain/src/main/java/com/homebox/lens/domain/repository/ItemRepository.kt" package="com.homebox.lens.domain.repository">
<SUMMARY>Абстракция репозитория для работы с "Вещами".</SUMMARY>
<DESCRIPTION>Определяет контракт, которому должен следовать слой данных. / interface ItemRepository { // [ENTITY: Function('createItem')] // [RELATION: Function('createItem')] -&gt; [RETURNS] -&gt; [DataClass('ItemSummary')] /** @summary Создает новый элемент. @param newItemData Данные для создания нового элемента. @return Сводка по созданному элементу. / suspend fun createItem(newItemData: ItemCreate): ItemSummary // [END_ENTITY: Function('createItem')] // [ENTITY: Function('getItemDetails')] // [RELATION: Function('getItemDetails')] -&gt; [RETURNS] -&gt; [DataClass('ItemOut')] /** @summary Получает детальную информацию об элементе. @param itemId ID элемента. @return Детальная информация об элементе. / suspend fun getItemDetails(itemId: String): ItemOut // [END_ENTITY: Function('getItemDetails')] // [ENTITY: Function('updateItem')] // [RELATION: Function('updateItem')] -&gt; [RETURNS] -&gt; [DataClass('ItemOut')] /** @summary Обновляет элемент. @param itemId ID элемента для обновления. @param item Данные для обновления элемента. @return Обновленная детальная информация об элементе. / suspend fun updateItem(itemId: String, item: ItemUpdate): ItemOut // [END_ENTITY: Function('updateItem')] // [ENTITY: Function('deleteItem')] /** @summary Удаляет элемент. @param itemId ID элемента для удаления. / suspend fun deleteItem(itemId: String) // [END_ENTITY: Function('deleteItem')] // [ENTITY: Function('syncInventory')] // [RELATION: Function('syncInventory')] -&gt; [RETURNS] -&gt; [DataClass('PaginationResult&lt;ItemSummary&gt;')] /** @summary Синхронизирует инвентарь. @param page Номер страницы. @param pageSize Размер страницы. @return Результат пагинации со сводкой по элементам. / suspend fun syncInventory(page: Int, pageSize: Int): PaginationResult&lt;ItemSummary&gt; // [END_ENTITY: Function('syncInventory')] // [ENTITY: Function('getStatistics')] // [RELATION: Function('getStatistics')] -&gt; [RETURNS] -&gt; [DataClass('GroupStatistics')] /** @summary Получает статистику. @return Статистика по группам. / suspend fun getStatistics(): GroupStatistics // [END_ENTITY: Function('getStatistics')] // [ENTITY: Function('getAllLocations')] // [RELATION: Function('getAllLocations')] -&gt; [RETURNS] -&gt; [DataStructure('List&lt;LocationOutCount&gt;')] /** @summary Получает все местоположения. @return Список всех местоположений со счетчиками. / suspend fun getAllLocations(): List&lt;LocationOutCount&gt; // [END_ENTITY: Function('getAllLocations')] // [ENTITY: Function('getAllLabels')] // [RELATION: Function('getAllLabels')] -&gt; [RETURNS] -&gt; [DataStructure('List&lt;LabelOut&gt;')] /** @summary Получает все метки. @return Список всех меток. / suspend fun getAllLabels(): List&lt;LabelOut&gt; // [END_ENTITY: Function('getAllLabels')] // [ENTITY: Function('getLabelDetails')] // [RELATION: Function('getLabelDetails')] -&gt; [RETURNS] -&gt; [DataClass('LabelOut')] /** @summary Получает детальную информацию о метке. @param labelId ID метки. @return Детальная информация о метке. / suspend fun getLabelDetails(labelId: String): LabelOut // [END_ENTITY: Function('getLabelDetails')] // [ENTITY: Function('createLabel')] // [RELATION: Function('createLabel')] -&gt; [RETURNS] -&gt; [DataClass('LabelSummary')] /** @summary Создает новую метку. @param newLabelData Данные для создания новой метки. @return Сводка по созданной метке. / suspend fun createLabel(newLabelData: LabelCreate): LabelSummary // [END_ENTITY: Function('createLabel')] // [ENTITY: Function('updateLabel')] // [RELATION: Function('updateLabel')] -&gt; [RETURNS] -&gt; [DataClass('LabelOut')] /** @summary Обновляет метку. @param labelId ID метки для обновления. @param labelData Данные для обновления метки. @return Обновленная информация о метке. / suspend fun updateLabel(labelId: String, labelData: LabelUpdate): LabelOut // [END_ENTITY: Function('updateLabel')] // [ENTITY: Function('deleteLabel')] /** @summary Удаляет метку. @param labelId ID метки для удаления. / suspend fun deleteLabel(labelId: String) // [END_ENTITY: Function('deleteLabel')] // [ENTITY: Function('createLocation')] // [RELATION: Function('createLocation')] -&gt; [RETURNS] -&gt; [DataClass('LocationOut')] /** @summary Создает новое местоположение. @param newLocationData Данные для создания нового местоположения. @return Информация о созданном местоположении. / suspend fun createLocation(newLocationData: LocationCreate): LocationOut // [END_ENTITY: Function('createLocation')] // [ENTITY: Function('updateLocation')] // [RELATION: Function('updateLocation')] -&gt; [RETURNS] -&gt; [DataClass('LocationOut')] /** @summary Обновляет местоположение. @param locationId ID местоположения для обновления. @param locationData Данные для обновления местоположения. @return Обновленная информация о местоположении. / suspend fun updateLocation(locationId: String, locationData: LocationUpdate): LocationOut // [END_ENTITY: Function('updateLocation')] // [ENTITY: Function('deleteLocation')] /** @summary Удаляет местоположение. @param locationId ID местоположения для удаления. / suspend fun deleteLocation(locationId: String) // [END_ENTITY: Function('deleteLocation')] // [ENTITY: Function('searchItems')] // [RELATION: Function('searchItems')] -&gt; [RETURNS] -&gt; [DataClass('PaginationResult&lt;ItemSummary&gt;')] /** @summary Ищет элементы. @param query Поисковый запрос. @return Результат пагинации со сводкой по найденным элементам. / suspend fun searchItems(query: String): PaginationResult&lt;ItemSummary&gt; // [END_ENTITY: Function('searchItems')] // [ENTITY: Function('getRecentlyAddedItems')] // [RELATION: Function('getRecentlyAddedItems')] -&gt; [RETURNS] -&gt; [DataStructure('Flow&lt;List&lt;ItemSummary&gt;&gt;')] /** @summary Получает недавно добавленные элементы. @param limit Максимальное количество возвращаемых элементов. @return Поток со списком недавно добавленных элементов. / fun getRecentlyAddedItems(limit: Int): Flow&lt;List&lt;ItemSummary&gt;&gt; // [END_ENTITY: Function('getRecentlyAddedItems')] }</DESCRIPTION>
<SEMANTICS_TAGS>data_access, abstraction, repository</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="ItemSummary" />
<RELATION type="RETURNS" target_id="ItemOut" />
<RELATION type="RETURNS" target_id="ItemOut" />
<RELATION type="RETURNS" target_id="PaginationResult&lt;ItemSummary&gt;" />
<RELATION type="RETURNS" target_id="GroupStatistics" />
<RELATION type="RETURNS" target_id="List&lt;LocationOutCount&gt;" />
<RELATION type="RETURNS" target_id="List&lt;LabelOut&gt;" />
<RELATION type="RETURNS" target_id="LabelOut" />
<RELATION type="RETURNS" target_id="LabelSummary" />
<RELATION type="RETURNS" target_id="LabelOut" />
<RELATION type="RETURNS" target_id="LocationOut" />
<RELATION type="RETURNS" target_id="LocationOut" />
<RELATION type="RETURNS" target_id="PaginationResult&lt;ItemSummary&gt;" />
<RELATION type="RETURNS" target_id="Flow&lt;List&lt;ItemSummary&gt;&gt;" />
</RELATIONS>
</NODE>
<NODE id="interface_credentialsrepository" type="Interface" name="CredentialsRepository" file_path="./domain/src/main/java/com/homebox/lens/domain/repository/CredentialsRepository.kt" package="com.homebox.lens.domain.repository">
<SUMMARY>Repository for managing user credentials and session tokens.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>domain, repository, credentials</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="module_repositorymodule" type="Module" name="RepositoryModule" file_path="./data/src/main/java/com/homebox/lens/data/di/RepositoryModule.kt" package="com.homebox.lens.data.di">
<SUMMARY>Hilt-модуль для предоставления реализаций репозиториев.</SUMMARY>
<DESCRIPTION>Использует `@Binds` для эффективного связывания интерфейсов с их реализациями. / @Module @InstallIn(SingletonComponent::class) abstract class RepositoryModule { // [ENTITY: Function('bindItemRepository')] // [RELATION: Function('bindItemRepository')] -&gt; [PROVIDES] -&gt; [Interface('ItemRepository')] /** @summary Связывает интерфейс ItemRepository с его реализацией. / @Binds @Singleton abstract fun bindItemRepository( itemRepositoryImpl: ItemRepositoryImpl ): ItemRepository // [END_ENTITY: Function('bindItemRepository')] // [ENTITY: Function('bindCredentialsRepository')] // [RELATION: Function('bindCredentialsRepository')] -&gt; [PROVIDES] -&gt; [Interface('CredentialsRepository')] /** @summary Связывает интерфейс CredentialsRepository с его реализацией. / @Binds @Singleton abstract fun bindCredentialsRepository( credentialsRepositoryImpl: CredentialsRepositoryImpl ): CredentialsRepository // [END_ENTITY: Function('bindCredentialsRepository')] // [ENTITY: Function('bindAuthRepository')] // [RELATION: Function('bindAuthRepository')] -&gt; [PROVIDES] -&gt; [Interface('AuthRepository')] /** @summary Связывает интерфейс AuthRepository с его реализацией. / @Binds @Singleton abstract fun bindAuthRepository( authRepositoryImpl: AuthRepositoryImpl ): AuthRepository // [END_ENTITY: Function('bindAuthRepository')] }</DESCRIPTION>
<SEMANTICS_TAGS>dependency_injection, hilt, module, binding</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="PROVIDES" target_id="ItemRepository" />
<RELATION type="PROVIDES" target_id="CredentialsRepository" />
<RELATION type="PROVIDES" target_id="AuthRepository" />
</RELATIONS>
</NODE>
<NODE id="module_apimodule" type="Module" name="ApiModule" file_path="./data/src/main/java/com/homebox/lens/data/di/ApiModule.kt" package="com.homebox.lens.data.di">
<SUMMARY>Hilt-модуль, отвечающий за создание и предоставление всех зависимостей,</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>di, networking</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="PROVIDES" target_id="OkHttpClient" />
<RELATION type="PROVIDES" target_id="Moshi" />
<RELATION type="PROVIDES" target_id="MoshiConverterFactory" />
<RELATION type="PROVIDES" target_id="Retrofit" />
<RELATION type="PROVIDES" target_id="HomeboxApiService" />
</RELATIONS>
</NODE>
<NODE id="module_storagemodule" type="Module" name="StorageModule" file_path="./data/src/main/java/com/homebox/lens/data/di/StorageModule.kt" package="com.homebox.lens.data.di">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>di, hilt, storage</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="PROVIDES" target_id="SharedPreferences" />
<RELATION type="PROVIDES" target_id="EncryptedPreferencesWrapper" />
</RELATIONS>
</NODE>
<NODE id="module_databasemodule" type="Module" name="DatabaseModule" file_path="./data/src/main/java/com/homebox/lens/data/di/DatabaseModule.kt" package="com.homebox.lens.data.di">
<SUMMARY>Предоставляет зависимости для работы с базой данных Room.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>di, hilt, database</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="PROVIDES" target_id="HomeboxDatabase" />
<RELATION type="PROVIDES" target_id="ItemDao" />
<RELATION type="PROVIDES" target_id="LabelDao" />
<RELATION type="PROVIDES" target_id="LocationDao" />
</RELATIONS>
</NODE>
<NODE id="interface_homeboxapiservice" type="Interface" name="HomeboxApiService" file_path="./data/src/main/java/com/homebox/lens/data/api/HomeboxApiService.kt" package="com.homebox.lens.data.api">
<SUMMARY>Определяет эндпоинты для взаимодействия с Homebox API, используя DTO.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data, api, retrofit</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_itemoutdto" type="DataClass" name="ItemOutDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/ItemOutDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>DTO для полной модели вещи.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, item_detailed</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_todomain" type="Function" name="toDomain" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/ItemOutDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>Маппер из ItemOutDto в доменную модель ItemOut.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, item_detailed</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="ItemOut" />
</RELATIONS>
</NODE>
<NODE id="data_class_locationoutcountdto" type="DataClass" name="LocationOutCountDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/LocationOutCountDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>DTO для местоположения со счетчиком.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, location, count</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_todomain" type="Function" name="toDomain" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/LocationOutCountDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>Маппер из LocationOutCountDto в доменную модель LocationOutCount.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, location, count</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="LocationOutCount" />
</RELATIONS>
</NODE>
<NODE id="data_class_itemcreatedto" type="DataClass" name="ItemCreateDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/ItemCreateDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>DTO для создания вещи.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, item_creation</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_todto" type="Function" name="toDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/ItemCreateDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>Маппер из доменной модели ItemCreate в ItemCreateDto.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, item_creation</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="ItemCreateDto" />
</RELATIONS>
</NODE>
<NODE id="data_class_tokenresponsedto" type="DataClass" name="TokenResponseDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/TokenResponseDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>data, dto, api, token</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_itemout" type="DataClass" name="ItemOut" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/ItemDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>DTO для полной информации о вещи (GET /v1/items/{id}).</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data, dto, api</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="LocationOut" />
<RELATION type="DEPENDS_ON" target_id="LabelOutDto" />
</RELATIONS>
</NODE>
<NODE id="data_class_itemsummary" type="DataClass" name="ItemSummary" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/ItemDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>DTO для краткой информации о вещи в списках (GET /v1/items).</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data, dto, api</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="LocationOut" />
</RELATIONS>
</NODE>
<NODE id="data_class_itemcreate" type="DataClass" name="ItemCreate" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/ItemDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>DTO для создания новой вещи (POST /v1/items).</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data, dto, api</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_itemupdate" type="DataClass" name="ItemUpdate" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/ItemDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>DTO для обновления вещи (PUT /v1/items/{id}).</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data, dto, api</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_locationoutdto" type="DataClass" name="LocationOutDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/LocationOutDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, location, output</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_todomain" type="Function" name="toDomain" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/LocationOutDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, location, output</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="LocationOut" />
</RELATIONS>
</NODE>
<NODE id="data_class_paginationresultdto" type="DataClass" name="PaginationResultDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/PaginationResultDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>DTO для постраничных результатов.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, pagination</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_todomain" type="Function" name="toDomain" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/PaginationResultDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>Маппер из PaginationResultDto в доменную модель PaginationResult.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, pagination</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="PaginationResult" />
</RELATIONS>
</NODE>
<NODE id="data_class_paginationresult" type="DataClass" name="PaginationResult" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/PaginationDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>DTO для пагинированных результатов от API.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data, dto, api, pagination</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_itemupdatedto" type="DataClass" name="ItemUpdateDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/ItemUpdateDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>DTO для обновления вещи.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, item_update</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_todto" type="Function" name="toDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/ItemUpdateDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>Маппер из доменной модели ItemUpdate в ItemUpdateDto.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, item_update</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="ItemUpdateDto" />
</RELATIONS>
</NODE>
<NODE id="data_class_locationupdatedto" type="DataClass" name="LocationUpdateDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/LocationUpdateDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, location, update</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_todto" type="Function" name="toDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/LocationUpdateDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, location, update</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="LocationUpdateDto" />
</RELATIONS>
</NODE>
<NODE id="data_class_imagedto" type="DataClass" name="ImageDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/ImageDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>DTO для изображения.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, image</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_todomain" type="Function" name="toDomain" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/ImageDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>Маппер из ImageDto в доменную модель Image.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, image</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="Image" />
</RELATIONS>
</NODE>
<NODE id="data_class_customfielddto" type="DataClass" name="CustomFieldDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/CustomFieldDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>DTO для кастомного поля.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, custom_field</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_todomain" type="Function" name="toDomain" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/CustomFieldDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>Маппер из CustomFieldDto в доменную модель CustomField.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, custom_field</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="CustomField" />
</RELATIONS>
</NODE>
<NODE id="data_class_groupstatisticsdto" type="DataClass" name="GroupStatisticsDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/GroupStatisticsDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>DTO для статистики.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, statistics</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_todomain" type="Function" name="toDomain" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/GroupStatisticsDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>Маппер из GroupStatisticsDto в доменную модель GroupStatistics.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, statistics</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="GroupStatistics" />
</RELATIONS>
</NODE>
<NODE id="data_class_labelsummarydto" type="DataClass" name="LabelSummaryDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/LabelSummaryDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>DTO для ответа от API при создании метки.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, label, summary, api, mapper</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_todomain" type="Function" name="toDomain" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/LabelSummaryDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>Маппер из DTO в доменную модель.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, label, summary, api, mapper</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="LabelSummary" />
</RELATIONS>
</NODE>
<NODE id="data_class_maintenanceentrydto" type="DataClass" name="MaintenanceEntryDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/MaintenanceEntryDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>DTO для записи об обслуживании.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, maintenance</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_todomain" type="Function" name="toDomain" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/MaintenanceEntryDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>Маппер из MaintenanceEntryDto в доменную модель MaintenanceEntry.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, maintenance</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="MaintenanceEntry" />
</RELATIONS>
</NODE>
<NODE id="data_class_locationcreatedto" type="DataClass" name="LocationCreateDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/LocationCreateDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, location, create</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_labeloutdto" type="DataClass" name="LabelOutDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/LabelOutDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>DTO для метки.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, label</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_todomain" type="Function" name="toDomain" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/LabelOutDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>Маппер из LabelOutDto в доменную модель LabelOut.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, label</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="LabelOut" />
</RELATIONS>
</NODE>
<NODE id="data_class_groupstatistics" type="DataClass" name="GroupStatistics" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/StatisticsDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>DTO для статистической информации.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data, dto, api, statistics</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_locationout" type="DataClass" name="LocationOut" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/LocationDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>DTO для информации о местоположении.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data, dto, api, location</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_locationoutcount" type="DataClass" name="LocationOutCount" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/LocationDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>DTO для информации о местоположении со счетчиком вещей.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data, dto, api, location</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_itemattachmentdto" type="DataClass" name="ItemAttachmentDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/ItemAttachmentDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>DTO для вложения.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, attachment</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_todomain" type="Function" name="toDomain" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/ItemAttachmentDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>Маппер из ItemAttachmentDto в доменную модель ItemAttachment.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, attachment</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="ItemAttachment" />
</RELATIONS>
</NODE>
<NODE id="data_class_loginformdto" type="DataClass" name="LoginFormDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/LoginFormDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>data, dto, api, login</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_labelcreatedto" type="DataClass" name="LabelCreateDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/LabelCreateDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>DTO для тела запроса на создание метки (POST /v1/labels).</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, label, create, api</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="data_class_itemsummarydto" type="DataClass" name="ItemSummaryDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/ItemSummaryDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>DTO для сокращенной модели вещи.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, item_summary</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_todomain" type="Function" name="toDomain" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/ItemSummaryDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY>Маппер из ItemSummaryDto в доменную модель ItemSummary.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, item_summary</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="ItemSummary" />
</RELATIONS>
</NODE>
<NODE id="data_class_labelupdatedto" type="DataClass" name="LabelUpdateDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/LabelUpdateDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, label, update</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_todto" type="Function" name="toDto" file_path="./data/src/main/java/com/homebox/lens/data/api/dto/LabelUpdateDto.kt" package="com.homebox.lens.data.api.dto">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>data_transfer_object, label, update</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="LabelUpdateDto" />
</RELATIONS>
</NODE>
<NODE id="function_todomain" type="Function" name="toDomain" file_path="./data/src/main/java/com/homebox/lens/data/api/mapper/TokenMapper.kt" package="com.homebox.lens.data.api.mapper">
<SUMMARY>Преобразует DTO-объект токена в доменную модель.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>mapper, data_conversion, clean_architecture</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="TokenResponse" />
</RELATIONS>
</NODE>
<NODE id="database_homeboxdatabase" type="Database" name="HomeboxDatabase" file_path="./data/src/main/java/com/homebox/lens/data/db/HomeboxDatabase.kt" package="com.homebox.lens.data.db">
<SUMMARY>Основной класс для работы с локальной базой данных Room.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data, database, room</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="database_table_labelentity" type="DatabaseTable" name="LabelEntity" file_path="./data/src/main/java/com/homebox/lens/data/db/entity/LabelEntity.kt" package="com.homebox.lens.data.db.entity">
<SUMMARY>Представляет собой строку в таблице 'labels' в локальной БД.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data, database, entity, label</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="database_table_itemlabelcrossref" type="DatabaseTable" name="ItemLabelCrossRef" file_path="./data/src/main/java/com/homebox/lens/data/db/entity/ItemLabelCrossRef.kt" package="com.homebox.lens.data.db.entity">
<SUMMARY>Таблица для связи "многие-ко-многим" между ItemEntity и LabelEntity.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data, database, entity, relation</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="database_table_itementity" type="DatabaseTable" name="ItemEntity" file_path="./data/src/main/java/com/homebox/lens/data/db/entity/ItemEntity.kt" package="com.homebox.lens.data.db.entity">
<SUMMARY>Представляет собой строку в таблице 'items' в локальной БД.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data, database, entity, item</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="database_table_locationentity" type="DatabaseTable" name="LocationEntity" file_path="./data/src/main/java/com/homebox/lens/data/db/entity/LocationEntity.kt" package="com.homebox.lens.data.db.entity">
<SUMMARY>Представляет собой строку в таблице 'locations' в локальной БД.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data, database, entity, location</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="function_todomain" type="Function" name="toDomain" file_path="./data/src/main/java/com/homebox/lens/data/db/entity/Mapper.kt" package="com.homebox.lens.data.db.entity">
<SUMMARY>Преобразует [ItemWithLabels] (сущность БД) в [ItemSummary] (доменную модель).</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data, database, mapper</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="ItemSummary" />
</RELATIONS>
</NODE>
<NODE id="function_todomain" type="Function" name="toDomain" file_path="./data/src/main/java/com/homebox/lens/data/db/entity/Mapper.kt" package="com.homebox.lens.data.db.entity">
<SUMMARY>Преобразует [LabelEntity] (сущность БД) в [LabelOut] (доменную модель).</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data, database, mapper</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="LabelOut" />
</RELATIONS>
</NODE>
<NODE id="data_class_itemwithlabels" type="DataClass" name="ItemWithLabels" file_path="./data/src/main/java/com/homebox/lens/data/db/entity/ItemWithLabels.kt" package="com.homebox.lens.data.db.entity">
<SUMMARY>POJO для получения ItemEntity вместе со связанными LabelEntity.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data, database, entity, relation</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="ItemEntity" />
<RELATION type="DEPENDS_ON" target_id="LabelEntity" />
</RELATIONS>
</NODE>
<NODE id="class_converters" type="Class" name="Converters" file_path="./data/src/main/java/com/homebox/lens/data/db/Converters.kt" package="com.homebox.lens.data.db">
<SUMMARY>Предоставляет TypeConverters для Room для типов, не поддерживаемых по умолчанию.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data, database, room, converter</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="interface_labeldao" type="Interface" name="LabelDao" file_path="./data/src/main/java/com/homebox/lens/data/db/dao/LabelDao.kt" package="com.homebox.lens.data.db.dao">
<SUMMARY>Предоставляет методы для работы с 'labels' в локальной БД.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data, database, dao, label</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="interface_itemdao" type="Interface" name="ItemDao" file_path="./data/src/main/java/com/homebox/lens/data/db/dao/ItemDao.kt" package="com.homebox.lens.data.db.dao">
<SUMMARY>Предоставляет методы для работы с 'items' в локальной БД.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data, database, dao, item</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="interface_locationdao" type="Interface" name="LocationDao" file_path="./data/src/main/java/com/homebox/lens/data/db/dao/LocationDao.kt" package="com.homebox.lens.data.db.dao">
<SUMMARY>Предоставляет методы для работы с 'locations' в локальной БД.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data, database, dao, location</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="class_cryptomanager" type="Class" name="CryptoManager" file_path="./data/src/main/java/com/homebox/lens/data/security/CryptoManager.kt" package="com.homebox.lens.data.security">
<SUMMARY>A manager for handling encryption and decryption using the Android Keystore system.</SUMMARY>
<DESCRIPTION>This class ensures that cryptographic keys are stored securely. It is designed to be a Singleton provided by Hilt. @invariant The underlying SecretKey must be valid within the AndroidKeyStore. / @RequiresApi(Build.VERSION_CODES.M) @Singleton class CryptoManager @Inject constructor() { private val keyStore = KeyStore.getInstance("AndroidKeyStore").apply { load(null) } private val encryptCipher get() = Cipher.getInstance(TRANSFORMATION).apply { init(Cipher.ENCRYPT_MODE, getKey()) } private fun getDecryptCipherForIv(iv: ByteArray): Cipher { return Cipher.getInstance(TRANSFORMATION).apply { init(Cipher.DECRYPT_MODE, getKey(), IvParameterSpec(iv)) } } private fun getKey(): SecretKey { val existingKey = keyStore.getEntry(ALIAS, null) as? KeyStore.SecretKeyEntry return existingKey?.secretKey ?: createKey() } private fun createKey(): SecretKey { return KeyGenerator.getInstance(ALGORITHM).apply { init( KeyGenParameterSpec.Builder( ALIAS, KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT ) .setBlockModes(BLOCK_MODE) .setEncryptionPaddings(PADDING) .setUserAuthenticationRequired(false) .setRandomizedEncryptionRequired(true) .build() ) }.generateKey() } // [ENTITY: Function('encrypt')] /** @summary Encrypts a byte array and writes it to an output stream. @param bytes The byte array to encrypt. @param outputStream The stream to write the encrypted data to. @return The encrypted byte array. / fun encrypt(bytes: ByteArray, outputStream: OutputStream): ByteArray { Timber.d("[DEBUG][ACTION][encrypting_data] Encrypting data.") val cipher = encryptCipher val encryptedBytes = cipher.doFinal(bytes) outputStream.use { it.write(cipher.iv.size) it.write(cipher.iv) it.write(encryptedBytes.size) it.write(encryptedBytes) } return encryptedBytes } // [END_ENTITY: Function('encrypt')] // [ENTITY: Function('decrypt')] /** @summary Decrypts a byte array from an input stream. @param inputStream The stream to read the encrypted data from. @return The decrypted byte array. / fun decrypt(inputStream: InputStream): ByteArray { Timber.d("[DEBUG][ACTION][decrypting_data] Decrypting data.") return inputStream.use { val ivSize = it.read() val iv = ByteArray(ivSize) it.read(iv) val encryptedBytesSize = it.read() val encryptedBytes = ByteArray(encryptedBytesSize) it.read(encryptedBytes) getDecryptCipherForIv(iv).doFinal(encryptedBytes) } } // [END_ENTITY: Function('decrypt')] companion object { private const val ALGORITHM = KeyProperties.KEY_ALGORITHM_AES private const val BLOCK_MODE = KeyProperties.BLOCK_MODE_CBC private const val PADDING = KeyProperties.ENCRYPTION_PADDING_PKCS7 private const val TRANSFORMATION = "$ALGORITHM/$BLOCK_MODE/$PADDING" private const val ALIAS = "homebox_lens_secret_key" } }</DESCRIPTION>
<SEMANTICS_TAGS>data, security, cryptography</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="class_credentialsrepositoryimpl" type="Class" name="CredentialsRepositoryImpl" file_path="./data/src/main/java/com/homebox/lens/data/repository/CredentialsRepositoryImpl.kt" package="com.homebox.lens.data.repository">
<SUMMARY>Реализует репозиторий для управления учетными данными пользователя.</SUMMARY>
<DESCRIPTION>Взаимодействует с зашифрованными SharedPreferences для сохранения и извлечения данных. @param encryptedPrefs Зашифрованное хранилище ключ-значение, предоставляемое Hilt. @invariant Состояние этого репозитория полностью зависит от содержимого `encryptedPrefs`. / class CredentialsRepositoryImpl @Inject constructor( private val encryptedPrefs: SharedPreferences ) : CredentialsRepository { companion object { private const val KEY_SERVER_URL = "key_server_url" private const val KEY_USERNAME = "key_username" private const val KEY_PASSWORD = "key_password" private const val KEY_AUTH_TOKEN = "key_auth_token" } // [ENTITY: Function('saveCredentials')] /** @summary Сохраняет основные учетные данные пользователя. @param credentials Объект с учетными данными для сохранения. @sideeffect Перезаписывает существующие учетные данные в SharedPreferences. / override suspend fun saveCredentials(credentials: Credentials) { withContext(Dispatchers.IO) { Timber.d("[DEBUG][ACTION][saving_credentials] Saving user credentials.") encryptedPrefs.edit() .putString(KEY_SERVER_URL, credentials.serverUrl) .putString(KEY_USERNAME, credentials.username) .putString(KEY_PASSWORD, credentials.password) .apply() } } // [END_ENTITY: Function('saveCredentials')] // [ENTITY: Function('getCredentials')] /** @summary Извлекает сохраненные учетные данные пользователя в виде потока. @return Flow, который эммитит объект [Credentials] или null, если данные отсутствуют. / override fun getCredentials(): Flow&lt;Credentials?&gt; = flow { Timber.d("[DEBUG][ACTION][getting_credentials] Getting user credentials.") val serverUrl = encryptedPrefs.getString(KEY_SERVER_URL, null) val username = encryptedPrefs.getString(KEY_USERNAME, null) val password = encryptedPrefs.getString(KEY_PASSWORD, null) if (serverUrl != null &amp;&amp; username != null &amp;&amp; password != null) { Timber.d("[DEBUG][SUCCESS][credentials_found] Found and emitting credentials.") emit(Credentials(serverUrl, username, password)) } else { Timber.d("[DEBUG][FALLBACK][no_credentials] No credentials found, emitting null.") emit(null) } }.flowOn(Dispatchers.IO) // [END_ENTITY: Function('getCredentials')] // [ENTITY: Function('saveToken')] /** @summary Сохраняет токен авторизации. @param token Токен для сохранения. @sideeffect Перезаписывает существующий токен в SharedPreferences. / override suspend fun saveToken(token: String) { withContext(Dispatchers.IO) { Timber.d("[DEBUG][ACTION][saving_token] Saving auth token.") encryptedPrefs.edit() .putString(KEY_AUTH_TOKEN, token) .apply() } } // [END_ENTITY: Function('saveToken')] // [ENTITY: Function('getToken')] /** @summary Извлекает сохраненный токен авторизации. @return Строка с токеном или null, если он не найден. / override suspend fun getToken(): String? { return withContext(Dispatchers.IO) { Timber.d("[DEBUG][ACTION][getting_token] Getting auth token.") encryptedPrefs.getString(KEY_AUTH_TOKEN, null) } } // [END_ENTITY: Function('getToken')] }</DESCRIPTION>
<SEMANTICS_TAGS>data, repository, credentials, security</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="IMPLEMENTS" target_id="CredentialsRepository" />
<RELATION type="DEPENDS_ON" target_id="SharedPreferences" />
</RELATIONS>
</NODE>
<NODE id="repository_itemrepositoryimpl" type="Repository" name="ItemRepositoryImpl" file_path="./data/src/main/java/com/homebox/lens/data/repository/ItemRepositoryImpl.kt" package="com.homebox.lens.data.repository">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>data_repository, implementation, items, labels</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="IMPLEMENTS" target_id="ItemRepository" />
<RELATION type="DEPENDS_ON" target_id="HomeboxApiService" />
<RELATION type="DEPENDS_ON" target_id="ItemDao" />
<RELATION type="RETURNS" target_id="ItemSummary" />
<RELATION type="RETURNS" target_id="ItemOut" />
<RELATION type="RETURNS" target_id="ItemOut" />
<RELATION type="RETURNS" target_id="PaginationResult&lt;ItemSummary&gt;" />
<RELATION type="RETURNS" target_id="GroupStatistics" />
<RELATION type="RETURNS" target_id="List&lt;LocationOutCount&gt;" />
<RELATION type="RETURNS" target_id="List&lt;LabelOut&gt;" />
<RELATION type="RETURNS" target_id="LabelOut" />
<RELATION type="RETURNS" target_id="LabelSummary" />
<RELATION type="RETURNS" target_id="PaginationResult&lt;ItemSummary&gt;" />
<RELATION type="RETURNS" target_id="Flow&lt;List&lt;ItemSummary&gt;&gt;" />
</RELATIONS>
</NODE>
<NODE id="function_todto" type="Function" name="toDto" file_path="./data/src/main/java/com/homebox/lens/data/repository/ItemRepositoryImpl.kt" package="com.homebox.lens.data.repository">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>data_repository, implementation, items, labels</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="LabelCreateDto" />
</RELATIONS>
</NODE>
<NODE id="function_todto" type="Function" name="toDto" file_path="./data/src/main/java/com/homebox/lens/data/repository/ItemRepositoryImpl.kt" package="com.homebox.lens.data.repository">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>data_repository, implementation, items, labels</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="LocationCreateDto" />
</RELATIONS>
</NODE>
<NODE id="function_todto" type="Function" name="toDto" file_path="./data/src/main/java/com/homebox/lens/data/repository/ItemRepositoryImpl.kt" package="com.homebox.lens.data.repository">
<SUMMARY />
<DESCRIPTION />
<SEMANTICS_TAGS>data_repository, implementation, items, labels</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="RETURNS" target_id="LabelUpdateDto" />
</RELATIONS>
</NODE>
<NODE id="class_authrepositoryimpl" type="Class" name="AuthRepositoryImpl" file_path="./data/src/main/java/com/homebox/lens/data/repository/AuthRepositoryImpl.kt" package="com.homebox.lens.data.repository">
<SUMMARY>Реализация репозитория для управления аутентификацией.</SUMMARY>
<DESCRIPTION />
<SEMANTICS_TAGS>data_implementation, authentication, repository</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="IMPLEMENTS" target_id="AuthRepository" />
<RELATION type="DEPENDS_ON" target_id="SharedPreferences" />
<RELATION type="DEPENDS_ON" target_id="OkHttpClient" />
<RELATION type="DEPENDS_ON" target_id="MoshiConverterFactory" />
</RELATIONS>
</NODE>
<NODE id="class_encryptedpreferenceswrapper" type="Class" name="EncryptedPreferencesWrapper" file_path="./data/src/main/java/com/homebox/lens/data/repository/EncryptedPreferencesWrapper.kt" package="com.homebox.lens.data.repository">
<SUMMARY>Provides a simplified and secure interface for storing and retrieving sensitive string data.</SUMMARY>
<DESCRIPTION>It uses a CryptoManager to encrypt/decrypt data before writing/reading from a standard SharedPreferences instance. @param sharedPreferences The underlying standard SharedPreferences instance to store encrypted data. @param cryptoManager The manager responsible for all cryptographic operations. / class EncryptedPreferencesWrapper @Inject constructor( private val sharedPreferences: SharedPreferences, private val cryptoManager: CryptoManager ) { // [ENTITY: Function('getString')] /** @summary Retrieves a decrypted string value for a given key. @param key The key for the preference. @param defaultValue The value to return if the key is not found or decryption fails. @return The decrypted string, or the defaultValue. @sideeffect Reads from SharedPreferences. / fun getString(key: String, defaultValue: String?): String? { Timber.d("[DEBUG][ENTRYPOINT][getting_string] Attempting to get string for key: %s", key) val encryptedValue = sharedPreferences.getString(key, null) ?: return defaultValue.also { Timber.d("[DEBUG][FALLBACK][no_value_found] No value for key %s, returning default.", key) } return try { Timber.d("[DEBUG][ACTION][decoding_value] Decoding Base64 value.") val bytes = android.util.Base64.decode(encryptedValue, android.util.Base64.DEFAULT) Timber.d("[DEBUG][ACTION][decrypting_value] Decrypting value with CryptoManager.") val decryptedBytes = cryptoManager.decrypt(ByteArrayInputStream(bytes)) String(decryptedBytes, Charset.defaultCharset()).also { Timber.d("[DEBUG][SUCCESS][decryption_complete] Successfully decrypted value for key: %s", key) } } catch (e: Exception) { Timber.e(e, "[ERROR][EXCEPTION][decryption_failed] Failed to decrypt value for key: %s", key) defaultValue } } // [END_ENTITY: Function('getString')] // [ENTITY: Function('putString')] /** @summary Encrypts and saves a string value for a given key. @param key The key for the preference. @param value The string value to encrypt and save. @sideeffect Modifies the underlying SharedPreferences file. / fun putString(key: String, value: String) { Timber.d("[DEBUG][ENTRYPOINT][putting_string] Attempting to put string for key: %s", key) try { Timber.d("[DEBUG][ACTION][encrypting_value] Encrypting value with CryptoManager.") val outputStream = ByteArrayOutputStream() cryptoManager.encrypt(value.toByteArray(Charset.defaultCharset()), outputStream) val encryptedBytes = outputStream.toByteArray() Timber.d("[DEBUG][ACTION][encoding_value] Encoding encrypted value to Base64.") val encryptedValue = android.util.Base64.encodeToString(encryptedBytes, android.util.Base64.DEFAULT) Timber.d("[DEBUG][ACTION][writing_to_prefs] Writing encrypted value to SharedPreferences.") sharedPreferences.edit().putString(key, encryptedValue).apply() Timber.d("[DEBUG][SUCCESS][encryption_complete] Successfully encrypted and saved value for key: %s", key) } catch (e: Exception) { Timber.e(e, "[ERROR][EXCEPTION][encryption_failed] Failed to encrypt and save value for key: %s", key) } } // [END_ENTITY: Function('putString')] }</DESCRIPTION>
<SEMANTICS_TAGS>data, security, preferences</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="SharedPreferences" />
<RELATION type="DEPENDS_ON" target_id="CryptoManager" />
</RELATIONS>
</NODE>
<NODE id="object_settings_screen_route" type="Object" name="Settings" file_path="./app/src/main/java/com/homebox/lens/navigation/Screen.kt" package="com.homebox.lens.navigation">
<SUMMARY>Маршрут для экрана настроек.</SUMMARY>
<DESCRIPTION>data object Settings : Screen("settings_screen")</DESCRIPTION>
<SEMANTICS_TAGS>navigation, route, settings</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="PART_OF" target_id="sealed_class_screen" />
</RELATIONS>
</NODE>
<NODE id="function_settingsscreen" type="Function" name="SettingsScreen" file_path="./app/src/main/java/com/homebox/lens/ui/screen/settings/SettingsScreen.kt" package="com.homebox.lens.ui.screen.settings">
<SUMMARY>Composable-функция для экрана "Настройки".</SUMMARY>
<DESCRIPTION>Отображает UI для управления настройками приложения.</DESCRIPTION>
<SEMANTICS_TAGS>ui, screen, settings, compose</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="view_model_settingsviewmodel" />
<RELATION type="CONSUMES_STATE" target_id="data_class_settingsuistate" />
<RELATION type="CALLS" target_id="function_mainscaffold" />
</RELATIONS>
</NODE>
<NODE id="view_model_settingsviewmodel" type="ViewModel" name="SettingsViewModel" file_path="./app/src/main/java/com/homebox/lens/ui/screen/settings/SettingsViewModel.kt" package="com.homebox.lens.ui.screen.settings">
<SUMMARY>ViewModel для экрана "Настройки".</SUMMARY>
<DESCRIPTION>Управляет состоянием и логикой экрана настроек.</DESCRIPTION>
<SEMANTICS_TAGS>ui_logic, viewmodel, settings, state_management</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="EMITS_STATE" target_id="data_class_settingsuistate" />
<RELATION type="DEPENDS_ON" target_id="interface_credentialsrepository" />
</RELATIONS>
</NODE>
<NODE id="data_class_settingsuistate" type="DataClass" name="SettingsUiState" file_path="./app/src/main/java/com/homebox/lens/ui/screen/settings/SettingsUiState.kt" package="com.homebox.lens.ui.screen.settings">
<SUMMARY>Состояние UI для экрана настроек.</SUMMARY>
<DESCRIPTION>Содержит поля для URL сервера и других настроек.</DESCRIPTION>
<SEMANTICS_TAGS>ui_state, data_model, immutable, settings</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
<NODE id="object_scan_screen_route" type="Object" name="Scan" file_path="./app/src/main/java/com/homebox/lens/navigation/Screen.kt" package="com.homebox.lens.navigation">
<SUMMARY>Маршрут для экрана сканирования QR/штрих-кодов.</SUMMARY>
<DESCRIPTION>data object Scan : Screen("scan_screen")</DESCRIPTION>
<SEMANTICS_TAGS>navigation, route, scan</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="PART_OF" target_id="sealed_class_screen" />
</RELATIONS>
</NODE>
<NODE id="screen_scan" type="Screen" name="ScanScreen" file_path="./feature/scan/src/main/java/com/homebox/lens/feature/scan/ScanScreen.kt" package="com.homebox.lens.feature.scan">
<SUMMARY>Экран для сканирования QR-кодов и штрих-кодов.</SUMMARY>
<SEMANTICS_TAGS>ui, screen, scan, camera, qrcode, barcode</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="DEPENDS_ON" target_id="view_model_scanviewmodel" />
</RELATIONS>
</NODE>
<NODE id="view_model_scanviewmodel" type="ViewModel" name="ScanViewModel" file_path="./feature/scan/src/main/java/com/homebox/lens/feature/scan/ScanViewModel.kt" package="com.homebox.lens.feature.scan">
<SUMMARY>ViewModel для экрана сканирования.</SUMMARY>
<SEMANTICS_TAGS>ui_logic, viewmodel, scan, camera</SEMANTICS_TAGS>
<RELATIONS>
<RELATION type="EMITS_STATE" target_id="sealed_interface_scanuistate" />
</RELATIONS>
</NODE>
<NODE id="sealed_interface_scanuistate" type="SealedInterface" name="ScanUiState" file_path="./feature/scan/src/main/java/com/homebox/lens/feature/scan/ScanUiState.kt" package="com.homebox.lens.feature.scan">
<SUMMARY>Определяет все возможные состояния для UI экрана сканирования.</SUMMARY>
<SEMANTICS_TAGS>ui_state, sealed_interface, contract</SEMANTICS_TAGS>
<RELATIONS />
</NODE>
</PROJECT_GRAPH>
</PROJECT_MANIFEST>