From 2555a942ec0a989c1ceb217cda7e43de1d164e6e Mon Sep 17 00:00:00 2001 From: Jens Reinemann Date: Sun, 17 May 2026 00:42:03 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20Server-App=20WebSocket-Kompatibilit?= =?UTF-8?q?=C3=A4t=20und=20DELETE-Route?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - WebSocketManager: inventory_updated -> inventoryUpdated, full_sync_required -> fullSyncRequired (camelCase wie App erwartet) - InventoryRoutes: DELETE /api/inventory/items/{id} hinzugefügt - InventoryRepository: deleteItem(inventoryId, itemId) implementiert --- .../server/repository/InventoryRepository.kt | 9 +++++++++ .../server/routes/InventoryRoutes.kt | 16 ++++++++++++++++ .../server/websocket/WebSocketManager.kt | 4 ++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/server/src/main/kotlin/de/krisenvorrat/server/repository/InventoryRepository.kt b/server/src/main/kotlin/de/krisenvorrat/server/repository/InventoryRepository.kt index b9be272..07f8265 100644 --- a/server/src/main/kotlin/de/krisenvorrat/server/repository/InventoryRepository.kt +++ b/server/src/main/kotlin/de/krisenvorrat/server/repository/InventoryRepository.kt @@ -203,4 +203,13 @@ internal class InventoryRepository { updated > 0 } } + + fun deleteItem(inventoryId: String, itemId: String): Boolean { + return transaction { + val deleted = Items.deleteWhere { + (Items.id eq itemId) and (Items.inventoryId eq inventoryId) + } + deleted > 0 + } + } } diff --git a/server/src/main/kotlin/de/krisenvorrat/server/routes/InventoryRoutes.kt b/server/src/main/kotlin/de/krisenvorrat/server/routes/InventoryRoutes.kt index b190549..92c4b26 100644 --- a/server/src/main/kotlin/de/krisenvorrat/server/routes/InventoryRoutes.kt +++ b/server/src/main/kotlin/de/krisenvorrat/server/routes/InventoryRoutes.kt @@ -52,6 +52,22 @@ internal fun Route.inventoryRoutes( call.respond(HttpStatusCode.OK, item) } } + + delete("/items/{id}") { + val userId = call.principal()?.userId + ?: return@delete call.respond(HttpStatusCode.Unauthorized, ErrorResponse(status = 401, message = "Unauthorized")) + val inventoryId = repository.getEffectiveInventoryId(userId) + val itemId = call.parameters["id"] ?: return@delete call.respond( + HttpStatusCode.BadRequest, ErrorResponse(status = 400, message = "Missing item id") + ) + val deleted = repository.deleteItem(inventoryId, itemId) + if (!deleted) { + call.respond(HttpStatusCode.NotFound, ErrorResponse(status = 404, message = "Item not found")) + } else { + wsManager.notifyInventoryUpdated(userId, itemId) + call.respond(HttpStatusCode.NoContent) + } + } } } diff --git a/server/src/main/kotlin/de/krisenvorrat/server/websocket/WebSocketManager.kt b/server/src/main/kotlin/de/krisenvorrat/server/websocket/WebSocketManager.kt index 89b5fbf..c401601 100644 --- a/server/src/main/kotlin/de/krisenvorrat/server/websocket/WebSocketManager.kt +++ b/server/src/main/kotlin/de/krisenvorrat/server/websocket/WebSocketManager.kt @@ -26,7 +26,7 @@ internal class WebSocketManager { suspend fun notifyInventoryUpdated(userId: String, itemId: String) { val payload = buildJsonObject { - put("type", "inventory_updated") + put("type", "inventoryUpdated") put("itemId", itemId) put("timestamp", System.currentTimeMillis()) } @@ -35,7 +35,7 @@ internal class WebSocketManager { suspend fun notifyFullSyncRequired(userId: String) { val payload = buildJsonObject { - put("type", "full_sync_required") + put("type", "fullSyncRequired") put("timestamp", System.currentTimeMillis()) } broadcast(userId, Json.encodeToString(payload))