From 8bf0790fca401627003282ea57af1474d005aead Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Wed, 22 Oct 2025 22:45:14 +0200 Subject: [PATCH] refactored location patching Signed-off-by: Stephan Richter --- .../umbrella/core/model/DbLocation.java | 23 ++++++++++++-- frontend/src/routes/stock/Index.svelte | 10 ++---- .../umbrella/stock/StockModule.java | 31 ++++++++++++------- 3 files changed, 42 insertions(+), 22 deletions(-) diff --git a/core/src/main/java/de/srsoftware/umbrella/core/model/DbLocation.java b/core/src/main/java/de/srsoftware/umbrella/core/model/DbLocation.java index 87e9b58..26a9ae7 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/model/DbLocation.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/model/DbLocation.java @@ -4,6 +4,8 @@ package de.srsoftware.umbrella.core.model; import static de.srsoftware.umbrella.core.Constants.*; import de.srsoftware.umbrella.core.api.Owner; +import org.json.JSONObject; + import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashSet; @@ -59,9 +61,24 @@ public class DbLocation extends Location { return parentLocationId; } - public DbLocation parent(DbLocation newParent) { - parentLocationId = newParent.id(); - dirtyFields.add(PARENT_LOCATION_ID); + public DbLocation patch(JSONObject json) { + for (var field : json.keySet()){ + boolean known = true; + switch (field) { + case PARENT_LOCATION_ID: + parentLocationId = json.getLong(field); + break; + case NAME: + name = json.getString(NAME); + break; + case DESCRIPTION: + description = json.getString(DESCRIPTION); + break; + default: + known = false; + } + if (known) dirtyFields.add(field); + } return this; } diff --git a/frontend/src/routes/stock/Index.svelte b/frontend/src/routes/stock/Index.svelte index 2be4886..5107bc2 100644 --- a/frontend/src/routes/stock/Index.svelte +++ b/frontend/src/routes/stock/Index.svelte @@ -60,8 +60,8 @@ } async function move_dragged_to(new_loc){ - const data = draggedItem ? { item : draggedItem.id, target: new_loc.id } : { location : draggedLocation.id, target: new_loc.id } - const url = api(draggedItem ? 'stock/move_item' : 'stock/move_location'); + const data = draggedItem ? { item : draggedItem.id, target: new_loc.id } : { parent_location_id: new_loc.id } + const url = api(draggedItem ? 'stock/move_item' : `stock/location/${draggedLocation.id}`); const res = await fetch(url,{ credentials : 'include', method : 'PATCH', @@ -125,10 +125,6 @@ onMount(load); - -

{t('Stock')}

@@ -169,4 +165,4 @@
{/if} {/await} -
\ No newline at end of file + diff --git a/stock/src/main/java/de/srsoftware/umbrella/stock/StockModule.java b/stock/src/main/java/de/srsoftware/umbrella/stock/StockModule.java index 6bd164b..0b31807 100644 --- a/stock/src/main/java/de/srsoftware/umbrella/stock/StockModule.java +++ b/stock/src/main/java/de/srsoftware/umbrella/stock/StockModule.java @@ -114,7 +114,15 @@ public class StockModule extends BaseHandler implements StockService { if (user.isEmpty()) return unauthorized(ex); return switch (path.pop()){ case MOVE_ITEM -> patchMoveItem(user.get(), path,ex); - case MOVE_LOCATION -> patchMoveLocation(user.get(), path, ex); + case LOCATION -> { + try { + var id = Long.parseLong(path.pop()); + yield patchLocation(id, user.get(), ex); + } catch (NumberFormatException nfe){ + yield super.doPatch(path,ex); + } + + } case null -> patchItem(user.get(),ex); default -> super.doPatch(path,ex); }; @@ -233,21 +241,20 @@ public class StockModule extends BaseHandler implements StockService { return sendContent(ex,item); } - private boolean patchMoveLocation(UmbrellaUser user, Path path, HttpExchange ex) throws IOException { + private boolean patchLocation(long locationId, UmbrellaUser user, HttpExchange ex) throws IOException { var json = json(ex); - if (!(json.get(LOCATION) instanceof Number locationId)) throw missingFieldException(LOCATION); - if (!(json.get(TARGET) instanceof Number destLocationId)) throw missingFieldException(TARGET); - var location = stockDb.loadLocation(locationId.longValue()); - + var location = stockDb.loadLocation(locationId); var owner = location.owner().resolve(); - if (!assigned(owner,user)) throw forbidden("You are not allowed to alter the location of \"{0}\"!",location.name()); + if (!assigned(owner,user)) throw forbidden("You are not allowed to edit \"{0}\"!",location.name()); - var target = stockDb.loadLocation(destLocationId.longValue()); - var locOwner = target.resolve().owner().resolve(); - if (!assigned(locOwner,user)) throw forbidden("You are not allowed to modify \"{0}\"!",target.name()); + if (json.has(PARENT_LOCATION_ID) && json.get(PARENT_LOCATION_ID) instanceof Number parentId){ + var target = stockDb.loadLocation(parentId.longValue()); + var targetOwner = target.owner().resolve(); + if (!assigned(targetOwner,user)) throw forbidden("You are not allowed to edit \"{0}\"!",target.name()); + if (!targetOwner.equals(owner)) throw unprocessable("You may not move locations from one owner ({0}) to another ({1})",owner,targetOwner); + } - if (!locOwner.equals(owner)) throw unprocessable("You may not move locations from one owner ({0}) to another ({1})",owner,locOwner); - location = stockDb.save(location.parent(target)); + location = stockDb.save(location.patch(json)); return sendContent(ex,location); }