From 6d5066e26a8c2bc472313877b33c44b82fcc08d9 Mon Sep 17 00:00:00 2001 From: Jens Reinemann Date: Mon, 18 May 2026 18:53:21 +0200 Subject: [PATCH] fix(sync): notify all co-users on inventory mutations (PATCH/DELETE/PUT) --- .../de/bollwerk/server/repository/InventoryRepository.kt | 9 +++++++++ .../kotlin/de/bollwerk/server/routes/InventoryRoutes.kt | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/server/src/main/kotlin/de/bollwerk/server/repository/InventoryRepository.kt b/server/src/main/kotlin/de/bollwerk/server/repository/InventoryRepository.kt index 069f550..7fd08b5 100644 --- a/server/src/main/kotlin/de/bollwerk/server/repository/InventoryRepository.kt +++ b/server/src/main/kotlin/de/bollwerk/server/repository/InventoryRepository.kt @@ -93,6 +93,15 @@ internal class InventoryRepository { Inventories.deleteWhere { Inventories.id eq inventoryId } } + /** + * Returns all userIds that are assigned to the given inventory. + */ + fun getUsersForInventory(inventoryId: String): List = transaction { + Users.selectAll() + .where { Users.inventoryId eq inventoryId } + .map { it[Users.id] } + } + /** * Returns all inventories visible to the given user, marking the user's active one. */ diff --git a/server/src/main/kotlin/de/bollwerk/server/routes/InventoryRoutes.kt b/server/src/main/kotlin/de/bollwerk/server/routes/InventoryRoutes.kt index 4da840d..0596b80 100644 --- a/server/src/main/kotlin/de/bollwerk/server/routes/InventoryRoutes.kt +++ b/server/src/main/kotlin/de/bollwerk/server/routes/InventoryRoutes.kt @@ -112,6 +112,9 @@ internal fun Route.inventoryRoutes( repository.saveInventory(inventoryId, inventory) val saved = repository.loadInventory(inventoryId) wsManager.notifyFullSyncRequired(userId) + repository.getUsersForInventory(inventoryId) + .filter { it != userId } + .forEach { wsManager.notifyFullSyncRequired(it) } call.respond(HttpStatusCode.OK, saved) } @@ -136,6 +139,9 @@ internal fun Route.inventoryRoutes( } else { val item = repository.loadItem(inventoryId, itemId)!! wsManager.notifyInventoryUpdated(userId, itemId) + repository.getUsersForInventory(inventoryId) + .filter { it != userId } + .forEach { wsManager.notifyInventoryUpdated(it, itemId) } call.respond(HttpStatusCode.OK, item) } } @@ -152,6 +158,9 @@ internal fun Route.inventoryRoutes( call.respond(HttpStatusCode.NotFound, ErrorResponse(status = 404, message = "Item not found")) } else { wsManager.notifyInventoryUpdated(userId, itemId) + repository.getUsersForInventory(inventoryId) + .filter { it != userId } + .forEach { wsManager.notifyInventoryUpdated(it, itemId) } call.respond(HttpStatusCode.NoContent) } }