diff --git a/.gitignore b/.gitignore
index 0a3d57d..c750f9b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,34 +1,2 @@
-# Gradle
-.gradle/
-build/
-!gradle/wrapper/gradle-wrapper.jar
-
-# Local configuration
-local.properties
-
-# IDE files
-.idea/
-*.iml
-*.ipr
-*.iws
-.DS_Store
-
-# Keystore files
-*.jks
-*.keystore
-
-# Google Services
-app/google-services.json
-
-# Captures
-captures/
-*.apk
-*.aab
-output.json
-
-# Log files
-*.log
-
-# Gemini files
-GEMINI.md
-tech_spec/
+# Hprof files
+*.hprof
\ No newline at end of file
diff --git a/app/src/main/java/com/homebox/lens/ui/screen/inventorylist/InventoryListScreen.kt b/app/src/main/java/com/homebox/lens/ui/screen/inventorylist/InventoryListScreen.kt
new file mode 100644
index 0000000..3ee5bf8
--- /dev/null
+++ b/app/src/main/java/com/homebox/lens/ui/screen/inventorylist/InventoryListScreen.kt
@@ -0,0 +1,22 @@
+// [PACKAGE] com.homebox.lens.ui.screen.inventorylist
+// [FILE] InventoryListScreen.kt
+
+package com.homebox.lens.ui.screen.inventorylist
+
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.tooling.preview.Preview
+
+// [ENTRYPOINT]
+@Composable
+fun InventoryListScreen() {
+ // [ACTION]
+ Text(text = "Inventory List Screen")
+}
+
+@Preview(showBackground = true)
+@Composable
+fun InventoryListScreenPreview() {
+ InventoryListScreen()
+}
+// [END_FILE_InventoryListScreen.kt]
diff --git a/app/src/main/java/com/homebox/lens/ui/screen/inventorylist/InventoryListViewModel.kt b/app/src/main/java/com/homebox/lens/ui/screen/inventorylist/InventoryListViewModel.kt
new file mode 100644
index 0000000..69069d6
--- /dev/null
+++ b/app/src/main/java/com/homebox/lens/ui/screen/inventorylist/InventoryListViewModel.kt
@@ -0,0 +1,16 @@
+// [PACKAGE] com.homebox.lens.ui.screen.inventorylist
+// [FILE] InventoryListViewModel.kt
+
+package com.homebox.lens.ui.screen.inventorylist
+
+import androidx.lifecycle.ViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+// [VIEWMODEL]
+@HiltViewModel
+class InventoryListViewModel @Inject constructor() : ViewModel() {
+ // [STATE]
+ // TODO: Implement UI state
+}
+// [END_FILE_InventoryListViewModel.kt]
diff --git a/app/src/main/java/com/homebox/lens/ui/screen/itemdetails/ItemDetailsScreen.kt b/app/src/main/java/com/homebox/lens/ui/screen/itemdetails/ItemDetailsScreen.kt
new file mode 100644
index 0000000..0222537
--- /dev/null
+++ b/app/src/main/java/com/homebox/lens/ui/screen/itemdetails/ItemDetailsScreen.kt
@@ -0,0 +1,22 @@
+// [PACKAGE] com.homebox.lens.ui.screen.itemdetails
+// [FILE] ItemDetailsScreen.kt
+
+package com.homebox.lens.ui.screen.itemdetails
+
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.tooling.preview.Preview
+
+// [ENTRYPOINT]
+@Composable
+fun ItemDetailsScreen() {
+ // [ACTION]
+ Text(text = "Item Details Screen")
+}
+
+@Preview(showBackground = true)
+@Composable
+fun ItemDetailsScreenPreview() {
+ ItemDetailsScreen()
+}
+// [END_FILE_ItemDetailsScreen.kt]
diff --git a/app/src/main/java/com/homebox/lens/ui/screen/itemdetails/ItemDetailsViewModel.kt b/app/src/main/java/com/homebox/lens/ui/screen/itemdetails/ItemDetailsViewModel.kt
new file mode 100644
index 0000000..6a591a8
--- /dev/null
+++ b/app/src/main/java/com/homebox/lens/ui/screen/itemdetails/ItemDetailsViewModel.kt
@@ -0,0 +1,16 @@
+// [PACKAGE] com.homebox.lens.ui.screen.itemdetails
+// [FILE] ItemDetailsViewModel.kt
+
+package com.homebox.lens.ui.screen.itemdetails
+
+import androidx.lifecycle.ViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+// [VIEWMODEL]
+@HiltViewModel
+class ItemDetailsViewModel @Inject constructor() : ViewModel() {
+ // [STATE]
+ // TODO: Implement UI state
+}
+// [END_FILE_ItemDetailsViewModel.kt]
diff --git a/app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditScreen.kt b/app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditScreen.kt
new file mode 100644
index 0000000..4421b85
--- /dev/null
+++ b/app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditScreen.kt
@@ -0,0 +1,22 @@
+// [PACKAGE] com.homebox.lens.ui.screen.itemedit
+// [FILE] ItemEditScreen.kt
+
+package com.homebox.lens.ui.screen.itemedit
+
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.tooling.preview.Preview
+
+// [ENTRYPOINT]
+@Composable
+fun ItemEditScreen() {
+ // [ACTION]
+ Text(text = "Item Edit Screen")
+}
+
+@Preview(showBackground = true)
+@Composable
+fun ItemEditScreenPreview() {
+ ItemEditScreen()
+}
+// [END_FILE_ItemEditScreen.kt]
diff --git a/app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditViewModel.kt b/app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditViewModel.kt
new file mode 100644
index 0000000..975f01d
--- /dev/null
+++ b/app/src/main/java/com/homebox/lens/ui/screen/itemedit/ItemEditViewModel.kt
@@ -0,0 +1,16 @@
+// [PACKAGE] com.homebox.lens.ui.screen.itemedit
+// [FILE] ItemEditViewModel.kt
+
+package com.homebox.lens.ui.screen.itemedit
+
+import androidx.lifecycle.ViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+// [VIEWMODEL]
+@HiltViewModel
+class ItemEditViewModel @Inject constructor() : ViewModel() {
+ // [STATE]
+ // TODO: Implement UI state
+}
+// [END_FILE_ItemEditViewModel.kt]
diff --git a/app/src/main/java/com/homebox/lens/ui/screen/labelslist/LabelsListScreen.kt b/app/src/main/java/com/homebox/lens/ui/screen/labelslist/LabelsListScreen.kt
new file mode 100644
index 0000000..a9f2978
--- /dev/null
+++ b/app/src/main/java/com/homebox/lens/ui/screen/labelslist/LabelsListScreen.kt
@@ -0,0 +1,22 @@
+// [PACKAGE] com.homebox.lens.ui.screen.labelslist
+// [FILE] LabelsListScreen.kt
+
+package com.homebox.lens.ui.screen.labelslist
+
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.tooling.preview.Preview
+
+// [ENTRYPOINT]
+@Composable
+fun LabelsListScreen() {
+ // [ACTION]
+ Text(text = "Labels List Screen")
+}
+
+@Preview(showBackground = true)
+@Composable
+fun LabelsListScreenPreview() {
+ LabelsListScreen()
+}
+// [END_FILE_LabelsListScreen.kt]
diff --git a/app/src/main/java/com/homebox/lens/ui/screen/labelslist/LabelsListViewModel.kt b/app/src/main/java/com/homebox/lens/ui/screen/labelslist/LabelsListViewModel.kt
new file mode 100644
index 0000000..b09f0a4
--- /dev/null
+++ b/app/src/main/java/com/homebox/lens/ui/screen/labelslist/LabelsListViewModel.kt
@@ -0,0 +1,16 @@
+// [PACKAGE] com.homebox.lens.ui.screen.labelslist
+// [FILE] LabelsListViewModel.kt
+
+package com.homebox.lens.ui.screen.labelslist
+
+import androidx.lifecycle.ViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+// [VIEWMODEL]
+@HiltViewModel
+class LabelsListViewModel @Inject constructor() : ViewModel() {
+ // [STATE]
+ // TODO: Implement UI state
+}
+// [END_FILE_LabelsListViewModel.kt]
diff --git a/app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListScreen.kt b/app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListScreen.kt
new file mode 100644
index 0000000..63940a2
--- /dev/null
+++ b/app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListScreen.kt
@@ -0,0 +1,22 @@
+// [PACKAGE] com.homebox.lens.ui.screen.locationslist
+// [FILE] LocationsListScreen.kt
+
+package com.homebox.lens.ui.screen.locationslist
+
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.tooling.preview.Preview
+
+// [ENTRYPOINT]
+@Composable
+fun LocationsListScreen() {
+ // [ACTION]
+ Text(text = "Locations List Screen")
+}
+
+@Preview(showBackground = true)
+@Composable
+fun LocationsListScreenPreview() {
+ LocationsListScreen()
+}
+// [END_FILE_LocationsListScreen.kt]
diff --git a/app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListViewModel.kt b/app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListViewModel.kt
new file mode 100644
index 0000000..90a1dec
--- /dev/null
+++ b/app/src/main/java/com/homebox/lens/ui/screen/locationslist/LocationsListViewModel.kt
@@ -0,0 +1,16 @@
+// [PACKAGE] com.homebox.lens.ui.screen.locationslist
+// [FILE] LocationsListViewModel.kt
+
+package com.homebox.lens.ui.screen.locationslist
+
+import androidx.lifecycle.ViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+// [VIEWMODEL]
+@HiltViewModel
+class LocationsListViewModel @Inject constructor() : ViewModel() {
+ // [STATE]
+ // TODO: Implement UI state
+}
+// [END_FILE_LocationsListViewModel.kt]
diff --git a/app/src/main/java/com/homebox/lens/ui/screen/search/SearchScreen.kt b/app/src/main/java/com/homebox/lens/ui/screen/search/SearchScreen.kt
new file mode 100644
index 0000000..4d355bd
--- /dev/null
+++ b/app/src/main/java/com/homebox/lens/ui/screen/search/SearchScreen.kt
@@ -0,0 +1,22 @@
+// [PACKAGE] com.homebox.lens.ui.screen.search
+// [FILE] SearchScreen.kt
+
+package com.homebox.lens.ui.screen.search
+
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.tooling.preview.Preview
+
+// [ENTRYPOINT]
+@Composable
+fun SearchScreen() {
+ // [ACTION]
+ Text(text = "Search Screen")
+}
+
+@Preview(showBackground = true)
+@Composable
+fun SearchScreenPreview() {
+ SearchScreen()
+}
+// [END_FILE_SearchScreen.kt]
diff --git a/app/src/main/java/com/homebox/lens/ui/screen/search/SearchViewModel.kt b/app/src/main/java/com/homebox/lens/ui/screen/search/SearchViewModel.kt
new file mode 100644
index 0000000..3e013cb
--- /dev/null
+++ b/app/src/main/java/com/homebox/lens/ui/screen/search/SearchViewModel.kt
@@ -0,0 +1,16 @@
+// [PACKAGE] com.homebox.lens.ui.screen.search
+// [FILE] SearchViewModel.kt
+
+package com.homebox.lens.ui.screen.search
+
+import androidx.lifecycle.ViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+// [VIEWMODEL]
+@HiltViewModel
+class SearchViewModel @Inject constructor() : ViewModel() {
+ // [STATE]
+ // TODO: Implement UI state
+}
+// [END_FILE_SearchViewModel.kt]
diff --git a/tech_spec/home_box_api.json b/tech_spec/home_box_api.json
new file mode 100644
index 0000000..764c05b
--- /dev/null
+++ b/tech_spec/home_box_api.json
@@ -0,0 +1,4315 @@
+{
+ "schemes": [
+ "https",
+ "http"
+ ],
+ "swagger": "2.0",
+ "info": {
+ "description": "Track, Manage, and Organize your Things.",
+ "title": "Homebox API",
+ "contact": {
+ "name": "Homebox Team",
+ "url": "https://discord.homebox.software"
+ },
+ "version": "1.0"
+ },
+ "host": "demo.homebox.software",
+ "basePath": "/api",
+ "paths": {
+ "/v1/actions/create-missing-thumbnails": {
+ "post": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "description": "Creates thumbnails for items that are missing them",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Actions"
+ ],
+ "summary": "Create Missing Thumbnails",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/v1.ActionAmountResult"
+ }
+ }
+ }
+ }
+ },
+ "/v1/actions/ensure-asset-ids": {
+ "post": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "description": "Ensures all items in the database have an asset ID",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Actions"
+ ],
+ "summary": "Ensure Asset IDs",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/v1.ActionAmountResult"
+ }
+ }
+ }
+ }
+ },
+ "/v1/actions/ensure-import-refs": {
+ "post": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "description": "Ensures all items in the database have an import ref",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Actions"
+ ],
+ "summary": "Ensures Import Refs",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/v1.ActionAmountResult"
+ }
+ }
+ }
+ }
+ },
+ "/v1/actions/set-primary-photos": {
+ "post": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "description": "Sets the first photo of each item as the primary photo",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Actions"
+ ],
+ "summary": "Set Primary Photos",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/v1.ActionAmountResult"
+ }
+ }
+ }
+ }
+ },
+ "/v1/actions/zero-item-time-fields": {
+ "post": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "description": "Resets all item date fields to the beginning of the day",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Actions"
+ ],
+ "summary": "Zero Out Time Fields",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/v1.ActionAmountResult"
+ }
+ }
+ }
+ }
+ },
+ "/v1/assets/{id}": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Items"
+ ],
+ "summary": "Get Item by Asset ID",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Asset ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/repo.PaginationResult-repo_ItemSummary"
+ }
+ }
+ }
+ }
+ },
+ "/v1/currency": {
+ "get": {
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Base"
+ ],
+ "summary": "Currency",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/currencies.Currency"
+ }
+ }
+ }
+ }
+ },
+ "/v1/groups": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Group"
+ ],
+ "summary": "Get Group",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/repo.Group"
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Group"
+ ],
+ "summary": "Update Group",
+ "parameters": [
+ {
+ "description": "User Data",
+ "name": "payload",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/repo.GroupUpdate"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/repo.Group"
+ }
+ }
+ }
+ }
+ },
+ "/v1/groups/invitations": {
+ "post": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Group"
+ ],
+ "summary": "Create Group Invitation",
+ "parameters": [
+ {
+ "description": "User Data",
+ "name": "payload",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/v1.GroupInvitationCreate"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/v1.GroupInvitation"
+ }
+ }
+ }
+ }
+ },
+ "/v1/groups/statistics": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Statistics"
+ ],
+ "summary": "Get Group Statistics",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/repo.GroupStatistics"
+ }
+ }
+ }
+ }
+ },
+ "/v1/groups/statistics/labels": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Statistics"
+ ],
+ "summary": "Get Label Statistics",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/repo.TotalsByOrganizer"
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/groups/statistics/locations": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Statistics"
+ ],
+ "summary": "Get Location Statistics",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/repo.TotalsByOrganizer"
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/groups/statistics/purchase-price": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Statistics"
+ ],
+ "summary": "Get Purchase Price Statistics",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "start date",
+ "name": "start",
+ "in": "query"
+ },
+ {
+ "type": "string",
+ "description": "end date",
+ "name": "end",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/repo.ValueOverTime"
+ }
+ }
+ }
+ }
+ },
+ "/v1/items": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Items"
+ ],
+ "summary": "Query All Items",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "search string",
+ "name": "q",
+ "in": "query"
+ },
+ {
+ "type": "integer",
+ "description": "page number",
+ "name": "page",
+ "in": "query"
+ },
+ {
+ "type": "integer",
+ "description": "items per page",
+ "name": "pageSize",
+ "in": "query"
+ },
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "collectionFormat": "multi",
+ "description": "label Ids",
+ "name": "labels",
+ "in": "query"
+ },
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "collectionFormat": "multi",
+ "description": "location Ids",
+ "name": "locations",
+ "in": "query"
+ },
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "collectionFormat": "multi",
+ "description": "parent Ids",
+ "name": "parentIds",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/repo.PaginationResult-repo_ItemSummary"
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Items"
+ ],
+ "summary": "Create Item",
+ "parameters": [
+ {
+ "description": "Item Data",
+ "name": "payload",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/repo.ItemCreate"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Created",
+ "schema": {
+ "$ref": "#/definitions/repo.ItemSummary"
+ }
+ }
+ }
+ }
+ },
+ "/v1/items/export": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "tags": [
+ "Items"
+ ],
+ "summary": "Export Items",
+ "responses": {
+ "200": {
+ "description": "text/csv",
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "/v1/items/fields": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Items"
+ ],
+ "summary": "Get All Custom Field Names",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/items/fields/values": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Items"
+ ],
+ "summary": "Get All Custom Field Values",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/items/import": {
+ "post": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "consumes": [
+ "multipart/form-data"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Items"
+ ],
+ "summary": "Import Items",
+ "parameters": [
+ {
+ "type": "file",
+ "description": "Image to upload",
+ "name": "csv",
+ "in": "formData",
+ "required": true
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "No Content"
+ }
+ }
+ }
+ },
+ "/v1/items/{id}": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Items"
+ ],
+ "summary": "Get Item",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Item ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/repo.ItemOut"
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Items"
+ ],
+ "summary": "Update Item",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Item ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "Item Data",
+ "name": "payload",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/repo.ItemUpdate"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/repo.ItemOut"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Items"
+ ],
+ "summary": "Delete Item",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Item ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "No Content"
+ }
+ }
+ },
+ "patch": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Items"
+ ],
+ "summary": "Update Item",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Item ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "Item Data",
+ "name": "payload",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/repo.ItemPatch"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/repo.ItemOut"
+ }
+ }
+ }
+ }
+ },
+ "/v1/items/{id}/attachments": {
+ "post": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "consumes": [
+ "multipart/form-data"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Items Attachments"
+ ],
+ "summary": "Create Item Attachment",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Item ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "file",
+ "description": "File attachment",
+ "name": "file",
+ "in": "formData",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "Type of file",
+ "name": "type",
+ "in": "formData"
+ },
+ {
+ "type": "boolean",
+ "description": "Is this the primary attachment",
+ "name": "primary",
+ "in": "formData"
+ },
+ {
+ "type": "string",
+ "description": "name of the file including extension",
+ "name": "name",
+ "in": "formData",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/repo.ItemOut"
+ }
+ },
+ "422": {
+ "description": "Unprocessable Entity",
+ "schema": {
+ "$ref": "#/definitions/validate.ErrorResponse"
+ }
+ }
+ }
+ }
+ },
+ "/v1/items/{id}/attachments/{attachment_id}": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/octet-stream"
+ ],
+ "tags": [
+ "Items Attachments"
+ ],
+ "summary": "Get Item Attachment",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Item ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "Attachment ID",
+ "name": "attachment_id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/v1.ItemAttachmentToken"
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "tags": [
+ "Items Attachments"
+ ],
+ "summary": "Update Item Attachment",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Item ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "Attachment ID",
+ "name": "attachment_id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "Attachment Update",
+ "name": "payload",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/repo.ItemAttachmentUpdate"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/repo.ItemOut"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "tags": [
+ "Items Attachments"
+ ],
+ "summary": "Delete Item Attachment",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Item ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "Attachment ID",
+ "name": "attachment_id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "No Content"
+ }
+ }
+ }
+ },
+ "/v1/items/{id}/maintenance": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Item Maintenance"
+ ],
+ "summary": "Get Maintenance Log",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Item ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "enum": [
+ "scheduled",
+ "completed",
+ "both"
+ ],
+ "type": "string",
+ "x-enum-varnames": [
+ "MaintenanceFilterStatusScheduled",
+ "MaintenanceFilterStatusCompleted",
+ "MaintenanceFilterStatusBoth"
+ ],
+ "name": "status",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/repo.MaintenanceEntryWithDetails"
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Item Maintenance"
+ ],
+ "summary": "Create Maintenance Entry",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Item ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "Entry Data",
+ "name": "payload",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/repo.MaintenanceEntryCreate"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Created",
+ "schema": {
+ "$ref": "#/definitions/repo.MaintenanceEntry"
+ }
+ }
+ }
+ }
+ },
+ "/v1/items/{id}/path": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Items"
+ ],
+ "summary": "Get the full path of an item",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Item ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/repo.ItemPath"
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/labelmaker/assets/{id}": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Items"
+ ],
+ "summary": "Get Asset label",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Asset ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "boolean",
+ "description": "Print this label, defaults to false",
+ "name": "print",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "image/png",
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "/v1/labelmaker/item/{id}": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Items"
+ ],
+ "summary": "Get Item label",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Item ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "boolean",
+ "description": "Print this label, defaults to false",
+ "name": "print",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "image/png",
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "/v1/labelmaker/location/{id}": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Locations"
+ ],
+ "summary": "Get Location label",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Location ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "boolean",
+ "description": "Print this label, defaults to false",
+ "name": "print",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "image/png",
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "/v1/labels": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Labels"
+ ],
+ "summary": "Get All Labels",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/repo.LabelOut"
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Labels"
+ ],
+ "summary": "Create Label",
+ "parameters": [
+ {
+ "description": "Label Data",
+ "name": "payload",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/repo.LabelCreate"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/repo.LabelSummary"
+ }
+ }
+ }
+ }
+ },
+ "/v1/labels/{id}": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Labels"
+ ],
+ "summary": "Get Label",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Label ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/repo.LabelOut"
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Labels"
+ ],
+ "summary": "Update Label",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Label ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/repo.LabelOut"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Labels"
+ ],
+ "summary": "Delete Label",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Label ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "No Content"
+ }
+ }
+ }
+ },
+ "/v1/locations": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Locations"
+ ],
+ "summary": "Get All Locations",
+ "parameters": [
+ {
+ "type": "boolean",
+ "description": "Filter locations with parents",
+ "name": "filterChildren",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/repo.LocationOutCount"
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Locations"
+ ],
+ "summary": "Create Location",
+ "parameters": [
+ {
+ "description": "Location Data",
+ "name": "payload",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/repo.LocationCreate"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/repo.LocationSummary"
+ }
+ }
+ }
+ }
+ },
+ "/v1/locations/tree": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Locations"
+ ],
+ "summary": "Get Locations Tree",
+ "parameters": [
+ {
+ "type": "boolean",
+ "description": "include items in response tree",
+ "name": "withItems",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/repo.TreeItem"
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/locations/{id}": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Locations"
+ ],
+ "summary": "Get Location",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Location ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/repo.LocationOut"
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Locations"
+ ],
+ "summary": "Update Location",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Location ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "Location Data",
+ "name": "payload",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/repo.LocationUpdate"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/repo.LocationOut"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Locations"
+ ],
+ "summary": "Delete Location",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Location ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "No Content"
+ }
+ }
+ }
+ },
+ "/v1/maintenance": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Maintenance"
+ ],
+ "summary": "Query All Maintenance",
+ "parameters": [
+ {
+ "enum": [
+ "scheduled",
+ "completed",
+ "both"
+ ],
+ "type": "string",
+ "x-enum-varnames": [
+ "MaintenanceFilterStatusScheduled",
+ "MaintenanceFilterStatusCompleted",
+ "MaintenanceFilterStatusBoth"
+ ],
+ "name": "status",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/repo.MaintenanceEntryWithDetails"
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/maintenance/{id}": {
+ "put": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Maintenance"
+ ],
+ "summary": "Update Maintenance Entry",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Maintenance ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "Entry Data",
+ "name": "payload",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/repo.MaintenanceEntryUpdate"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/repo.MaintenanceEntry"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Maintenance"
+ ],
+ "summary": "Delete Maintenance Entry",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Maintenance ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "No Content"
+ }
+ }
+ }
+ },
+ "/v1/notifiers": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Notifiers"
+ ],
+ "summary": "Get Notifiers",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/repo.NotifierOut"
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Notifiers"
+ ],
+ "summary": "Create Notifier",
+ "parameters": [
+ {
+ "description": "Notifier Data",
+ "name": "payload",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/repo.NotifierCreate"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/repo.NotifierOut"
+ }
+ }
+ }
+ }
+ },
+ "/v1/notifiers/test": {
+ "post": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Notifiers"
+ ],
+ "summary": "Test Notifier",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "URL",
+ "name": "url",
+ "in": "query",
+ "required": true
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "No Content"
+ }
+ }
+ }
+ },
+ "/v1/notifiers/{id}": {
+ "put": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "tags": [
+ "Notifiers"
+ ],
+ "summary": "Update Notifier",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Notifier ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "Notifier Data",
+ "name": "payload",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/repo.NotifierUpdate"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/repo.NotifierOut"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "tags": [
+ "Notifiers"
+ ],
+ "summary": "Delete a Notifier",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Notifier ID",
+ "name": "id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "No Content"
+ }
+ }
+ }
+ },
+ "/v1/products/search-from-barcode": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Items"
+ ],
+ "summary": "Search EAN from Barcode",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "barcode to be searched",
+ "name": "data",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/repo.BarcodeProduct"
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/qrcode": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Items"
+ ],
+ "summary": "Create QR Code",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "data to be encoded into qrcode",
+ "name": "data",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "image/jpeg",
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "/v1/reporting/bill-of-materials": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Reporting"
+ ],
+ "summary": "Export Bill of Materials",
+ "responses": {
+ "200": {
+ "description": "text/csv",
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "/v1/status": {
+ "get": {
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Base"
+ ],
+ "summary": "Application Info",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/v1.APISummary"
+ }
+ }
+ }
+ }
+ },
+ "/v1/users/change-password": {
+ "put": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "Change Password",
+ "parameters": [
+ {
+ "description": "Password Payload",
+ "name": "payload",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/v1.ChangePassword"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "No Content"
+ }
+ }
+ }
+ },
+ "/v1/users/login": {
+ "post": {
+ "consumes": [
+ "application/x-www-form-urlencoded",
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Authentication"
+ ],
+ "summary": "User Login",
+ "parameters": [
+ {
+ "description": "Login Data",
+ "name": "payload",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/v1.LoginForm"
+ }
+ },
+ {
+ "type": "string",
+ "description": "auth provider",
+ "name": "provider",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/v1.TokenResponse"
+ }
+ }
+ }
+ }
+ },
+ "/v1/users/logout": {
+ "post": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "tags": [
+ "Authentication"
+ ],
+ "summary": "User Logout",
+ "responses": {
+ "204": {
+ "description": "No Content"
+ }
+ }
+ }
+ },
+ "/v1/users/refresh": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "description": "handleAuthRefresh returns a handler that will issue a new token from an existing token.\nThis does not validate that the user still exists within the database.",
+ "tags": [
+ "Authentication"
+ ],
+ "summary": "User Token Refresh",
+ "responses": {
+ "200": {
+ "description": "OK"
+ }
+ }
+ }
+ },
+ "/v1/users/register": {
+ "post": {
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "Register New User",
+ "parameters": [
+ {
+ "description": "User Data",
+ "name": "payload",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/services.UserRegistration"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "No Content"
+ }
+ }
+ }
+ },
+ "/v1/users/self": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "Get User Self",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/v1.Wrapped"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "item": {
+ "$ref": "#/definitions/repo.UserOut"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "Update Account",
+ "parameters": [
+ {
+ "description": "User Data",
+ "name": "payload",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/repo.UserUpdate"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/v1.Wrapped"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "item": {
+ "$ref": "#/definitions/repo.UserUpdate"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "User"
+ ],
+ "summary": "Delete Account",
+ "responses": {
+ "204": {
+ "description": "No Content"
+ }
+ }
+ }
+ }
+ },
+ "definitions": {
+ "attachment.Type": {
+ "type": "string",
+ "enum": [
+ "attachment",
+ "photo",
+ "manual",
+ "warranty",
+ "attachment",
+ "receipt",
+ "thumbnail"
+ ],
+ "x-enum-varnames": [
+ "DefaultType",
+ "TypePhoto",
+ "TypeManual",
+ "TypeWarranty",
+ "TypeAttachment",
+ "TypeReceipt",
+ "TypeThumbnail"
+ ]
+ },
+ "authroles.Role": {
+ "type": "string",
+ "enum": [
+ "user",
+ "admin",
+ "user",
+ "attachments"
+ ],
+ "x-enum-varnames": [
+ "DefaultRole",
+ "RoleAdmin",
+ "RoleUser",
+ "RoleAttachments"
+ ]
+ },
+ "currencies.Currency": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "string"
+ },
+ "local": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "symbol": {
+ "type": "string"
+ }
+ }
+ },
+ "ent.Attachment": {
+ "type": "object",
+ "properties": {
+ "created_at": {
+ "description": "CreatedAt holds the value of the \"created_at\" field.",
+ "type": "string"
+ },
+ "edges": {
+ "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the AttachmentQuery when eager-loading is set.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.AttachmentEdges"
+ }
+ ]
+ },
+ "id": {
+ "description": "ID of the ent.",
+ "type": "string"
+ },
+ "mime_type": {
+ "description": "MimeType holds the value of the \"mime_type\" field.",
+ "type": "string"
+ },
+ "path": {
+ "description": "Path holds the value of the \"path\" field.",
+ "type": "string"
+ },
+ "primary": {
+ "description": "Primary holds the value of the \"primary\" field.",
+ "type": "boolean"
+ },
+ "title": {
+ "description": "Title holds the value of the \"title\" field.",
+ "type": "string"
+ },
+ "type": {
+ "description": "Type holds the value of the \"type\" field.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/attachment.Type"
+ }
+ ]
+ },
+ "updated_at": {
+ "description": "UpdatedAt holds the value of the \"updated_at\" field.",
+ "type": "string"
+ }
+ }
+ },
+ "ent.AttachmentEdges": {
+ "type": "object",
+ "properties": {
+ "item": {
+ "description": "Item holds the value of the item edge.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.Item"
+ }
+ ]
+ },
+ "thumbnail": {
+ "description": "Thumbnail holds the value of the thumbnail edge.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.Attachment"
+ }
+ ]
+ }
+ }
+ },
+ "ent.AuthRoles": {
+ "type": "object",
+ "properties": {
+ "edges": {
+ "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the AuthRolesQuery when eager-loading is set.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.AuthRolesEdges"
+ }
+ ]
+ },
+ "id": {
+ "description": "ID of the ent.",
+ "type": "integer"
+ },
+ "role": {
+ "description": "Role holds the value of the \"role\" field.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/authroles.Role"
+ }
+ ]
+ }
+ }
+ },
+ "ent.AuthRolesEdges": {
+ "type": "object",
+ "properties": {
+ "token": {
+ "description": "Token holds the value of the token edge.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.AuthTokens"
+ }
+ ]
+ }
+ }
+ },
+ "ent.AuthTokens": {
+ "type": "object",
+ "properties": {
+ "created_at": {
+ "description": "CreatedAt holds the value of the \"created_at\" field.",
+ "type": "string"
+ },
+ "edges": {
+ "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the AuthTokensQuery when eager-loading is set.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.AuthTokensEdges"
+ }
+ ]
+ },
+ "expires_at": {
+ "description": "ExpiresAt holds the value of the \"expires_at\" field.",
+ "type": "string"
+ },
+ "id": {
+ "description": "ID of the ent.",
+ "type": "string"
+ },
+ "token": {
+ "description": "Token holds the value of the \"token\" field.",
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "updated_at": {
+ "description": "UpdatedAt holds the value of the \"updated_at\" field.",
+ "type": "string"
+ }
+ }
+ },
+ "ent.AuthTokensEdges": {
+ "type": "object",
+ "properties": {
+ "roles": {
+ "description": "Roles holds the value of the roles edge.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.AuthRoles"
+ }
+ ]
+ },
+ "user": {
+ "description": "User holds the value of the user edge.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.User"
+ }
+ ]
+ }
+ }
+ },
+ "ent.Group": {
+ "type": "object",
+ "properties": {
+ "created_at": {
+ "description": "CreatedAt holds the value of the \"created_at\" field.",
+ "type": "string"
+ },
+ "currency": {
+ "description": "Currency holds the value of the \"currency\" field.",
+ "type": "string"
+ },
+ "edges": {
+ "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the GroupQuery when eager-loading is set.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.GroupEdges"
+ }
+ ]
+ },
+ "id": {
+ "description": "ID of the ent.",
+ "type": "string"
+ },
+ "name": {
+ "description": "Name holds the value of the \"name\" field.",
+ "type": "string"
+ },
+ "updated_at": {
+ "description": "UpdatedAt holds the value of the \"updated_at\" field.",
+ "type": "string"
+ }
+ }
+ },
+ "ent.GroupEdges": {
+ "type": "object",
+ "properties": {
+ "invitation_tokens": {
+ "description": "InvitationTokens holds the value of the invitation_tokens edge.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ent.GroupInvitationToken"
+ }
+ },
+ "items": {
+ "description": "Items holds the value of the items edge.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ent.Item"
+ }
+ },
+ "labels": {
+ "description": "Labels holds the value of the labels edge.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ent.Label"
+ }
+ },
+ "locations": {
+ "description": "Locations holds the value of the locations edge.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ent.Location"
+ }
+ },
+ "notifiers": {
+ "description": "Notifiers holds the value of the notifiers edge.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ent.Notifier"
+ }
+ },
+ "users": {
+ "description": "Users holds the value of the users edge.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ent.User"
+ }
+ }
+ }
+ },
+ "ent.GroupInvitationToken": {
+ "type": "object",
+ "properties": {
+ "created_at": {
+ "description": "CreatedAt holds the value of the \"created_at\" field.",
+ "type": "string"
+ },
+ "edges": {
+ "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the GroupInvitationTokenQuery when eager-loading is set.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.GroupInvitationTokenEdges"
+ }
+ ]
+ },
+ "expires_at": {
+ "description": "ExpiresAt holds the value of the \"expires_at\" field.",
+ "type": "string"
+ },
+ "id": {
+ "description": "ID of the ent.",
+ "type": "string"
+ },
+ "token": {
+ "description": "Token holds the value of the \"token\" field.",
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "updated_at": {
+ "description": "UpdatedAt holds the value of the \"updated_at\" field.",
+ "type": "string"
+ },
+ "uses": {
+ "description": "Uses holds the value of the \"uses\" field.",
+ "type": "integer"
+ }
+ }
+ },
+ "ent.GroupInvitationTokenEdges": {
+ "type": "object",
+ "properties": {
+ "group": {
+ "description": "Group holds the value of the group edge.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.Group"
+ }
+ ]
+ }
+ }
+ },
+ "ent.Item": {
+ "type": "object",
+ "properties": {
+ "archived": {
+ "description": "Archived holds the value of the \"archived\" field.",
+ "type": "boolean"
+ },
+ "asset_id": {
+ "description": "AssetID holds the value of the \"asset_id\" field.",
+ "type": "integer"
+ },
+ "created_at": {
+ "description": "CreatedAt holds the value of the \"created_at\" field.",
+ "type": "string"
+ },
+ "description": {
+ "description": "Description holds the value of the \"description\" field.",
+ "type": "string"
+ },
+ "edges": {
+ "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the ItemQuery when eager-loading is set.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.ItemEdges"
+ }
+ ]
+ },
+ "id": {
+ "description": "ID of the ent.",
+ "type": "string"
+ },
+ "import_ref": {
+ "description": "ImportRef holds the value of the \"import_ref\" field.",
+ "type": "string"
+ },
+ "insured": {
+ "description": "Insured holds the value of the \"insured\" field.",
+ "type": "boolean"
+ },
+ "lifetime_warranty": {
+ "description": "LifetimeWarranty holds the value of the \"lifetime_warranty\" field.",
+ "type": "boolean"
+ },
+ "manufacturer": {
+ "description": "Manufacturer holds the value of the \"manufacturer\" field.",
+ "type": "string"
+ },
+ "model_number": {
+ "description": "ModelNumber holds the value of the \"model_number\" field.",
+ "type": "string"
+ },
+ "name": {
+ "description": "Name holds the value of the \"name\" field.",
+ "type": "string"
+ },
+ "notes": {
+ "description": "Notes holds the value of the \"notes\" field.",
+ "type": "string"
+ },
+ "purchase_from": {
+ "description": "PurchaseFrom holds the value of the \"purchase_from\" field.",
+ "type": "string"
+ },
+ "purchase_price": {
+ "description": "PurchasePrice holds the value of the \"purchase_price\" field.",
+ "type": "number"
+ },
+ "purchase_time": {
+ "description": "PurchaseTime holds the value of the \"purchase_time\" field.",
+ "type": "string"
+ },
+ "quantity": {
+ "description": "Quantity holds the value of the \"quantity\" field.",
+ "type": "integer"
+ },
+ "serial_number": {
+ "description": "SerialNumber holds the value of the \"serial_number\" field.",
+ "type": "string"
+ },
+ "sold_notes": {
+ "description": "SoldNotes holds the value of the \"sold_notes\" field.",
+ "type": "string"
+ },
+ "sold_price": {
+ "description": "SoldPrice holds the value of the \"sold_price\" field.",
+ "type": "number"
+ },
+ "sold_time": {
+ "description": "SoldTime holds the value of the \"sold_time\" field.",
+ "type": "string"
+ },
+ "sold_to": {
+ "description": "SoldTo holds the value of the \"sold_to\" field.",
+ "type": "string"
+ },
+ "sync_child_items_locations": {
+ "description": "SyncChildItemsLocations holds the value of the \"sync_child_items_locations\" field.",
+ "type": "boolean"
+ },
+ "updated_at": {
+ "description": "UpdatedAt holds the value of the \"updated_at\" field.",
+ "type": "string"
+ },
+ "warranty_details": {
+ "description": "WarrantyDetails holds the value of the \"warranty_details\" field.",
+ "type": "string"
+ },
+ "warranty_expires": {
+ "description": "WarrantyExpires holds the value of the \"warranty_expires\" field.",
+ "type": "string"
+ }
+ }
+ },
+ "ent.ItemEdges": {
+ "type": "object",
+ "properties": {
+ "attachments": {
+ "description": "Attachments holds the value of the attachments edge.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ent.Attachment"
+ }
+ },
+ "children": {
+ "description": "Children holds the value of the children edge.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ent.Item"
+ }
+ },
+ "fields": {
+ "description": "Fields holds the value of the fields edge.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ent.ItemField"
+ }
+ },
+ "group": {
+ "description": "Group holds the value of the group edge.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.Group"
+ }
+ ]
+ },
+ "label": {
+ "description": "Label holds the value of the label edge.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ent.Label"
+ }
+ },
+ "location": {
+ "description": "Location holds the value of the location edge.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.Location"
+ }
+ ]
+ },
+ "maintenance_entries": {
+ "description": "MaintenanceEntries holds the value of the maintenance_entries edge.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ent.MaintenanceEntry"
+ }
+ },
+ "parent": {
+ "description": "Parent holds the value of the parent edge.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.Item"
+ }
+ ]
+ }
+ }
+ },
+ "ent.ItemField": {
+ "type": "object",
+ "properties": {
+ "boolean_value": {
+ "description": "BooleanValue holds the value of the \"boolean_value\" field.",
+ "type": "boolean"
+ },
+ "created_at": {
+ "description": "CreatedAt holds the value of the \"created_at\" field.",
+ "type": "string"
+ },
+ "description": {
+ "description": "Description holds the value of the \"description\" field.",
+ "type": "string"
+ },
+ "edges": {
+ "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the ItemFieldQuery when eager-loading is set.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.ItemFieldEdges"
+ }
+ ]
+ },
+ "id": {
+ "description": "ID of the ent.",
+ "type": "string"
+ },
+ "name": {
+ "description": "Name holds the value of the \"name\" field.",
+ "type": "string"
+ },
+ "number_value": {
+ "description": "NumberValue holds the value of the \"number_value\" field.",
+ "type": "integer"
+ },
+ "text_value": {
+ "description": "TextValue holds the value of the \"text_value\" field.",
+ "type": "string"
+ },
+ "time_value": {
+ "description": "TimeValue holds the value of the \"time_value\" field.",
+ "type": "string"
+ },
+ "type": {
+ "description": "Type holds the value of the \"type\" field.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/itemfield.Type"
+ }
+ ]
+ },
+ "updated_at": {
+ "description": "UpdatedAt holds the value of the \"updated_at\" field.",
+ "type": "string"
+ }
+ }
+ },
+ "ent.ItemFieldEdges": {
+ "type": "object",
+ "properties": {
+ "item": {
+ "description": "Item holds the value of the item edge.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.Item"
+ }
+ ]
+ }
+ }
+ },
+ "ent.Label": {
+ "type": "object",
+ "properties": {
+ "color": {
+ "description": "Color holds the value of the \"color\" field.",
+ "type": "string"
+ },
+ "created_at": {
+ "description": "CreatedAt holds the value of the \"created_at\" field.",
+ "type": "string"
+ },
+ "description": {
+ "description": "Description holds the value of the \"description\" field.",
+ "type": "string"
+ },
+ "edges": {
+ "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the LabelQuery when eager-loading is set.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.LabelEdges"
+ }
+ ]
+ },
+ "id": {
+ "description": "ID of the ent.",
+ "type": "string"
+ },
+ "name": {
+ "description": "Name holds the value of the \"name\" field.",
+ "type": "string"
+ },
+ "updated_at": {
+ "description": "UpdatedAt holds the value of the \"updated_at\" field.",
+ "type": "string"
+ }
+ }
+ },
+ "ent.LabelEdges": {
+ "type": "object",
+ "properties": {
+ "group": {
+ "description": "Group holds the value of the group edge.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.Group"
+ }
+ ]
+ },
+ "items": {
+ "description": "Items holds the value of the items edge.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ent.Item"
+ }
+ }
+ }
+ },
+ "ent.Location": {
+ "type": "object",
+ "properties": {
+ "created_at": {
+ "description": "CreatedAt holds the value of the \"created_at\" field.",
+ "type": "string"
+ },
+ "description": {
+ "description": "Description holds the value of the \"description\" field.",
+ "type": "string"
+ },
+ "edges": {
+ "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the LocationQuery when eager-loading is set.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.LocationEdges"
+ }
+ ]
+ },
+ "id": {
+ "description": "ID of the ent.",
+ "type": "string"
+ },
+ "name": {
+ "description": "Name holds the value of the \"name\" field.",
+ "type": "string"
+ },
+ "updated_at": {
+ "description": "UpdatedAt holds the value of the \"updated_at\" field.",
+ "type": "string"
+ }
+ }
+ },
+ "ent.LocationEdges": {
+ "type": "object",
+ "properties": {
+ "children": {
+ "description": "Children holds the value of the children edge.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ent.Location"
+ }
+ },
+ "group": {
+ "description": "Group holds the value of the group edge.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.Group"
+ }
+ ]
+ },
+ "items": {
+ "description": "Items holds the value of the items edge.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ent.Item"
+ }
+ },
+ "parent": {
+ "description": "Parent holds the value of the parent edge.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.Location"
+ }
+ ]
+ }
+ }
+ },
+ "ent.MaintenanceEntry": {
+ "type": "object",
+ "properties": {
+ "cost": {
+ "description": "Cost holds the value of the \"cost\" field.",
+ "type": "number"
+ },
+ "created_at": {
+ "description": "CreatedAt holds the value of the \"created_at\" field.",
+ "type": "string"
+ },
+ "date": {
+ "description": "Date holds the value of the \"date\" field.",
+ "type": "string"
+ },
+ "description": {
+ "description": "Description holds the value of the \"description\" field.",
+ "type": "string"
+ },
+ "edges": {
+ "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the MaintenanceEntryQuery when eager-loading is set.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.MaintenanceEntryEdges"
+ }
+ ]
+ },
+ "id": {
+ "description": "ID of the ent.",
+ "type": "string"
+ },
+ "item_id": {
+ "description": "ItemID holds the value of the \"item_id\" field.",
+ "type": "string"
+ },
+ "name": {
+ "description": "Name holds the value of the \"name\" field.",
+ "type": "string"
+ },
+ "scheduled_date": {
+ "description": "ScheduledDate holds the value of the \"scheduled_date\" field.",
+ "type": "string"
+ },
+ "updated_at": {
+ "description": "UpdatedAt holds the value of the \"updated_at\" field.",
+ "type": "string"
+ }
+ }
+ },
+ "ent.MaintenanceEntryEdges": {
+ "type": "object",
+ "properties": {
+ "item": {
+ "description": "Item holds the value of the item edge.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.Item"
+ }
+ ]
+ }
+ }
+ },
+ "ent.Notifier": {
+ "type": "object",
+ "properties": {
+ "created_at": {
+ "description": "CreatedAt holds the value of the \"created_at\" field.",
+ "type": "string"
+ },
+ "edges": {
+ "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the NotifierQuery when eager-loading is set.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.NotifierEdges"
+ }
+ ]
+ },
+ "group_id": {
+ "description": "GroupID holds the value of the \"group_id\" field.",
+ "type": "string"
+ },
+ "id": {
+ "description": "ID of the ent.",
+ "type": "string"
+ },
+ "is_active": {
+ "description": "IsActive holds the value of the \"is_active\" field.",
+ "type": "boolean"
+ },
+ "name": {
+ "description": "Name holds the value of the \"name\" field.",
+ "type": "string"
+ },
+ "updated_at": {
+ "description": "UpdatedAt holds the value of the \"updated_at\" field.",
+ "type": "string"
+ },
+ "user_id": {
+ "description": "UserID holds the value of the \"user_id\" field.",
+ "type": "string"
+ }
+ }
+ },
+ "ent.NotifierEdges": {
+ "type": "object",
+ "properties": {
+ "group": {
+ "description": "Group holds the value of the group edge.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.Group"
+ }
+ ]
+ },
+ "user": {
+ "description": "User holds the value of the user edge.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.User"
+ }
+ ]
+ }
+ }
+ },
+ "ent.User": {
+ "type": "object",
+ "properties": {
+ "activated_on": {
+ "description": "ActivatedOn holds the value of the \"activated_on\" field.",
+ "type": "string"
+ },
+ "created_at": {
+ "description": "CreatedAt holds the value of the \"created_at\" field.",
+ "type": "string"
+ },
+ "edges": {
+ "description": "Edges holds the relations/edges for other nodes in the graph.\nThe values are being populated by the UserQuery when eager-loading is set.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.UserEdges"
+ }
+ ]
+ },
+ "email": {
+ "description": "Email holds the value of the \"email\" field.",
+ "type": "string"
+ },
+ "id": {
+ "description": "ID of the ent.",
+ "type": "string"
+ },
+ "is_superuser": {
+ "description": "IsSuperuser holds the value of the \"is_superuser\" field.",
+ "type": "boolean"
+ },
+ "name": {
+ "description": "Name holds the value of the \"name\" field.",
+ "type": "string"
+ },
+ "role": {
+ "description": "Role holds the value of the \"role\" field.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/user.Role"
+ }
+ ]
+ },
+ "superuser": {
+ "description": "Superuser holds the value of the \"superuser\" field.",
+ "type": "boolean"
+ },
+ "updated_at": {
+ "description": "UpdatedAt holds the value of the \"updated_at\" field.",
+ "type": "string"
+ }
+ }
+ },
+ "ent.UserEdges": {
+ "type": "object",
+ "properties": {
+ "auth_tokens": {
+ "description": "AuthTokens holds the value of the auth_tokens edge.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ent.AuthTokens"
+ }
+ },
+ "group": {
+ "description": "Group holds the value of the group edge.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ent.Group"
+ }
+ ]
+ },
+ "notifiers": {
+ "description": "Notifiers holds the value of the notifiers edge.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ent.Notifier"
+ }
+ }
+ }
+ },
+ "itemfield.Type": {
+ "type": "string",
+ "enum": [
+ "text",
+ "number",
+ "boolean",
+ "time"
+ ],
+ "x-enum-varnames": [
+ "TypeText",
+ "TypeNumber",
+ "TypeBoolean",
+ "TypeTime"
+ ]
+ },
+ "repo.BarcodeProduct": {
+ "type": "object",
+ "properties": {
+ "barcode": {
+ "type": "string"
+ },
+ "imageBase64": {
+ "type": "string"
+ },
+ "imageURL": {
+ "type": "string"
+ },
+ "item": {
+ "$ref": "#/definitions/repo.ItemCreate"
+ },
+ "manufacturer": {
+ "type": "string"
+ },
+ "modelNumber": {
+ "description": "Identifications",
+ "type": "string"
+ },
+ "notes": {
+ "description": "Extras",
+ "type": "string"
+ },
+ "search_engine_name": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.Group": {
+ "type": "object",
+ "properties": {
+ "createdAt": {
+ "type": "string"
+ },
+ "currency": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "updatedAt": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.GroupStatistics": {
+ "type": "object",
+ "properties": {
+ "totalItemPrice": {
+ "type": "number"
+ },
+ "totalItems": {
+ "type": "integer"
+ },
+ "totalLabels": {
+ "type": "integer"
+ },
+ "totalLocations": {
+ "type": "integer"
+ },
+ "totalUsers": {
+ "type": "integer"
+ },
+ "totalWithWarranty": {
+ "type": "integer"
+ }
+ }
+ },
+ "repo.GroupUpdate": {
+ "type": "object",
+ "properties": {
+ "currency": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.ItemAttachment": {
+ "type": "object",
+ "properties": {
+ "createdAt": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "mimeType": {
+ "type": "string"
+ },
+ "path": {
+ "type": "string"
+ },
+ "primary": {
+ "type": "boolean"
+ },
+ "thumbnail": {
+ "$ref": "#/definitions/ent.Attachment"
+ },
+ "title": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ },
+ "updatedAt": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.ItemAttachmentUpdate": {
+ "type": "object",
+ "properties": {
+ "primary": {
+ "type": "boolean"
+ },
+ "title": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.ItemCreate": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "description": {
+ "type": "string",
+ "maxLength": 1000
+ },
+ "labelIds": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "locationId": {
+ "description": "Edges",
+ "type": "string"
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 255,
+ "minLength": 1
+ },
+ "parentId": {
+ "type": "string",
+ "x-nullable": true
+ },
+ "quantity": {
+ "type": "integer"
+ }
+ }
+ },
+ "repo.ItemField": {
+ "type": "object",
+ "properties": {
+ "booleanValue": {
+ "type": "boolean"
+ },
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "numberValue": {
+ "type": "integer"
+ },
+ "textValue": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.ItemOut": {
+ "type": "object",
+ "properties": {
+ "archived": {
+ "type": "boolean"
+ },
+ "assetId": {
+ "type": "string",
+ "example": "0"
+ },
+ "attachments": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/repo.ItemAttachment"
+ }
+ },
+ "createdAt": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "fields": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/repo.ItemField"
+ }
+ },
+ "id": {
+ "type": "string"
+ },
+ "imageId": {
+ "type": "string",
+ "x-nullable": true,
+ "x-omitempty": true
+ },
+ "insured": {
+ "type": "boolean"
+ },
+ "labels": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/repo.LabelSummary"
+ }
+ },
+ "lifetimeWarranty": {
+ "description": "Warranty",
+ "type": "boolean"
+ },
+ "location": {
+ "description": "Edges",
+ "allOf": [
+ {
+ "$ref": "#/definitions/repo.LocationSummary"
+ }
+ ],
+ "x-nullable": true,
+ "x-omitempty": true
+ },
+ "manufacturer": {
+ "type": "string"
+ },
+ "modelNumber": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "notes": {
+ "description": "Extras",
+ "type": "string"
+ },
+ "parent": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/repo.ItemSummary"
+ }
+ ],
+ "x-nullable": true,
+ "x-omitempty": true
+ },
+ "purchaseFrom": {
+ "type": "string"
+ },
+ "purchasePrice": {
+ "type": "number"
+ },
+ "purchaseTime": {
+ "description": "Purchase",
+ "type": "string"
+ },
+ "quantity": {
+ "type": "integer"
+ },
+ "serialNumber": {
+ "type": "string"
+ },
+ "soldNotes": {
+ "type": "string"
+ },
+ "soldPrice": {
+ "type": "number"
+ },
+ "soldTime": {
+ "description": "Sold",
+ "type": "string"
+ },
+ "soldTo": {
+ "type": "string"
+ },
+ "syncChildItemsLocations": {
+ "type": "boolean"
+ },
+ "thumbnailId": {
+ "type": "string",
+ "x-nullable": true,
+ "x-omitempty": true
+ },
+ "updatedAt": {
+ "type": "string"
+ },
+ "warrantyDetails": {
+ "type": "string"
+ },
+ "warrantyExpires": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.ItemPatch": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "quantity": {
+ "type": "integer",
+ "x-nullable": true,
+ "x-omitempty": true
+ }
+ }
+ },
+ "repo.ItemPath": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "type": {
+ "$ref": "#/definitions/repo.ItemType"
+ }
+ }
+ },
+ "repo.ItemSummary": {
+ "type": "object",
+ "properties": {
+ "archived": {
+ "type": "boolean"
+ },
+ "assetId": {
+ "type": "string",
+ "example": "0"
+ },
+ "createdAt": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "imageId": {
+ "type": "string",
+ "x-nullable": true,
+ "x-omitempty": true
+ },
+ "insured": {
+ "type": "boolean"
+ },
+ "labels": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/repo.LabelSummary"
+ }
+ },
+ "location": {
+ "description": "Edges",
+ "allOf": [
+ {
+ "$ref": "#/definitions/repo.LocationSummary"
+ }
+ ],
+ "x-nullable": true,
+ "x-omitempty": true
+ },
+ "name": {
+ "type": "string"
+ },
+ "purchasePrice": {
+ "type": "number"
+ },
+ "quantity": {
+ "type": "integer"
+ },
+ "soldTime": {
+ "description": "Sale details",
+ "type": "string"
+ },
+ "thumbnailId": {
+ "type": "string",
+ "x-nullable": true,
+ "x-omitempty": true
+ },
+ "updatedAt": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.ItemType": {
+ "type": "string",
+ "enum": [
+ "location",
+ "item"
+ ],
+ "x-enum-varnames": [
+ "ItemTypeLocation",
+ "ItemTypeItem"
+ ]
+ },
+ "repo.ItemUpdate": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "archived": {
+ "type": "boolean"
+ },
+ "assetId": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 1000
+ },
+ "fields": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/repo.ItemField"
+ }
+ },
+ "id": {
+ "type": "string"
+ },
+ "insured": {
+ "type": "boolean"
+ },
+ "labelIds": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "lifetimeWarranty": {
+ "description": "Warranty",
+ "type": "boolean"
+ },
+ "locationId": {
+ "description": "Edges",
+ "type": "string"
+ },
+ "manufacturer": {
+ "type": "string"
+ },
+ "modelNumber": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 255,
+ "minLength": 1
+ },
+ "notes": {
+ "description": "Extras",
+ "type": "string"
+ },
+ "parentId": {
+ "type": "string",
+ "x-nullable": true,
+ "x-omitempty": true
+ },
+ "purchaseFrom": {
+ "type": "string",
+ "maxLength": 255
+ },
+ "purchasePrice": {
+ "type": "number",
+ "x-nullable": true,
+ "x-omitempty": true
+ },
+ "purchaseTime": {
+ "description": "Purchase",
+ "type": "string"
+ },
+ "quantity": {
+ "type": "integer"
+ },
+ "serialNumber": {
+ "description": "Identifications",
+ "type": "string"
+ },
+ "soldNotes": {
+ "type": "string"
+ },
+ "soldPrice": {
+ "type": "number",
+ "x-nullable": true,
+ "x-omitempty": true
+ },
+ "soldTime": {
+ "description": "Sold",
+ "type": "string"
+ },
+ "soldTo": {
+ "type": "string",
+ "maxLength": 255
+ },
+ "syncChildItemsLocations": {
+ "type": "boolean"
+ },
+ "warrantyDetails": {
+ "type": "string"
+ },
+ "warrantyExpires": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.LabelCreate": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "color": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 255
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 255,
+ "minLength": 1
+ }
+ }
+ },
+ "repo.LabelOut": {
+ "type": "object",
+ "properties": {
+ "color": {
+ "type": "string"
+ },
+ "createdAt": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "updatedAt": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.LabelSummary": {
+ "type": "object",
+ "properties": {
+ "color": {
+ "type": "string"
+ },
+ "createdAt": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "updatedAt": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.LocationCreate": {
+ "type": "object",
+ "properties": {
+ "description": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "parentId": {
+ "type": "string",
+ "x-nullable": true
+ }
+ }
+ },
+ "repo.LocationOut": {
+ "type": "object",
+ "properties": {
+ "children": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/repo.LocationSummary"
+ }
+ },
+ "createdAt": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "parent": {
+ "$ref": "#/definitions/repo.LocationSummary"
+ },
+ "totalPrice": {
+ "type": "number"
+ },
+ "updatedAt": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.LocationOutCount": {
+ "type": "object",
+ "properties": {
+ "createdAt": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "itemCount": {
+ "type": "integer"
+ },
+ "name": {
+ "type": "string"
+ },
+ "updatedAt": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.LocationSummary": {
+ "type": "object",
+ "properties": {
+ "createdAt": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "updatedAt": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.LocationUpdate": {
+ "type": "object",
+ "properties": {
+ "description": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "parentId": {
+ "type": "string",
+ "x-nullable": true
+ }
+ }
+ },
+ "repo.MaintenanceEntry": {
+ "type": "object",
+ "properties": {
+ "completedDate": {
+ "type": "string"
+ },
+ "cost": {
+ "type": "string",
+ "example": "0"
+ },
+ "description": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "scheduledDate": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.MaintenanceEntryCreate": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "completedDate": {
+ "type": "string"
+ },
+ "cost": {
+ "type": "string",
+ "example": "0"
+ },
+ "description": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "scheduledDate": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.MaintenanceEntryUpdate": {
+ "type": "object",
+ "properties": {
+ "completedDate": {
+ "type": "string"
+ },
+ "cost": {
+ "type": "string",
+ "example": "0"
+ },
+ "description": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "scheduledDate": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.MaintenanceEntryWithDetails": {
+ "type": "object",
+ "properties": {
+ "completedDate": {
+ "type": "string"
+ },
+ "cost": {
+ "type": "string",
+ "example": "0"
+ },
+ "description": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "itemID": {
+ "type": "string"
+ },
+ "itemName": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "scheduledDate": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.MaintenanceFilterStatus": {
+ "type": "string",
+ "enum": [
+ "scheduled",
+ "completed",
+ "both"
+ ],
+ "x-enum-varnames": [
+ "MaintenanceFilterStatusScheduled",
+ "MaintenanceFilterStatusCompleted",
+ "MaintenanceFilterStatusBoth"
+ ]
+ },
+ "repo.NotifierCreate": {
+ "type": "object",
+ "required": [
+ "name",
+ "url"
+ ],
+ "properties": {
+ "isActive": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 255,
+ "minLength": 1
+ },
+ "url": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.NotifierOut": {
+ "type": "object",
+ "properties": {
+ "createdAt": {
+ "type": "string"
+ },
+ "groupId": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "isActive": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ },
+ "updatedAt": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ },
+ "userId": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.NotifierUpdate": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "isActive": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 255,
+ "minLength": 1
+ },
+ "url": {
+ "type": "string",
+ "x-nullable": true
+ }
+ }
+ },
+ "repo.PaginationResult-repo_ItemSummary": {
+ "type": "object",
+ "properties": {
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/repo.ItemSummary"
+ }
+ },
+ "page": {
+ "type": "integer"
+ },
+ "pageSize": {
+ "type": "integer"
+ },
+ "total": {
+ "type": "integer"
+ }
+ }
+ },
+ "repo.TotalsByOrganizer": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "total": {
+ "type": "number"
+ }
+ }
+ },
+ "repo.TreeItem": {
+ "type": "object",
+ "properties": {
+ "children": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/repo.TreeItem"
+ }
+ },
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.UserOut": {
+ "type": "object",
+ "properties": {
+ "email": {
+ "type": "string"
+ },
+ "groupId": {
+ "type": "string"
+ },
+ "groupName": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "isOwner": {
+ "type": "boolean"
+ },
+ "isSuperuser": {
+ "type": "boolean"
+ },
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.UserUpdate": {
+ "type": "object",
+ "properties": {
+ "email": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "repo.ValueOverTime": {
+ "type": "object",
+ "properties": {
+ "end": {
+ "type": "string"
+ },
+ "entries": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/repo.ValueOverTimeEntry"
+ }
+ },
+ "start": {
+ "type": "string"
+ },
+ "valueAtEnd": {
+ "type": "number"
+ },
+ "valueAtStart": {
+ "type": "number"
+ }
+ }
+ },
+ "repo.ValueOverTimeEntry": {
+ "type": "object",
+ "properties": {
+ "date": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "value": {
+ "type": "number"
+ }
+ }
+ },
+ "services.Latest": {
+ "type": "object",
+ "properties": {
+ "date": {
+ "type": "string"
+ },
+ "version": {
+ "type": "string"
+ }
+ }
+ },
+ "services.UserRegistration": {
+ "type": "object",
+ "properties": {
+ "email": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "password": {
+ "type": "string"
+ },
+ "token": {
+ "type": "string"
+ }
+ }
+ },
+ "user.Role": {
+ "type": "string",
+ "enum": [
+ "user",
+ "user",
+ "owner"
+ ],
+ "x-enum-varnames": [
+ "DefaultRole",
+ "RoleUser",
+ "RoleOwner"
+ ]
+ },
+ "v1.APISummary": {
+ "type": "object",
+ "properties": {
+ "allowRegistration": {
+ "type": "boolean"
+ },
+ "build": {
+ "$ref": "#/definitions/v1.Build"
+ },
+ "demo": {
+ "type": "boolean"
+ },
+ "health": {
+ "type": "boolean"
+ },
+ "labelPrinting": {
+ "type": "boolean"
+ },
+ "latest": {
+ "$ref": "#/definitions/services.Latest"
+ },
+ "message": {
+ "type": "string"
+ },
+ "title": {
+ "type": "string"
+ },
+ "versions": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "v1.ActionAmountResult": {
+ "type": "object",
+ "properties": {
+ "completed": {
+ "type": "integer"
+ }
+ }
+ },
+ "v1.Build": {
+ "type": "object",
+ "properties": {
+ "buildTime": {
+ "type": "string"
+ },
+ "commit": {
+ "type": "string"
+ },
+ "version": {
+ "type": "string"
+ }
+ }
+ },
+ "v1.ChangePassword": {
+ "type": "object",
+ "properties": {
+ "current": {
+ "type": "string"
+ },
+ "new": {
+ "type": "string"
+ }
+ }
+ },
+ "v1.GroupInvitation": {
+ "type": "object",
+ "properties": {
+ "expiresAt": {
+ "type": "string"
+ },
+ "token": {
+ "type": "string"
+ },
+ "uses": {
+ "type": "integer"
+ }
+ }
+ },
+ "v1.GroupInvitationCreate": {
+ "type": "object",
+ "required": [
+ "uses"
+ ],
+ "properties": {
+ "expiresAt": {
+ "type": "string"
+ },
+ "uses": {
+ "type": "integer",
+ "maximum": 100,
+ "minimum": 1
+ }
+ }
+ },
+ "v1.ItemAttachmentToken": {
+ "type": "object",
+ "properties": {
+ "token": {
+ "type": "string"
+ }
+ }
+ },
+ "v1.LoginForm": {
+ "type": "object",
+ "properties": {
+ "password": {
+ "type": "string",
+ "example": "admin"
+ },
+ "stayLoggedIn": {
+ "type": "boolean"
+ },
+ "username": {
+ "type": "string",
+ "example": "admin@admin.com"
+ }
+ }
+ },
+ "v1.TokenResponse": {
+ "type": "object",
+ "properties": {
+ "attachmentToken": {
+ "type": "string"
+ },
+ "expiresAt": {
+ "type": "string"
+ },
+ "token": {
+ "type": "string"
+ }
+ }
+ },
+ "v1.Wrapped": {
+ "type": "object",
+ "properties": {
+ "item": {}
+ }
+ },
+ "validate.ErrorResponse": {
+ "type": "object",
+ "properties": {
+ "error": {
+ "type": "string"
+ },
+ "fields": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "securityDefinitions": {
+ "Bearer": {
+ "description": "\"Type 'Bearer TOKEN' to correctly set the API Key\"",
+ "type": "apiKey",
+ "name": "Authorization",
+ "in": "header"
+ }
+ }
+}
\ No newline at end of file
diff --git a/tech_spec/project_structure.txt b/tech_spec/project_structure.txt
new file mode 100644
index 0000000..dbcd635
--- /dev/null
+++ b/tech_spec/project_structure.txt
@@ -0,0 +1,117 @@
+
+
+
+ Main application module, contains UI and application entry points.
+
+ The main and only Activity of the application, hosts the NavHost.
+
+
+ Application class, used for Hilt dependency injection setup.
+
+
+ Hilt module for application-wide dependencies.
+
+
+ Defines the navigation graph for the entire application using Jetpack Compose Navigation.
+
+
+ Defines the routes for all screens in the app as a sealed class.
+
+
+ UI for the Dashboard screen.
+
+
+ ViewModel for the Dashboard screen, handles business logic.
+
+
+ UI for the Inventory List screen.
+
+
+ ViewModel for the Inventory List screen.
+
+
+ UI for the Item Details screen.
+
+
+ ViewModel for the Item Details screen.
+
+
+ UI for the Item Edit screen.
+
+
+ ViewModel for the Item Edit screen.
+
+
+ UI for the Labels List screen.
+
+
+ ViewModel for the Labels List screen.
+
+
+ UI for the Locations List screen.
+
+
+ ViewModel for the Locations List screen.
+
+
+ UI for the Search screen.
+
+
+ ViewModel for the Search screen.
+
+
+
+ Data layer, responsible for data sources (network, local DB) and repository implementations.
+
+ Retrofit service interface for the Homebox API.
+
+
+ Room database definition for local caching.
+
+
+ Implementation of the ItemRepository, coordinating data from API and local DB.
+
+
+ Hilt module for providing network-related dependencies (Retrofit, OkHttp).
+
+
+ Hilt module for providing database-related dependencies (Room DB, DAOs).
+
+
+ Hilt module for binding repository interfaces to their implementations.
+
+
+
+ Domain layer, contains business logic, use cases, and repository interfaces. Pure Kotlin module.
+
+ Interface defining the contract for data operations related to items.
+
+
+ Use case for creating a new item.
+
+
+ Use case for deleting an item.
+
+
+ Use case for getting all labels.
+
+
+ Use case for getting all locations.
+
+
+ Use case for getting the details of a single item.
+
+
+ Use case for getting inventory statistics.
+
+
+ Use case for searching items.
+
+
+ Use case for syncing the local inventory with the remote server.
+
+
+ Use case for updating an existing item.
+
+
+
\ No newline at end of file
diff --git a/tech_spec/tech_spec.txt b/tech_spec/tech_spec.txt
new file mode 100644
index 0000000..c220b4b
--- /dev/null
+++ b/tech_spec/tech_spec.txt
@@ -0,0 +1,130 @@
+
+
+
+ Homebox Lens
+ An Android client for the Homebox inventory management system. It allows users to manage their inventory by interacting with a Homebox server instance.
+
+
+
+
+ Dashboard Screen
+ Displays a summary of the inventory, including statistics like total items, total value, and counts by location/label.
+
+
+
+ Fetch and display statistics
+ Retrieves overall inventory statistics from the server.
+
+
+
+
+
+
+ Inventory List Screen
+ Displays a searchable and filterable list of all inventory items.
+
+
+
+ Search and filter items
+ Searches for items based on a query string and filters. The results are paginated.
+
+
+
+ Sync Inventory
+ Performs a full synchronization of the local inventory cache with the server.
+
+
+
+
+
+
+ Item Details Screen
+ Shows all details for a single inventory item, including its name, description, images, attachments, and custom fields.
+
+
+
+ Fetch Item Details
+ Retrieves the full details for a specific item from the repository.
+
+
+
+
+
+
+ Create/Edit/Delete Items
+ Allows users to create new items, update existing ones, and delete them.
+
+
+
+ Create Item
+ Creates a new inventory item on the server.
+
+
+
+ Update Item
+ Updates an existing inventory item on the server.
+
+
+
+ Delete Item
+ Deletes an inventory item from the server.
+
+
+
+
+
+
+ Manage Labels and Locations
+ Allows users to view lists of all available labels and locations.
+
+
+
+
+ Get All Labels
+ Retrieves a list of all labels from the repository.
+
+
+
+ Get All Locations
+ Retrieves a list of all locations from the repository.
+
+
+
+
+
+
+ Search Screen
+ Provides a dedicated UI for searching items.
+
+
+
+ Search from dedicated screen
+ Uses the same search functionality but from a dedicated screen.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file