feat: Add semantic enrichment to all Kotlin files
This commit is contained in:
@@ -1,18 +1,19 @@
|
||||
// [PACKAGE] com.homebox.lens.domain.model
|
||||
// [FILE] Credentials.kt
|
||||
|
||||
// [SEMANTICS] domain, model, credentials
|
||||
package com.homebox.lens.domain.model
|
||||
|
||||
// [ENTITY: DataClass('Credentials')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Data class to hold server credentials.
|
||||
* @property serverUrl The URL of the Homebox server.
|
||||
* @property username The username for authentication.
|
||||
* @property password The password for authentication.
|
||||
* @summary Data class to hold server credentials.
|
||||
* @param serverUrl The URL of the Homebox server.
|
||||
* @param username The username for authentication.
|
||||
* @param password The password for authentication.
|
||||
*/
|
||||
data class Credentials(
|
||||
val serverUrl: String,
|
||||
val username: String,
|
||||
val password: String
|
||||
)
|
||||
// [END_ENTITY: DataClass('Credentials')]
|
||||
// [END_FILE_Credentials.kt]
|
||||
|
||||
@@ -2,17 +2,18 @@
|
||||
// [FILE] CustomField.kt
|
||||
// [SEMANTICS] data_structure, entity, custom_field
|
||||
package com.homebox.lens.domain.model
|
||||
// [CORE-LOGIC]
|
||||
|
||||
// [ENTITY: DataClass('CustomField')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Модель данных для представления кастомного поля.
|
||||
* @property name Имя поля.
|
||||
* @property value Значение поля.
|
||||
* @property type Тип поля (например, "text", "number").
|
||||
* @summary Модель данных для представления кастомного поля.
|
||||
* @param name Имя поля.
|
||||
* @param value Значение поля.
|
||||
* @param type Тип поля (например, "text", "number").
|
||||
*/
|
||||
data class CustomField(
|
||||
val name: String,
|
||||
val value: String,
|
||||
val type: String
|
||||
)
|
||||
// [END_ENTITY: DataClass('CustomField')]
|
||||
// [END_FILE_CustomField.kt]
|
||||
|
||||
@@ -2,14 +2,14 @@
|
||||
// [FILE] GroupStatistics.kt
|
||||
// [SEMANTICS] data_structure, statistics
|
||||
package com.homebox.lens.domain.model
|
||||
// [CORE-LOGIC]
|
||||
|
||||
// [ENTITY: DataClass('GroupStatistics')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Модель данных для представления агрегированной статистики.
|
||||
* @property items Общее количество вещей.
|
||||
* @property labels Общее количество меток.
|
||||
* @property locations Общее количество местоположений.
|
||||
* @property totalValue Общая стоимость всех вещей.
|
||||
* @summary Модель данных для представления агрегированной статистики.
|
||||
* @param items Общее количество вещей.
|
||||
* @param labels Общее количество меток.
|
||||
* @param locations Общее количество местоположений.
|
||||
* @param totalValue Общая стоимость всех вещей.
|
||||
*/
|
||||
data class GroupStatistics(
|
||||
val items: Int,
|
||||
@@ -17,4 +17,5 @@ data class GroupStatistics(
|
||||
val locations: Int,
|
||||
val totalValue: Double
|
||||
)
|
||||
// [END_ENTITY: DataClass('GroupStatistics')]
|
||||
// [END_FILE_GroupStatistics.kt]
|
||||
|
||||
@@ -2,17 +2,18 @@
|
||||
// [FILE] Image.kt
|
||||
// [SEMANTICS] data_structure, entity, image
|
||||
package com.homebox.lens.domain.model
|
||||
// [CORE-LOGIC]
|
||||
|
||||
// [ENTITY: DataClass('Image')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Модель данных для представления изображения, привязанного к вещи.
|
||||
* @property id Уникальный идентификатор изображения.
|
||||
* @property path Путь к файлу изображения.
|
||||
* @property isPrimary Является ли это изображение основным для вещи.
|
||||
* @summary Модель данных для представления изображения, привязанного к вещи.
|
||||
* @param id Уникальный идентификатор изображения.
|
||||
* @param path Путь к файлу изображения.
|
||||
* @param isPrimary Является ли это изображение основным для вещи.
|
||||
*/
|
||||
data class Image(
|
||||
val id: String,
|
||||
val path: String,
|
||||
val isPrimary: Boolean
|
||||
)
|
||||
// [END_ENTITY: DataClass('Image')]
|
||||
// [END_FILE_Image.kt]
|
||||
|
||||
@@ -1,22 +1,25 @@
|
||||
// [PACKAGE] com.homebox.lens.domain.model
|
||||
// [FILE] Item.kt
|
||||
|
||||
// [SEMANTICS] domain, model
|
||||
package com.homebox.lens.domain.model
|
||||
|
||||
// [IMPORTS]
|
||||
import java.math.BigDecimal
|
||||
// [END_IMPORTS]
|
||||
|
||||
// [CONTRACT]
|
||||
// [ENTITY: DataClass('Item')]
|
||||
// [RELATION: DataClass('Item')] -> [DEPENDS_ON] -> [DataClass('Location')]
|
||||
// [RELATION: DataClass('Item')] -> [DEPENDS_ON] -> [DataClass('Label')]
|
||||
/**
|
||||
* [ENTITY: DataClass('Item')]
|
||||
* [PURPOSE] Представляет собой вещь в инвентаре.
|
||||
* @property id Уникальный идентификатор вещи.
|
||||
* @property name Название вещи.
|
||||
* @property description Описание вещи.
|
||||
* @property image Url изображения.
|
||||
* @property location Местоположение вещи.
|
||||
* @property labels Список меток, присвоенных вещи.
|
||||
* @property value Стоимость вещи.
|
||||
* @property createdAt Дата создания.
|
||||
* @summary Представляет собой вещь в инвентаре.
|
||||
* @param id Уникальный идентификатор вещи.
|
||||
* @param name Название вещи.
|
||||
* @param description Описание вещи.
|
||||
* @param image Url изображения.
|
||||
* @param location Местоположение вещи.
|
||||
* @param labels Список меток, присвоенных вещи.
|
||||
* @param value Стоимость вещи.
|
||||
* @param createdAt Дата создания.
|
||||
*/
|
||||
data class Item(
|
||||
val id: String,
|
||||
@@ -28,5 +31,6 @@ data class Item(
|
||||
val value: BigDecimal?,
|
||||
val createdAt: String?
|
||||
)
|
||||
// [END_ENTITY: DataClass('Item')]
|
||||
|
||||
// [END_FILE_Item.kt]
|
||||
|
||||
@@ -2,16 +2,16 @@
|
||||
// [FILE] ItemAttachment.kt
|
||||
// [SEMANTICS] data_structure, entity, attachment
|
||||
package com.homebox.lens.domain.model
|
||||
// [CORE-LOGIC]
|
||||
|
||||
// [ENTITY: DataClass('ItemAttachment')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Модель данных для представления вложения (файла), привязанного к вещи.
|
||||
* @property id Уникальный идентификатор вложения.
|
||||
* @property name Имя файла.
|
||||
* @property path Путь к файлу.
|
||||
* @property type MIME-тип файла.
|
||||
* @property createdAt Дата и время создания.
|
||||
* @property updatedAt Дата и время последнего обновления.
|
||||
* @summary Модель данных для представления вложения (файла), привязанного к вещи.
|
||||
* @param id Уникальный идентификатор вложения.
|
||||
* @param name Имя файла.
|
||||
* @param path Путь к файлу.
|
||||
* @param type MIME-тип файла.
|
||||
* @param createdAt Дата и время создания.
|
||||
* @param updatedAt Дата и время последнего обновления.
|
||||
*/
|
||||
data class ItemAttachment(
|
||||
val id: String,
|
||||
@@ -21,4 +21,5 @@ data class ItemAttachment(
|
||||
val createdAt: String,
|
||||
val updatedAt: String
|
||||
)
|
||||
// [END_ENTITY: DataClass('ItemAttachment')]
|
||||
// [END_FILE_ItemAttachment.kt]
|
||||
|
||||
@@ -2,23 +2,23 @@
|
||||
// [FILE] ItemCreate.kt
|
||||
// [SEMANTICS] data_structure, entity, input, create
|
||||
package com.homebox.lens.domain.model
|
||||
// [CORE-LOGIC]
|
||||
|
||||
// [ENTITY: DataClass('ItemCreate')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Модель данных для создания новой "Вещи".
|
||||
* @property name Название вещи (обязательно).
|
||||
* @property assetId Идентификатор актива.
|
||||
* @property description Описание.
|
||||
* @property notes Заметки.
|
||||
* @property serialNumber Серийный номер.
|
||||
* @property quantity Количество.
|
||||
* @property value Стоимость.
|
||||
* @property purchasePrice Цена покупки.
|
||||
* @property purchaseDate Дата покупки.
|
||||
* @property warrantyUntil Гарантия до.
|
||||
* @property locationId ID местоположения.
|
||||
* @property parentId ID родительской вещи.
|
||||
* @property labelIds Список ID меток.
|
||||
* @summary Модель данных для создания новой "Вещи".
|
||||
* @param name Название вещи (обязательно).
|
||||
* @param assetId Идентификатор актива.
|
||||
* @param description Описание.
|
||||
* @param notes Заметки.
|
||||
* @param serialNumber Серийный номер.
|
||||
* @param quantity Количество.
|
||||
* @param value Стоимость.
|
||||
* @param purchasePrice Цена покупки.
|
||||
* @param purchaseDate Дата покупки.
|
||||
* @param warrantyUntil Гарантия до.
|
||||
* @param locationId ID местоположения.
|
||||
* @param parentId ID родительской вещи.
|
||||
* @param labelIds Список ID меток.
|
||||
*/
|
||||
data class ItemCreate(
|
||||
val name: String,
|
||||
@@ -35,4 +35,5 @@ data class ItemCreate(
|
||||
val parentId: String?,
|
||||
val labelIds: List<String>?
|
||||
)
|
||||
// [END_ENTITY: DataClass('ItemCreate')]
|
||||
// [END_FILE_ItemCreate.kt]
|
||||
|
||||
@@ -2,32 +2,32 @@
|
||||
// [FILE] ItemOut.kt
|
||||
// [SEMANTICS] data_structure, entity, detailed
|
||||
package com.homebox.lens.domain.model
|
||||
// [CORE-LOGIC]
|
||||
|
||||
// [ENTITY: DataClass('ItemOut')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Полная модель данных для представления "Вещи" со всеми полями.
|
||||
* @property id Уникальный идентификатор.
|
||||
* @property name Название.
|
||||
* @property assetId Идентификатор актива.
|
||||
* @property description Описание.
|
||||
* @property notes Заметки.
|
||||
* @property serialNumber Серийный номер.
|
||||
* @property quantity Количество.
|
||||
* @property isArchived Флаг архивации.
|
||||
* @property value Стоимость.
|
||||
* @property purchasePrice Цена покупки.
|
||||
* @property purchaseDate Дата покупки.
|
||||
* @property warrantyUntil Гарантия до.
|
||||
* @property location Местоположение.
|
||||
* @property parent Родительская вещь (если есть).
|
||||
* @property children Дочерние вещи.
|
||||
* @property labels Список меток.
|
||||
* @property attachments Список вложений.
|
||||
* @property images Список изображений.
|
||||
* @property fields Список кастомных полей.
|
||||
* @property maintenance Список записей об обслуживании.
|
||||
* @property createdAt Дата и время создания.
|
||||
* @property updatedAt Дата и время последнего обновления.
|
||||
* @summary Полная модель данных для представления "Вещи" со всеми полями.
|
||||
* @param id Уникальный идентификатор.
|
||||
* @param name Название.
|
||||
* @param assetId Идентификатор актива.
|
||||
* @param description Описание.
|
||||
* @param notes Заметки.
|
||||
* @param serialNumber Серийный номер.
|
||||
* @param quantity Количество.
|
||||
* @param isArchived Флаг архивации.
|
||||
* @param value Стоимость.
|
||||
* @param purchasePrice Цена покупки.
|
||||
* @param purchaseDate Дата покупки.
|
||||
* @param warrantyUntil Гарантия до.
|
||||
* @param location Местоположение.
|
||||
* @param parent Родительская вещь (если есть).
|
||||
* @param children Дочерние вещи.
|
||||
* @param labels Список меток.
|
||||
* @param attachments Список вложений.
|
||||
* @param images Список изображений.
|
||||
* @param fields Список кастомных полей.
|
||||
* @param maintenance Список записей об обслуживании.
|
||||
* @param createdAt Дата и время создания.
|
||||
* @param updatedAt Дата и время последнего обновления.
|
||||
*/
|
||||
data class ItemOut(
|
||||
val id: String,
|
||||
@@ -53,4 +53,5 @@ data class ItemOut(
|
||||
val createdAt: String,
|
||||
val updatedAt: String
|
||||
)
|
||||
// [END_ENTITY: DataClass('ItemOut')]
|
||||
// [END_FILE_ItemOut.kt]
|
||||
|
||||
@@ -2,20 +2,20 @@
|
||||
// [FILE] ItemSummary.kt
|
||||
// [SEMANTICS] data_structure, entity, summary
|
||||
package com.homebox.lens.domain.model
|
||||
// [CORE-LOGIC]
|
||||
|
||||
// [ENTITY: DataClass('ItemSummary')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Сокращенная модель данных для представления "Вещи" в списках.
|
||||
* @property id Уникальный идентификатор вещи.
|
||||
* @property name Название вещи.
|
||||
* @property assetId Идентификатор актива.
|
||||
* @property image Основное изображение. Может быть null.
|
||||
* @property isArchived Флаг архивации.
|
||||
* @property labels Список меток.
|
||||
* @property location Местоположение. Может быть null.
|
||||
* @property value Стоимость.
|
||||
* @property createdAt Дата и время создания.
|
||||
* @property updatedAt Дата и время последнего обновления.
|
||||
* @summary Сокращенная модель данных для представления "Вещи" в списках.
|
||||
* @param id Уникальный идентификатор вещи.
|
||||
* @param name Название вещи.
|
||||
* @param assetId Идентификатор актива.
|
||||
* @param image Основное изображение. Может быть null.
|
||||
* @param isArchived Флаг архивации.
|
||||
* @param labels Список меток.
|
||||
* @param location Местоположение. Может быть null.
|
||||
* @param value Стоимость.
|
||||
* @param createdAt Дата и время создания.
|
||||
* @param updatedAt Дата и время последнего обновления.
|
||||
*/
|
||||
data class ItemSummary(
|
||||
val id: String,
|
||||
@@ -29,4 +29,5 @@ data class ItemSummary(
|
||||
val createdAt: String,
|
||||
val updatedAt: String
|
||||
)
|
||||
// [END_ENTITY: DataClass('ItemSummary')]
|
||||
// [END_FILE_ItemSummary.kt]
|
||||
|
||||
@@ -2,24 +2,24 @@
|
||||
// [FILE] ItemUpdate.kt
|
||||
// [SEMANTICS] data_structure, entity, input, update
|
||||
package com.homebox.lens.domain.model
|
||||
// [CORE-LOGIC]
|
||||
|
||||
// [ENTITY: DataClass('ItemUpdate')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Модель данных для обновления существующей "Вещи".
|
||||
* @property name Название вещи.
|
||||
* @property assetId Идентификатор актива.
|
||||
* @property description Описание.
|
||||
* @property notes Заметки.
|
||||
* @property serialNumber Серийный номер.
|
||||
* @property quantity Количество.
|
||||
* @property isArchived Флаг архивации.
|
||||
* @property value Стоимость.
|
||||
* @property purchasePrice Цена покупки.
|
||||
* @property purchaseDate Дата покупки.
|
||||
* @property warrantyUntil Гарантия до.
|
||||
* @property locationId ID местоположения.
|
||||
* @property parentId ID родительской вещи.
|
||||
* @property labelIds Список ID меток для полной замены.
|
||||
* @summary Модель данных для обновления существующей "Вещи".
|
||||
* @param name Название вещи.
|
||||
* @param assetId Идентификатор актива.
|
||||
* @param description Описание.
|
||||
* @param notes Заметки.
|
||||
* @param serialNumber Серийный номер.
|
||||
* @param quantity Количество.
|
||||
* @param isArchived Флаг архивации.
|
||||
* @param value Стоимость.
|
||||
* @param purchasePrice Цена покупки.
|
||||
* @param purchaseDate Дата покупки.
|
||||
* @param warrantyUntil Гарантия до.
|
||||
* @param locationId ID местоположения.
|
||||
* @param parentId ID родительской вещи.
|
||||
* @param labelIds Список ID меток для полной замены.
|
||||
*/
|
||||
data class ItemUpdate(
|
||||
val name: String?,
|
||||
@@ -37,4 +37,5 @@ data class ItemUpdate(
|
||||
val parentId: String?,
|
||||
val labelIds: List<String>?
|
||||
)
|
||||
// [END_ENTITY: DataClass('ItemUpdate')]
|
||||
// [END_FILE_ItemUpdate.kt]
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
// [PACKAGE] com.homebox.lens.domain.model
|
||||
// [FILE] Label.kt
|
||||
|
||||
// [SEMANTICS] domain, model
|
||||
package com.homebox.lens.domain.model
|
||||
|
||||
// [CONTRACT]
|
||||
// [ENTITY: DataClass('Label')]
|
||||
/**
|
||||
* [ENTITY: DataClass('Label')]
|
||||
* [PURPOSE] Представляет собой метку (тег), которую можно присвоить вещи.
|
||||
* @property id Уникальный идентификатор метки.
|
||||
* @property name Название метки.
|
||||
* @summary Представляет собой метку (тег), которую можно присвоить вещи.
|
||||
* @param id Уникальный идентификатор метки.
|
||||
* @param name Название метки.
|
||||
*/
|
||||
data class Label(
|
||||
val id: String,
|
||||
val name: String
|
||||
)
|
||||
// [END_ENTITY: DataClass('Label')]
|
||||
|
||||
// [END_FILE_Label.kt]
|
||||
|
||||
@@ -2,17 +2,17 @@
|
||||
// [FILE] LabelCreate.kt
|
||||
// [SEMANTICS] data_structure, contract, label, create
|
||||
package com.homebox.lens.domain.model
|
||||
// [CORE-LOGIC]
|
||||
|
||||
// [ENTITY: DataClass('LabelCreate')]
|
||||
/**
|
||||
[CONTRACT]
|
||||
[ENTITY: DataClass('LabelCreate')]
|
||||
@summary Модель с данными, необходимыми для создания новой метки.
|
||||
@property name Название новой метки. Обязательное поле.
|
||||
@property color Цвет метки в формате HEX. Необязательное поле.
|
||||
@invariant name не может быть пустым.
|
||||
* @summary Модель с данными, необходимыми для создания новой метки.
|
||||
* @param name Название новой метки. Обязательное поле.
|
||||
* @param color Цвет метки в формате HEX. Необязательное поле.
|
||||
* @invariant name не может быть пустым.
|
||||
*/
|
||||
data class LabelCreate(
|
||||
val name: String,
|
||||
val color: String?
|
||||
)
|
||||
// [END_FILE_LabelCreate.kt]
|
||||
// [END_ENTITY: DataClass('LabelCreate')]
|
||||
// [END_FILE_LabelCreate.kt]
|
||||
|
||||
@@ -2,16 +2,16 @@
|
||||
// [FILE] LabelOut.kt
|
||||
// [SEMANTICS] data_structure, entity, label
|
||||
package com.homebox.lens.domain.model
|
||||
// [CORE-LOGIC]
|
||||
|
||||
// [ENTITY: DataClass('LabelOut')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Модель данных для представления метки (тега).
|
||||
* @property id Уникальный идентификатор.
|
||||
* @property name Название метки.
|
||||
* @property color Цвет метки в формате HEX (например, "#FF0000").
|
||||
* @property isArchived Флаг, указывающий, заархивирована ли метка.
|
||||
* @property createdAt Дата и время создания.
|
||||
* @property updatedAt Дата и время последнего обновления.
|
||||
* @summary Модель данных для представления метки (тега).
|
||||
* @param id Уникальный идентификатор.
|
||||
* @param name Название метки.
|
||||
* @param color Цвет метки в формате HEX (например, "#FF0000").
|
||||
* @param isArchived Флаг, указывающий, заархивирована ли метка.
|
||||
* @param createdAt Дата и время создания.
|
||||
* @param updatedAt Дата и время последнего обновления.
|
||||
*/
|
||||
data class LabelOut(
|
||||
val id: String,
|
||||
@@ -21,4 +21,5 @@ data class LabelOut(
|
||||
val createdAt: String,
|
||||
val updatedAt: String
|
||||
)
|
||||
// [END_ENTITY: DataClass('LabelOut')]
|
||||
// [END_FILE_LabelOut.kt]
|
||||
|
||||
@@ -3,17 +3,15 @@
|
||||
// [SEMANTICS] data_structure, entity, label, summary
|
||||
package com.homebox.lens.domain.model
|
||||
|
||||
// [CORE-LOGIC]
|
||||
// [ENTITY: DataClass('LabelSummary')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* [ENTITY: DataClass('LabelSummary')]
|
||||
* @summary Представляет краткую информацию о метке, обычно возвращаемую после создания.
|
||||
* @property id Уникальный идентификатор метки.
|
||||
* @property name Название метки.
|
||||
* @coherence_note Эта модель соответствует схеме `repo.LabelSummary` из спецификации API.
|
||||
* @param id Уникальный идентификатор метки.
|
||||
* @param name Название метки.
|
||||
*/
|
||||
data class LabelSummary(
|
||||
val id: String,
|
||||
val name: String
|
||||
)
|
||||
// [END_FILE_LabelSummary.kt]
|
||||
// [END_ENTITY: DataClass('LabelSummary')]
|
||||
// [END_FILE_LabelSummary.kt]
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
// [PACKAGE] com.homebox.lens.domain.model
|
||||
// [FILE] Location.kt
|
||||
|
||||
// [SEMANTICS] domain, model
|
||||
package com.homebox.lens.domain.model
|
||||
|
||||
// [CONTRACT]
|
||||
// [ENTITY: DataClass('Location')]
|
||||
/**
|
||||
* [ENTITY: DataClass('Location')]
|
||||
* [PURPOSE] Представляет собой местоположение, где может находиться вещь.
|
||||
* @property id Уникальный идентификатор местоположения.
|
||||
* @property name Название местоположения.
|
||||
* @summary Представляет собой местоположение, где может находиться вещь.
|
||||
* @param id Уникальный идентификатор местоположения.
|
||||
* @param name Название местоположения.
|
||||
*/
|
||||
data class Location(
|
||||
val id: String,
|
||||
val name: String
|
||||
)
|
||||
// [END_ENTITY: DataClass('Location')]
|
||||
|
||||
// [END_FILE_Location.kt]
|
||||
|
||||
@@ -2,16 +2,16 @@
|
||||
// [FILE] LocationOut.kt
|
||||
// [SEMANTICS] data_structure, entity, location
|
||||
package com.homebox.lens.domain.model
|
||||
// [CORE-LOGIC]
|
||||
|
||||
// [ENTITY: DataClass('LocationOut')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Модель данных для представления местоположения (без счетчика).
|
||||
* @property id Уникальный идентификатор.
|
||||
* @property name Название местоположения.
|
||||
* @property color Цвет в формате HEX.
|
||||
* @property isArchived Флаг архивации.
|
||||
* @property createdAt Дата и время создания.
|
||||
* @property updatedAt Дата и время последнего обновления.
|
||||
* @summary Модель данных для представления местоположения (без счетчика).
|
||||
* @param id Уникальный идентификатор.
|
||||
* @param name Название местоположения.
|
||||
* @param color Цвет в формате HEX.
|
||||
* @param isArchived Флаг архивации.
|
||||
* @param createdAt Дата и время создания.
|
||||
* @param updatedAt Дата и время последнего обновления.
|
||||
*/
|
||||
data class LocationOut(
|
||||
val id: String,
|
||||
@@ -21,4 +21,5 @@ data class LocationOut(
|
||||
val createdAt: String,
|
||||
val updatedAt: String
|
||||
)
|
||||
// [END_ENTITY: DataClass('LocationOut')]
|
||||
// [END_FILE_LocationOut.kt]
|
||||
|
||||
@@ -2,17 +2,17 @@
|
||||
// [FILE] LocationOutCount.kt
|
||||
// [SEMANTICS] data_structure, entity, location
|
||||
package com.homebox.lens.domain.model
|
||||
// [CORE-LOGIC]
|
||||
|
||||
// [ENTITY: DataClass('LocationOutCount')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Модель данных для представления местоположения со счетчиком вещей.
|
||||
* @property id Уникальный идентификатор.
|
||||
* @property name Название местоположения.
|
||||
* @property color Цвет в формате HEX.
|
||||
* @property isArchived Флаг архивации.
|
||||
* @property itemCount Количество вещей в данном местоположении.
|
||||
* @property createdAt Дата и время создания.
|
||||
* @property updatedAt Дата и время последнего обновления.
|
||||
* @summary Модель данных для представления местоположения со счетчиком вещей.
|
||||
* @param id Уникальный идентификатор.
|
||||
* @param name Название местоположения.
|
||||
* @param color Цвет в формате HEX.
|
||||
* @param isArchived Флаг архивации.
|
||||
* @param itemCount Количество вещей в данном местоположении.
|
||||
* @param createdAt Дата и время создания.
|
||||
* @param updatedAt Дата и время последнего обновления.
|
||||
*/
|
||||
data class LocationOutCount(
|
||||
val id: String,
|
||||
@@ -23,4 +23,5 @@ data class LocationOutCount(
|
||||
val createdAt: String,
|
||||
val updatedAt: String
|
||||
)
|
||||
// [END_ENTITY: DataClass('LocationOutCount')]
|
||||
// [END_FILE_LocationOutCount.kt]
|
||||
|
||||
@@ -2,18 +2,18 @@
|
||||
// [FILE] MaintenanceEntry.kt
|
||||
// [SEMANTICS] data_structure, entity, maintenance
|
||||
package com.homebox.lens.domain.model
|
||||
// [CORE-LOGIC]
|
||||
|
||||
// [ENTITY: DataClass('MaintenanceEntry')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Модель данных для записи о техническом обслуживании.
|
||||
* @property id Уникальный идентификатор записи.
|
||||
* @property itemId ID связанной вещи.
|
||||
* @property title Заголовок.
|
||||
* @property details Детальное описание.
|
||||
* @property dueAt Дата, до которой нужно выполнить.
|
||||
* @property completedAt Дата выполнения.
|
||||
* @property createdAt Дата и время создания.
|
||||
* @property updatedAt Дата и время последнего обновления.
|
||||
* @summary Модель данных для записи о техническом обслуживании.
|
||||
* @param id Уникальный идентификатор записи.
|
||||
* @param itemId ID связанной вещи.
|
||||
* @param title Заголовок.
|
||||
* @param details Детальное описание.
|
||||
* @param dueAt Дата, до которой нужно выполнить.
|
||||
* @param completedAt Дата выполнения.
|
||||
* @param createdAt Дата и время создания.
|
||||
* @param updatedAt Дата и время последнего обновления.
|
||||
*/
|
||||
data class MaintenanceEntry(
|
||||
val id: String,
|
||||
@@ -25,4 +25,5 @@ data class MaintenanceEntry(
|
||||
val createdAt: String,
|
||||
val updatedAt: String
|
||||
)
|
||||
// [END_FILE_MaintenanceEntry.kt]
|
||||
// [END_ENTITY: DataClass('MaintenanceEntry')]
|
||||
// [END_FILE_MaintenanceEntry.kt]
|
||||
@@ -2,15 +2,15 @@
|
||||
// [FILE] PaginationResult.kt
|
||||
// [SEMANTICS] data_structure, generic, pagination
|
||||
package com.homebox.lens.domain.model
|
||||
// [CORE-LOGIC]
|
||||
|
||||
// [ENTITY: DataClass('PaginationResult')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Генерик-класс для представления постраничных результатов от API.
|
||||
* @summary Генерик-класс для представления постраничных результатов от API.
|
||||
* @param T Тип элементов в списке.
|
||||
* @property items Список элементов на текущей странице.
|
||||
* @property page Номер текущей страницы.
|
||||
* @property pageSize Количество элементов на странице.
|
||||
* @property total Общее количество элементов.
|
||||
* @param items Список элементов на текущей странице.
|
||||
* @param page Номер текущей страницы.
|
||||
* @param pageSize Количество элементов на странице.
|
||||
* @param total Общее количество элементов.
|
||||
*/
|
||||
data class PaginationResult<T>(
|
||||
val items: List<T>,
|
||||
@@ -18,4 +18,5 @@ data class PaginationResult<T>(
|
||||
val pageSize: Int,
|
||||
val total: Int
|
||||
)
|
||||
// [END_FILE_PaginationResult.kt]
|
||||
// [END_ENTITY: DataClass('PaginationResult')]
|
||||
// [END_FILE_PaginationResult.kt]
|
||||
@@ -1,28 +1,29 @@
|
||||
// [PACKAGE] com.homebox.lens.domain.model
|
||||
// [FILE] Result.kt
|
||||
|
||||
// [SEMANTICS] domain, model, result
|
||||
package com.homebox.lens.domain.model
|
||||
|
||||
// [CONTRACT]
|
||||
// [ENTITY: SealedClass('Result')]
|
||||
/**
|
||||
* [ENTITY: SealedClass('Result')]
|
||||
* [PURPOSE] Представляет собой результат операции, который может быть либо успешным, либо неуспешным.
|
||||
* @summary Представляет собой результат операции, который может быть либо успешным, либо неуспешным.
|
||||
* @param T Тип данных в случае успеха.
|
||||
*/
|
||||
sealed class Result<out T> {
|
||||
// [ENTITY: DataClass('Success')]
|
||||
/**
|
||||
* [ENTITY: DataClass('Success')]
|
||||
* [PURPOSE] Представляет собой успешный результат операции.
|
||||
* @summary Представляет собой успешный результат операции.
|
||||
* @param data Данные, полученные в результате операции.
|
||||
*/
|
||||
data class Success<out T>(val data: T) : Result<T>()
|
||||
// [END_ENTITY: DataClass('Success')]
|
||||
|
||||
// [ENTITY: DataClass('Error')]
|
||||
/**
|
||||
* [ENTITY: DataClass('Error')]
|
||||
* [PURPOSE] Представляет собой неуспешный результат операции.
|
||||
* @summary Представляет собой неуспешный результат операции.
|
||||
* @param exception Исключение, которое произошло во время операции.
|
||||
*/
|
||||
data class Error(val exception: Exception) : Result<Nothing>()
|
||||
// [END_ENTITY: DataClass('Error')]
|
||||
}
|
||||
|
||||
// [END_FILE_Result.kt]
|
||||
// [END_ENTITY: SealedClass('Result')]
|
||||
// [END_FILE_Result.kt]
|
||||
@@ -1,18 +1,19 @@
|
||||
// [PACKAGE] com.homebox.lens.domain.model
|
||||
// [FILE] Statistics.kt
|
||||
|
||||
// [SEMANTICS] domain, model
|
||||
package com.homebox.lens.domain.model
|
||||
|
||||
// [IMPORTS]
|
||||
import java.math.BigDecimal
|
||||
// [END_IMPORTS]
|
||||
|
||||
// [CONTRACT]
|
||||
// [ENTITY: DataClass('Statistics')]
|
||||
/**
|
||||
* [ENTITY: DataClass('Statistics')]
|
||||
* [PURPOSE] Представляет собой статистику по инвентарю.
|
||||
* @property totalValue Общая стоимость всех вещей.
|
||||
* @property totalItems Общее количество вещей.
|
||||
* @property locations Общее количество местоположений.
|
||||
* @property labels Общее количество меток.
|
||||
* @summary Представляет собой статистику по инвентарю.
|
||||
* @param totalValue Общая стоимость всех вещей.
|
||||
* @param totalItems Общее количество вещей.
|
||||
* @param locations Общее количество местоположений.
|
||||
* @param labels Общее количество меток.
|
||||
*/
|
||||
data class Statistics(
|
||||
val totalValue: BigDecimal,
|
||||
@@ -20,5 +21,6 @@ data class Statistics(
|
||||
val locations: Int,
|
||||
val labels: Int
|
||||
)
|
||||
// [END_ENTITY: DataClass('Statistics')]
|
||||
|
||||
// [END_FILE_Statistics.kt]
|
||||
|
||||
@@ -4,17 +4,16 @@
|
||||
|
||||
package com.homebox.lens.domain.model
|
||||
|
||||
// [ENTITY: DataClass('TokenResponse')]
|
||||
/**
|
||||
* [ENTITY: DataClass('TokenResponse')]
|
||||
* [CONTRACT]
|
||||
* Модель данных, представляющая ответ от сервера с токеном аутентификации.
|
||||
* @property token Строка, содержащая JWT или другой токен доступа.
|
||||
* @summary Модель данных, представляющая ответ от сервера с токеном аутентификации.
|
||||
* @param token Строка, содержащая JWT или другой токен доступа.
|
||||
* @invariant `token` не должен быть пустым.
|
||||
*/
|
||||
data class TokenResponse(val token: String) {
|
||||
init {
|
||||
// [INVARIANT_CHECK]
|
||||
require(token.isNotBlank()) { "[INVARIANT_FAILED] Token cannot be blank." }
|
||||
require(token.isNotBlank()) { "Token cannot be blank." }
|
||||
}
|
||||
}
|
||||
// [END_FILE_TokenResponse.kt]
|
||||
// [END_ENTITY: DataClass('TokenResponse')]
|
||||
// [END_FILE_TokenResponse.kt]
|
||||
|
||||
@@ -8,35 +8,39 @@ package com.homebox.lens.domain.repository
|
||||
import com.homebox.lens.domain.model.Credentials
|
||||
import com.homebox.lens.domain.model.TokenResponse
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
// [END_IMPORTS]
|
||||
|
||||
// [ENTITY: Interface('AuthRepository')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Репозиторий для управления аутентификацией.
|
||||
* [COHERENCE_NOTE] Добавлен метод `login` для инкапсуляции логики входа.
|
||||
* @summary Репозиторий для управления аутентификацией.
|
||||
*/
|
||||
interface AuthRepository {
|
||||
// [ENTITY: Function('login')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Выполняет вход в систему, используя предоставленные учетные данные.
|
||||
* @summary Выполняет вход в систему, используя предоставленные учетные данные.
|
||||
* @param credentials Учетные данные пользователя (URL сервера, логин, пароль).
|
||||
* @return [Result] с [TokenResponse] в случае успеха, или с [Exception] в случае ошибки.
|
||||
* @throws IllegalArgumentException если `credentials` невалидны (предусловие).
|
||||
*/
|
||||
suspend fun login(credentials: Credentials): Result<TokenResponse>
|
||||
// [END_ENTITY: Function('login')]
|
||||
|
||||
// [ENTITY: Function('saveToken')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Сохраняет токен аутентификации.
|
||||
* @summary Сохраняет токен аутентификации.
|
||||
* @param token Токен для сохранения.
|
||||
* @throws IllegalArgumentException если `token` пустой (предусловие).
|
||||
*/
|
||||
suspend fun saveToken(token: String)
|
||||
// [END_ENTITY: Function('saveToken')]
|
||||
|
||||
// [ENTITY: Function('getToken')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Получает токен аутентификации.
|
||||
* @summary Получает токен аутентификации.
|
||||
* @return [Flow], который эммитит токен в виде строки, или `null`, если токен отсутствует.
|
||||
*/
|
||||
fun getToken(): Flow<String?>
|
||||
// [END_ENTITY: Function('getToken')]
|
||||
}
|
||||
// [END_FILE_AuthRepository.kt]
|
||||
// [END_ENTITY: Interface('AuthRepository')]
|
||||
// [END_FILE_AuthRepository.kt]
|
||||
|
||||
@@ -1,44 +1,51 @@
|
||||
// [PACKAGE] com.homebox.lens.domain.repository
|
||||
// [FILE] CredentialsRepository.kt
|
||||
|
||||
// [SEMANTICS] domain, repository, credentials
|
||||
package com.homebox.lens.domain.repository
|
||||
|
||||
// [IMPORTS]
|
||||
import com.homebox.lens.domain.model.Credentials
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
// [END_IMPORTS]
|
||||
|
||||
// [ENTITY: Interface('CredentialsRepository')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Repository for managing user credentials and session tokens.
|
||||
* @summary Repository for managing user credentials and session tokens.
|
||||
*/
|
||||
interface CredentialsRepository {
|
||||
// [ENTITY: Function('saveCredentials')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Saves the user's base credentials (URL, username, password) securely.
|
||||
* @summary Saves the user's base credentials (URL, username, password) securely.
|
||||
* @param credentials The credentials to save.
|
||||
* @sideeffect Overwrites any existing saved credentials.
|
||||
*/
|
||||
suspend fun saveCredentials(credentials: Credentials)
|
||||
// [END_ENTITY: Function('saveCredentials')]
|
||||
|
||||
// [ENTITY: Function('getCredentials')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Retrieves the saved user credentials.
|
||||
* @summary Retrieves the saved user credentials.
|
||||
* @return A Flow emitting the saved [Credentials], or null if none are saved.
|
||||
*/
|
||||
fun getCredentials(): Flow<Credentials?>
|
||||
// [END_ENTITY: Function('getCredentials')]
|
||||
|
||||
// [ENTITY: Function('saveToken')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* [ACTION] Saves the authorization token received after a successful login.
|
||||
* @summary Saves the authorization token received after a successful login.
|
||||
* @param token The authorization token (including "Bearer " prefix if provided by the server).
|
||||
* @sideeffect Overwrites any existing saved token.
|
||||
*/
|
||||
suspend fun saveToken(token: String)
|
||||
// [END_ENTITY: Function('saveToken')]
|
||||
|
||||
// [ENTITY: Function('getToken')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* [ACTION] Retrieves the saved authorization token.
|
||||
* @summary Retrieves the saved authorization token.
|
||||
* @return The saved token as a String, or null if no token is saved.
|
||||
*/
|
||||
suspend fun getToken(): String?
|
||||
// [END_ENTITY: Function('getToken')]
|
||||
}
|
||||
// [END_FILE_CredentialsRepository.kt]
|
||||
// [END_ENTITY: Interface('CredentialsRepository')]
|
||||
// [END_FILE_CredentialsRepository.kt]
|
||||
|
||||
@@ -5,27 +5,122 @@ package com.homebox.lens.domain.repository
|
||||
|
||||
// [IMPORTS]
|
||||
import com.homebox.lens.domain.model.*
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
// [CORE-LOGIC]
|
||||
// [END_IMPORTS]
|
||||
|
||||
// [ENTITY: Interface('ItemRepository')]
|
||||
/**
|
||||
|
||||
[CONTRACT]
|
||||
|
||||
Абстракция репозитория для работы с "Вещами".
|
||||
|
||||
Определяет контракт, которому должен следовать слой данных.
|
||||
*/
|
||||
* @summary Абстракция репозитория для работы с "Вещами".
|
||||
* @description Определяет контракт, которому должен следовать слой данных.
|
||||
*/
|
||||
interface ItemRepository {
|
||||
suspend fun createItem(newItemData: ItemCreate): ItemSummary
|
||||
suspend fun getItemDetails(itemId: String): ItemOut
|
||||
suspend fun updateItem(itemId: String, item: ItemUpdate): ItemOut
|
||||
suspend fun deleteItem(itemId: String)
|
||||
suspend fun syncInventory(page: Int, pageSize: Int): PaginationResult<ItemSummary>
|
||||
suspend fun getStatistics(): GroupStatistics
|
||||
suspend fun getAllLocations(): List<LocationOutCount>
|
||||
suspend fun getAllLabels(): List<LabelOut>
|
||||
suspend fun createLabel(newLabelData: LabelCreate): LabelSummary
|
||||
suspend fun searchItems(query: String): PaginationResult<ItemSummary>
|
||||
fun getRecentlyAddedItems(limit: Int): kotlinx.coroutines.flow.Flow<List<ItemSummary>>
|
||||
// [ENTITY: Function('createItem')]
|
||||
// [RELATION: Function('createItem')] -> [RETURNS] -> [DataClass('ItemSummary')]
|
||||
/**
|
||||
* @summary Создает новый элемент.
|
||||
* @param newItemData Данные для создания нового элемента.
|
||||
* @return Сводка по созданному элементу.
|
||||
*/
|
||||
suspend fun createItem(newItemData: ItemCreate): ItemSummary
|
||||
// [END_ENTITY: Function('createItem')]
|
||||
|
||||
// [ENTITY: Function('getItemDetails')]
|
||||
// [RELATION: Function('getItemDetails')] -> [RETURNS] -> [DataClass('ItemOut')]
|
||||
/**
|
||||
* @summary Получает детальную информацию об элементе.
|
||||
* @param itemId ID элемента.
|
||||
* @return Детальная информация об элементе.
|
||||
*/
|
||||
suspend fun getItemDetails(itemId: String): ItemOut
|
||||
// [END_ENTITY: Function('getItemDetails')]
|
||||
|
||||
// [ENTITY: Function('updateItem')]
|
||||
// [RELATION: Function('updateItem')] -> [RETURNS] -> [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')] -> [RETURNS] -> [DataClass('PaginationResult<ItemSummary>')]
|
||||
/**
|
||||
* @summary Синхронизирует инвентарь.
|
||||
* @param page Номер страницы.
|
||||
* @param pageSize Размер страницы.
|
||||
* @return Результат пагинации со сводкой по элементам.
|
||||
*/
|
||||
suspend fun syncInventory(page: Int, pageSize: Int): PaginationResult<ItemSummary>
|
||||
// [END_ENTITY: Function('syncInventory')]
|
||||
|
||||
// [ENTITY: Function('getStatistics')]
|
||||
// [RELATION: Function('getStatistics')] -> [RETURNS] -> [DataClass('GroupStatistics')]
|
||||
/**
|
||||
* @summary Получает статистику.
|
||||
* @return Статистика по группам.
|
||||
*/
|
||||
suspend fun getStatistics(): GroupStatistics
|
||||
// [END_ENTITY: Function('getStatistics')]
|
||||
|
||||
// [ENTITY: Function('getAllLocations')]
|
||||
// [RELATION: Function('getAllLocations')] -> [RETURNS] -> [DataStructure('List<LocationOutCount>')]
|
||||
/**
|
||||
* @summary Получает все местоположения.
|
||||
* @return Список всех местоположений со счетчиками.
|
||||
*/
|
||||
suspend fun getAllLocations(): List<LocationOutCount>
|
||||
// [END_ENTITY: Function('getAllLocations')]
|
||||
|
||||
// [ENTITY: Function('getAllLabels')]
|
||||
// [RELATION: Function('getAllLabels')] -> [RETURNS] -> [DataStructure('List<LabelOut>')]
|
||||
/**
|
||||
* @summary Получает все метки.
|
||||
* @return Список всех меток.
|
||||
*/
|
||||
suspend fun getAllLabels(): List<LabelOut>
|
||||
// [END_ENTITY: Function('getAllLabels')]
|
||||
|
||||
// [ENTITY: Function('createLabel')]
|
||||
// [RELATION: Function('createLabel')] -> [RETURNS] -> [DataClass('LabelSummary')]
|
||||
/**
|
||||
* @summary Создает новую метку.
|
||||
* @param newLabelData Данные для создания новой метки.
|
||||
* @return Сводка по созданной метке.
|
||||
*/
|
||||
suspend fun createLabel(newLabelData: LabelCreate): LabelSummary
|
||||
// [END_ENTITY: Function('createLabel')]
|
||||
|
||||
// [ENTITY: Function('searchItems')]
|
||||
// [RELATION: Function('searchItems')] -> [RETURNS] -> [DataClass('PaginationResult<ItemSummary>')]
|
||||
/**
|
||||
* @summary Ищет элементы.
|
||||
* @param query Поисковый запрос.
|
||||
* @return Результат пагинации со сводкой по найденным элементам.
|
||||
*/
|
||||
suspend fun searchItems(query: String): PaginationResult<ItemSummary>
|
||||
// [END_ENTITY: Function('searchItems')]
|
||||
|
||||
// [ENTITY: Function('getRecentlyAddedItems')]
|
||||
// [RELATION: Function('getRecentlyAddedItems')] -> [RETURNS] -> [DataStructure('Flow<List<ItemSummary>>')]
|
||||
/**
|
||||
* @summary Получает недавно добавленные элементы.
|
||||
* @param limit Максимальное количество возвращаемых элементов.
|
||||
* @return Поток со списком недавно добавленных элементов.
|
||||
*/
|
||||
fun getRecentlyAddedItems(limit: Int): Flow<List<ItemSummary>>
|
||||
// [END_ENTITY: Function('getRecentlyAddedItems')]
|
||||
}
|
||||
// [END_FILE_ItemRepository.kt]
|
||||
// [END_ENTITY: Interface('ItemRepository')]
|
||||
// [END_FILE_ItemRepository.kt]
|
||||
|
||||
@@ -2,43 +2,41 @@
|
||||
// [FILE] CreateItemUseCase.kt
|
||||
// [SEMANTICS] business_logic, use_case, item_creation
|
||||
|
||||
package com.homebox.lens.domain.usecase
|
||||
|
||||
// [IMPORTS]
|
||||
import com.homebox.lens.domain.model.ItemCreate
|
||||
import com.homebox.lens.domain.model.ItemSummary
|
||||
import com.homebox.lens.domain.repository.ItemRepository
|
||||
import javax.inject.Inject
|
||||
// [END_IMPORTS]
|
||||
|
||||
// [CORE-LOGIC]
|
||||
// [ENTITY: UseCase('CreateItemUseCase')]
|
||||
// [RELATION: UseCase('CreateItemUseCase')] -> [DEPENDS_ON] -> [Interface('ItemRepository')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Use case для создания новой вещи.
|
||||
* @summary Use case для создания новой вещи.
|
||||
* @param itemRepository Репозиторий для работы с данными о вещах.
|
||||
*/
|
||||
class CreateItemUseCase @Inject constructor(
|
||||
private val itemRepository: ItemRepository
|
||||
) {
|
||||
// [ENTITY: Function('invoke')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Выполняет операцию создания вещи.
|
||||
* @summary Выполняет операцию создания вещи.
|
||||
* @param itemCreate Данные для создания новой вещи.
|
||||
* @return Возвращает сокращенную модель созданной вещи.
|
||||
* @throws IllegalArgumentException если название вещи пустое.
|
||||
*/
|
||||
suspend operator fun invoke(itemCreate: ItemCreate): ItemSummary {
|
||||
// [PRECONDITION] Название вещи не может быть пустым.
|
||||
require(itemCreate.name.isNotBlank()) {
|
||||
"[PRECONDITION_FAILED] Item name cannot be blank."
|
||||
}
|
||||
require(itemCreate.name.isNotBlank()) { "Item name cannot be blank." }
|
||||
|
||||
// [ACTION]
|
||||
val result = itemRepository.createItem(itemCreate)
|
||||
|
||||
// [POSTCONDITION] Убеждаемся, что репозиторий вернул результат.
|
||||
check(result != null) {
|
||||
"[POSTCONDITION_FAILED] Repository returned null after creating an item."
|
||||
}
|
||||
check(result != null) { "Repository returned null after creating an item." }
|
||||
|
||||
return result
|
||||
}
|
||||
// [END_ENTITY: Function('invoke')]
|
||||
}
|
||||
// [END_FILE_CreateItemUseCase.kt]
|
||||
// [END_ENTITY: UseCase('CreateItemUseCase')]
|
||||
// [END_FILE_CreateItemUseCase.kt]
|
||||
|
||||
@@ -8,31 +8,31 @@ import com.homebox.lens.domain.model.LabelCreate
|
||||
import com.homebox.lens.domain.model.LabelSummary
|
||||
import com.homebox.lens.domain.repository.ItemRepository
|
||||
import javax.inject.Inject
|
||||
// [END_IMPORTS]
|
||||
|
||||
// [USE_CASE]
|
||||
// [ENTITY: UseCase('CreateLabelUseCase')]
|
||||
// [RELATION: UseCase('CreateLabelUseCase')] -> [DEPENDS_ON] -> [Interface('ItemRepository')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* @summary Сценарий использования для создания новой метки.
|
||||
* @param repository Репозиторий для доступа к данным.
|
||||
*/
|
||||
class CreateLabelUseCase @Inject constructor(
|
||||
private val repository: ItemRepository
|
||||
) {
|
||||
// [ENTITY: Function('invoke')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* @summary Выполняет создание метки.
|
||||
* @param newLabelData Данные для создания новой метки.
|
||||
* @return Возвращает краткую информацию о созданной метке [LabelSummary].
|
||||
* @throws Exception в случае ошибки на уровне репозитория (сеть, API).
|
||||
* @precondition `newLabelData.name` не должен быть пустым.
|
||||
*/
|
||||
// [ENTRYPOINT]
|
||||
suspend operator fun invoke(newLabelData: LabelCreate): LabelSummary {
|
||||
// [PRECONDITION]
|
||||
require(newLabelData.name.isNotBlank()) { "[CONTRACT_VIOLATION] Label name cannot be blank." }
|
||||
require(newLabelData.name.isNotBlank()) { "Label name cannot be blank." }
|
||||
|
||||
// [ACTION]
|
||||
return repository.createLabel(newLabelData)
|
||||
}
|
||||
// [END_ENTITY: Function('invoke')]
|
||||
}
|
||||
// [END_FILE_CreateLabelUseCase.kt]
|
||||
// [END_ENTITY: UseCase('CreateLabelUseCase')]
|
||||
// [END_FILE_CreateLabelUseCase.kt]
|
||||
|
||||
@@ -2,33 +2,34 @@
|
||||
// [FILE] DeleteItemUseCase.kt
|
||||
// [SEMANTICS] business_logic, use_case, item_deletion
|
||||
|
||||
package com.homebox.lens.domain.usecase
|
||||
|
||||
// [IMPORTS]
|
||||
import com.homebox.lens.domain.repository.ItemRepository
|
||||
import javax.inject.Inject
|
||||
// [END_IMPORTS]
|
||||
|
||||
// [CORE-LOGIC]
|
||||
// [ENTITY: UseCase('DeleteItemUseCase')]
|
||||
// [RELATION: UseCase('DeleteItemUseCase')] -> [DEPENDS_ON] -> [Interface('ItemRepository')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Use case для удаления вещи.
|
||||
* @summary Use case для удаления вещи.
|
||||
* @param itemRepository Репозиторий для работы с данными о вещах.
|
||||
*/
|
||||
class DeleteItemUseCase @Inject constructor(
|
||||
private val itemRepository: ItemRepository
|
||||
) {
|
||||
// [ENTITY: Function('invoke')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Выполняет операцию удаления вещи.
|
||||
* @summary Выполняет операцию удаления вещи.
|
||||
* @param itemId ID удаляемой вещи.
|
||||
* @throws IllegalArgumentException если ID вещи пустое.
|
||||
*/
|
||||
suspend operator fun invoke(itemId: String) {
|
||||
// [PRECONDITION] ID не может быть пустым.
|
||||
require(itemId.isNotBlank()) {
|
||||
"[PRECONDITION_FAILED] Item ID cannot be blank."
|
||||
}
|
||||
require(itemId.isNotBlank()) { "Item ID cannot be blank." }
|
||||
|
||||
// [ACTION]
|
||||
itemRepository.deleteItem(itemId)
|
||||
}
|
||||
// [END_ENTITY: Function('invoke')]
|
||||
}
|
||||
// [END_FILE_DeleteItemUseCase.kt]
|
||||
// [END_ENTITY: UseCase('DeleteItemUseCase')]
|
||||
// [END_FILE_DeleteItemUseCase.kt]
|
||||
|
||||
@@ -1,21 +1,31 @@
|
||||
// [PACKAGE] com.homebox.lens.domain.usecase
|
||||
// [FILE] GetAllLabelsUseCase.kt
|
||||
|
||||
// [SEMANTICS] domain, usecase
|
||||
package com.homebox.lens.domain.usecase
|
||||
|
||||
// [IMPORTS]
|
||||
import com.homebox.lens.domain.model.LabelOut
|
||||
import com.homebox.lens.domain.repository.ItemRepository
|
||||
import javax.inject.Inject
|
||||
// [END_IMPORTS]
|
||||
|
||||
// [ENTITY: UseCase('GetAllLabelsUseCase')]
|
||||
// [RELATION: UseCase('GetAllLabelsUseCase')] -> [DEPENDS_ON] -> [Repository('ItemRepository')]
|
||||
class GetAllLabelsUseCase @Inject constructor(private val repository: ItemRepository) {
|
||||
|
||||
// [ENTITY: Function('invoke')]
|
||||
// [RELATION: Function('invoke')] -> [RETURNS] -> [DataStructure('List<LabelOut>')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Получает список всех меток.
|
||||
* @summary Получает список всех меток.
|
||||
* @return Список [LabelOut].
|
||||
* @throws Exception в случае ошибки сети или API.
|
||||
* @sideeffect Отсутствуют.
|
||||
*/
|
||||
suspend operator fun invoke(): List<LabelOut> {
|
||||
// [FIX] Упрощено.
|
||||
// [AI_NOTE]: Упрощено.
|
||||
return repository.getAllLabels()
|
||||
}
|
||||
}
|
||||
// [END_ENTITY: Function('invoke')]
|
||||
}
|
||||
// [END_ENTITY: UseCase('GetAllLabelsUseCase')]
|
||||
// [END_FILE_GetAllLabelsUseCase.kt]
|
||||
|
||||
@@ -1,21 +1,31 @@
|
||||
// [PACKAGE] com.homebox.lens.domain.usecase
|
||||
// [FILE] GetAllLocationsUseCase.kt
|
||||
|
||||
// [SEMANTICS] domain, usecase
|
||||
package com.homebox.lens.domain.usecase
|
||||
|
||||
// [IMPORTS]
|
||||
import com.homebox.lens.domain.model.LocationOutCount
|
||||
import com.homebox.lens.domain.repository.ItemRepository
|
||||
import javax.inject.Inject
|
||||
// [END_IMPORTS]
|
||||
|
||||
// [ENTITY: UseCase('GetAllLocationsUseCase')]
|
||||
// [RELATION: UseCase('GetAllLocationsUseCase')] -> [DEPENDS_ON] -> [Repository('ItemRepository')]
|
||||
class GetAllLocationsUseCase @Inject constructor(private val repository: ItemRepository) {
|
||||
|
||||
// [ENTITY: Function('invoke')]
|
||||
// [RELATION: Function('invoke')] -> [RETURNS] -> [DataStructure('List<LocationOutCount>')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Получает список всех локаций.
|
||||
* @summary Получает список всех локаций.
|
||||
* @return Список [LocationOutCount].
|
||||
* @throws Exception в случае ошибки сети или API.
|
||||
* @sideeffect Отсутствуют.
|
||||
*/
|
||||
suspend operator fun invoke(): List<LocationOutCount> {
|
||||
// [FIX] Упрощено.
|
||||
// [AI_NOTE]: Упрощено.
|
||||
return repository.getAllLocations()
|
||||
}
|
||||
}
|
||||
// [END_ENTITY: Function('invoke')]
|
||||
}
|
||||
// [END_ENTITY: UseCase('GetAllLocationsUseCase')]
|
||||
// [END_FILE_GetAllLocationsUseCase.kt]
|
||||
|
||||
@@ -2,42 +2,40 @@
|
||||
// [FILE] GetItemDetailsUseCase.kt
|
||||
// [SEMANTICS] business_logic, use_case, item_retrieval
|
||||
|
||||
package com.homebox.lens.domain.usecase
|
||||
|
||||
// [IMPORTS]
|
||||
import com.homebox.lens.domain.model.ItemOut
|
||||
import com.homebox.lens.domain.repository.ItemRepository
|
||||
import javax.inject.Inject
|
||||
// [END_IMPORTS]
|
||||
|
||||
// [CORE-LOGIC]
|
||||
// [ENTITY: UseCase('GetItemDetailsUseCase')]
|
||||
// [RELATION: UseCase('GetItemDetailsUseCase')] -> [DEPENDS_ON] -> [Interface('ItemRepository')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Use case для получения детальной информации о вещи.
|
||||
* @summary Use case для получения детальной информации о вещи.
|
||||
* @param itemRepository Репозиторий для работы с данными о вещах.
|
||||
*/
|
||||
class GetItemDetailsUseCase @Inject constructor(
|
||||
private val itemRepository: ItemRepository
|
||||
) {
|
||||
// [ENTITY: Function('invoke')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Выполняет операцию получения детальной информации о вещи.
|
||||
* @summary Выполняет операцию получения детальной информации о вещи.
|
||||
* @param itemId ID запрашиваемой вещи.
|
||||
* @return Возвращает полную модель вещи.
|
||||
* @throws IllegalArgumentException если ID вещи пустое.
|
||||
*/
|
||||
suspend operator fun invoke(itemId: String): ItemOut {
|
||||
// [PRECONDITION] ID не может быть пустым.
|
||||
require(itemId.isNotBlank()) {
|
||||
"[PRECONDITION_FAILED] Item ID cannot be blank."
|
||||
}
|
||||
require(itemId.isNotBlank()) { "Item ID cannot be blank." }
|
||||
|
||||
// [ACTION]
|
||||
val result = itemRepository.getItemDetails(itemId)
|
||||
|
||||
// [POSTCONDITION] Убеждаемся, что репозиторий вернул результат.
|
||||
check(result != null) {
|
||||
"[POSTCONDITION_FAILED] Repository returned null for item ID: $itemId"
|
||||
}
|
||||
check(result != null) { "Repository returned null for item ID: $itemId" }
|
||||
|
||||
return result
|
||||
}
|
||||
// [END_ENTITY: Function('invoke')]
|
||||
}
|
||||
// [END_FILE_GetItemDetailsUseCase.kt]
|
||||
// [END_ENTITY: UseCase('GetItemDetailsUseCase')]
|
||||
// [END_FILE_GetItemDetailsUseCase.kt]
|
||||
|
||||
@@ -1,33 +1,39 @@
|
||||
// [PACKAGE] com.homebox.lens.domain.usecase
|
||||
// [FILE] GetRecentlyAddedItemsUseCase.kt
|
||||
|
||||
// [SEMANTICS] domain, usecase
|
||||
package com.homebox.lens.domain.usecase
|
||||
|
||||
// [IMPORTS]
|
||||
import com.homebox.lens.domain.model.ItemSummary
|
||||
import com.homebox.lens.domain.repository.ItemRepository
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import javax.inject.Inject
|
||||
// [END_IMPORTS]
|
||||
|
||||
// [ENTITY: UseCase('GetRecentlyAddedItemsUseCase')]
|
||||
// [RELATION: UseCase('GetRecentlyAddedItemsUseCase')] -> [DEPENDS_ON] -> [Repository('ItemRepository')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Сценарий использования для получения списка недавно добавленных товаров.
|
||||
*
|
||||
* @summary Сценарий использования для получения списка недавно добавленных товаров.
|
||||
* @param itemRepository Репозиторий для доступа к данным о товарах.
|
||||
* @return Поток (Flow), содержащий список [ItemSummary].
|
||||
* @precondition Количество запрашиваемых элементов (limit) должно быть положительным.
|
||||
* @postcondition Возвращает Flow со списком товаров, отсортированных по дате создания в порядке убывания.
|
||||
* Если товаров нет, возвращает пустой список.
|
||||
*/
|
||||
class GetRecentlyAddedItemsUseCase @Inject constructor(
|
||||
private val itemRepository: ItemRepository
|
||||
) {
|
||||
// [ACTION]
|
||||
// [ENTITY: Function('invoke')]
|
||||
// [RELATION: Function('invoke')] -> [RETURNS] -> [DataStructure('Flow<List<ItemSummary>>')]
|
||||
/**
|
||||
* @summary Возвращает поток (Flow) со списком недавно добавленных товаров.
|
||||
* @param limit Количество запрашиваемых элементов.
|
||||
* @return Поток (Flow), содержащий список [ItemSummary].
|
||||
* @precondition Количество запрашиваемых элементов (limit) должно быть положительным.
|
||||
* @postcondition Возвращает Flow со списком товаров, отсортированных по дате создания в порядке убывания. Если товаров нет, возвращает пустой список.
|
||||
* @sideeffect Отсутствуют.
|
||||
*/
|
||||
operator fun invoke(limit: Int): Flow<List<ItemSummary>> {
|
||||
// [PRECONDITION]
|
||||
require(limit > 0) { "[PRECONDITION_FAILED] Limit must be positive." }
|
||||
|
||||
// [CORE-LOGIC]
|
||||
require(limit > 0) { "Limit must be positive." }
|
||||
return itemRepository.getRecentlyAddedItems(limit)
|
||||
}
|
||||
// [END_ENTITY: Function('invoke')]
|
||||
}
|
||||
// [END_FILE_GetRecentlyAddedItemsUseCase.kt]
|
||||
// [END_ENTITY: UseCase('GetRecentlyAddedItemsUseCase')]
|
||||
// [END_FILE_GetRecentlyAddedItemsUseCase.kt]
|
||||
@@ -1,22 +1,31 @@
|
||||
// [PACKAGE] com.homebox.lens.domain.usecase
|
||||
// [FILE] GetStatisticsUseCase.kt
|
||||
|
||||
// [SEMANTICS] domain, usecase
|
||||
package com.homebox.lens.domain.usecase
|
||||
|
||||
// [IMPORTS]
|
||||
import com.homebox.lens.domain.model.GroupStatistics
|
||||
import com.homebox.lens.domain.repository.ItemRepository
|
||||
import javax.inject.Inject
|
||||
// [END_IMPORTS]
|
||||
|
||||
// [ENTITY: UseCase('GetStatisticsUseCase')]
|
||||
// [RELATION: UseCase('GetStatisticsUseCase')] -> [DEPENDS_ON] -> [Repository('ItemRepository')]
|
||||
class GetStatisticsUseCase @Inject constructor(private val repository: ItemRepository) {
|
||||
|
||||
// [ENTITY: Function('invoke')]
|
||||
// [RELATION: Function('invoke')] -> [RETURNS] -> [DataClass('GroupStatistics')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Получает статистику инвентаря.
|
||||
* @summary Получает статистику инвентаря.
|
||||
* @return [GroupStatistics] объект.
|
||||
* @throws Exception в случае ошибки сети или API.
|
||||
* @sideeffect Отсутствуют.
|
||||
*/
|
||||
suspend operator fun invoke(): GroupStatistics {
|
||||
// [FIX] Упрощено. Просто вызываем репозиторий и возвращаем его результат.
|
||||
// Обработка ошибок делегирована вызывающей стороне (ViewModel).
|
||||
// [AI_NOTE]: Упрощено. Просто вызываем репозиторий и возвращаем его результат. Обработка ошибок делегирована вызывающей стороне (ViewModel).
|
||||
return repository.getStatistics()
|
||||
}
|
||||
}
|
||||
// [END_ENTITY: Function('invoke')]
|
||||
}
|
||||
// [END_ENTITY: UseCase('GetStatisticsUseCase')]
|
||||
// [END_FILE_GetStatisticsUseCase.kt]
|
||||
|
||||
@@ -1,52 +1,49 @@
|
||||
// [PACKAGE] com.homebox.lens.domain.usecase
|
||||
// [FILE] LoginUseCase.kt
|
||||
// [PURPOSE] Инкапсулирует бизнес-логику процесса входа пользователя в систему.
|
||||
// [SEMANTICS] domain, usecase, authentication
|
||||
package com.homebox.lens.domain.usecase
|
||||
|
||||
// [IMPORTS]
|
||||
import com.homebox.lens.domain.model.Credentials
|
||||
import com.homebox.lens.domain.model.TokenResponse
|
||||
import com.homebox.lens.domain.repository.AuthRepository
|
||||
import javax.inject.Inject
|
||||
// [END_IMPORTS]
|
||||
|
||||
// [ENTITY: UseCase('LoginUseCase')]
|
||||
// [RELATION: UseCase('LoginUseCase')] -> [DEPENDS_ON] -> [Interface('AuthRepository')]
|
||||
/**
|
||||
* [ENTITY: Class('LoginUseCase')]
|
||||
* [CONTRACT]
|
||||
* Use case для выполнения входа пользователя.
|
||||
* @summary Use case для выполнения входа пользователя.
|
||||
* @param authRepository Репозиторий для выполнения сетевого запроса на вход и сохранения токена.
|
||||
* [COHERENCE_NOTE] Удалена зависимость от CredentialsRepository для сохранения токена.
|
||||
* Эту ответственность теперь несет AuthRepository.
|
||||
*/
|
||||
class LoginUseCase @Inject constructor(
|
||||
private val authRepository: AuthRepository
|
||||
) {
|
||||
// [ENTITY: Function('invoke')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Выполняет процесс входа в систему.
|
||||
* @summary Выполняет процесс входа в систему.
|
||||
* @param credentials Учетные данные пользователя.
|
||||
* @return [Result] с [Unit] в случае успеха или с [Exception] в случае ошибки.
|
||||
* @sideeffect В случае успеха, сохраняет токен авторизации через `authRepository`.
|
||||
*/
|
||||
suspend operator fun invoke(credentials: Credentials): Result<Unit> {
|
||||
// [PRECONDITION]
|
||||
require(credentials.serverUrl.isNotBlank() && credentials.username.isNotBlank()) {
|
||||
"[PRECONDITION_FAILED] Server URL and username must not be blank."
|
||||
"Server URL and username must not be blank."
|
||||
}
|
||||
|
||||
// [ACTION] Выполняем вход через authRepository.
|
||||
val loginResult: Result<TokenResponse> = authRepository.login(credentials)
|
||||
|
||||
// [CORE-LOGIC] Обрабатываем результат с помощью `fold`.
|
||||
return loginResult.fold(
|
||||
onSuccess = { tokenResponse ->
|
||||
// [ACTION] В случае успеха, сохраняем токен через тот же репозиторий.
|
||||
authRepository.saveToken(tokenResponse.token)
|
||||
onSuccess = {
|
||||
authRepository.saveToken(it.token)
|
||||
Result.success(Unit)
|
||||
},
|
||||
onFailure = { exception ->
|
||||
// [ACTION] В случае ошибки, просто пробрасываем ее дальше.
|
||||
Result.failure(exception)
|
||||
onFailure = {
|
||||
Result.failure(it)
|
||||
}
|
||||
)
|
||||
}
|
||||
// [END_ENTITY: Function('invoke')]
|
||||
}
|
||||
// [END_FILE_LoginUseCase.kt]
|
||||
// [END_ENTITY: UseCase('LoginUseCase')]
|
||||
// [END_FILE_LoginUseCase.kt]
|
||||
|
||||
@@ -2,31 +2,34 @@
|
||||
// [FILE] SearchItemsUseCase.kt
|
||||
// [SEMANTICS] business_logic, use_case, search
|
||||
|
||||
package com.homebox.lens.domain.usecase
|
||||
|
||||
// [IMPORTS]
|
||||
import com.homebox.lens.domain.model.ItemSummary
|
||||
import com.homebox.lens.domain.model.PaginationResult
|
||||
import com.homebox.lens.domain.repository.ItemRepository
|
||||
import javax.inject.Inject
|
||||
// [END_IMPORTS]
|
||||
|
||||
// [CORE-LOGIC]
|
||||
// [ENTITY: UseCase('SearchItemsUseCase')]
|
||||
// [RELATION: UseCase('SearchItemsUseCase')] -> [DEPENDS_ON] -> [Interface('ItemRepository')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Use case для поиска вещей по текстовому запросу.
|
||||
* @summary Use case для поиска вещей по текстовому запросу.
|
||||
* @param itemRepository Репозиторий для работы с данными.
|
||||
*/
|
||||
class SearchItemsUseCase @Inject constructor(
|
||||
private val itemRepository: ItemRepository
|
||||
) {
|
||||
// [ENTITY: Function('invoke')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Выполняет операцию поиска.
|
||||
* @summary Выполняет операцию поиска.
|
||||
* @param query Поисковый запрос.
|
||||
* @return Возвращает объект с результатами пагинации.
|
||||
*/
|
||||
suspend operator fun invoke(query: String): PaginationResult<ItemSummary> {
|
||||
// [ACTION]
|
||||
// Поисковый запрос может быть пустым, сервер обработает это как запрос всех элементов.
|
||||
return itemRepository.searchItems(query)
|
||||
}
|
||||
// [END_ENTITY: Function('invoke')]
|
||||
}
|
||||
// [END_FILE_SearchItemsUseCase.kt]
|
||||
// [END_ENTITY: UseCase('SearchItemsUseCase')]
|
||||
// [END_FILE_SearchItemsUseCase.kt]
|
||||
|
||||
@@ -2,37 +2,38 @@
|
||||
// [FILE] SyncInventoryUseCase.kt
|
||||
// [SEMANTICS] business_logic, use_case, data_sync
|
||||
|
||||
package com.homebox.lens.domain.usecase
|
||||
|
||||
// [IMPORTS]
|
||||
import com.homebox.lens.domain.model.ItemSummary
|
||||
import com.homebox.lens.domain.model.PaginationResult
|
||||
import com.homebox.lens.domain.repository.ItemRepository
|
||||
import javax.inject.Inject
|
||||
// [END_IMPORTS]
|
||||
|
||||
// [CORE-LOGIC]
|
||||
// [ENTITY: UseCase('SyncInventoryUseCase')]
|
||||
// [RELATION: UseCase('SyncInventoryUseCase')] -> [DEPENDS_ON] -> [Interface('ItemRepository')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Use case для синхронизации (получения) списка вещей.
|
||||
* @summary Use case для синхронизации (получения) списка вещей.
|
||||
* @param itemRepository Репозиторий для работы с данными о вещах.
|
||||
*/
|
||||
class SyncInventoryUseCase @Inject constructor(
|
||||
private val itemRepository: ItemRepository
|
||||
) {
|
||||
// [ENTITY: Function('invoke')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Выполняет операцию получения страницы со списком вещей.
|
||||
* @summary Выполняет операцию получения страницы со списком вещей.
|
||||
* @param page Номер страницы.
|
||||
* @param pageSize Размер страницы.
|
||||
* @return Возвращает объект с результатами пагинации.
|
||||
* @throws IllegalArgumentException если параметры пагинации некорректны.
|
||||
*/
|
||||
suspend operator fun invoke(page: Int, pageSize: Int): PaginationResult<ItemSummary> {
|
||||
// [PRECONDITION] Параметры пагинации должны быть положительными.
|
||||
require(page > 0 && pageSize > 0) {
|
||||
"[PRECONDITION_FAILED] Page and pageSize must be positive."
|
||||
}
|
||||
require(page > 0 && pageSize > 0) { "Page and pageSize must be positive." }
|
||||
|
||||
// [ACTION]
|
||||
return itemRepository.syncInventory(page, pageSize)
|
||||
}
|
||||
// [END_ENTITY: Function('invoke')]
|
||||
}
|
||||
// [END_FILE_SyncInventoryUseCase.kt]
|
||||
// [END_ENTITY: UseCase('SyncInventoryUseCase')]
|
||||
// [END_FILE_SyncInventoryUseCase.kt]
|
||||
|
||||
@@ -2,44 +2,42 @@
|
||||
// [FILE] UpdateItemUseCase.kt
|
||||
// [SEMANTICS] business_logic, use_case, item_update
|
||||
|
||||
package com.homebox.lens.domain.usecase
|
||||
|
||||
// [IMPORTS]
|
||||
import com.homebox.lens.domain.model.ItemOut
|
||||
import com.homebox.lens.domain.model.ItemUpdate
|
||||
import com.homebox.lens.domain.repository.ItemRepository
|
||||
import javax.inject.Inject
|
||||
// [END_IMPORTS]
|
||||
|
||||
// [CORE-LOGIC]
|
||||
// [ENTITY: UseCase('UpdateItemUseCase')]
|
||||
// [RELATION: UseCase('UpdateItemUseCase')] -> [DEPENDS_ON] -> [Interface('ItemRepository')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Use case для обновления существующей вещи.
|
||||
* @summary Use case для обновления существующей вещи.
|
||||
* @param itemRepository Репозиторий для работы с данными о вещах.
|
||||
*/
|
||||
class UpdateItemUseCase @Inject constructor(
|
||||
private val itemRepository: ItemRepository
|
||||
) {
|
||||
// [ENTITY: Function('invoke')]
|
||||
/**
|
||||
* [CONTRACT]
|
||||
* Выполняет операцию обновления вещи.
|
||||
* @summary Выполняет операцию обновления вещи.
|
||||
* @param itemId ID обновляемой вещи.
|
||||
* @param itemUpdate Данные для обновления.
|
||||
* @return Возвращает обновленную полную модель вещи.
|
||||
* @throws IllegalArgumentException если ID вещи пустое.
|
||||
*/
|
||||
suspend operator fun invoke(itemId: String, itemUpdate: ItemUpdate): ItemOut {
|
||||
// [PRECONDITION] ID не может быть пустым.
|
||||
require(itemId.isNotBlank()) {
|
||||
"[PRECONDITION_FAILED] Item ID cannot be blank."
|
||||
}
|
||||
require(itemId.isNotBlank()) { "Item ID cannot be blank." }
|
||||
|
||||
// [ACTION]
|
||||
val result = itemRepository.updateItem(itemId, itemUpdate)
|
||||
|
||||
// [POSTCONDITION] Убеждаемся, что репозиторий вернул результат.
|
||||
check(result != null) {
|
||||
"[POSTCONDITION_FAILED] Repository returned null after updating item ID: $itemId"
|
||||
}
|
||||
check(result != null) { "Repository returned null after updating item ID: $itemId" }
|
||||
|
||||
return result
|
||||
}
|
||||
// [END_ENTITY: Function('invoke')]
|
||||
}
|
||||
// [END_FILE_UpdateItemUseCase.kt]
|
||||
// [END_ENTITY: UseCase('UpdateItemUseCase')]
|
||||
// [END_FILE_UpdateItemUseCase.kt]
|
||||
|
||||
Reference in New Issue
Block a user