From 0f7fb99eaa79d34b505be7f8e7ee7daa69d82af5 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Mon, 17 Nov 2025 00:37:45 +0100 Subject: [PATCH] preparing direct loading of items current state: - loading of item implemented on backend - need to post path information - could be resolved re-using _getLocationEntities_, but that would include the full data of all items at that location, which is probably not required Signed-off-by: Stephan Richter --- frontend/src/routes/stock/Index.svelte | 13 +++++++ .../srsoftware/umbrella/stock/SqliteDb.java | 31 +++++++++++++---- .../de/srsoftware/umbrella/stock/StockDb.java | 2 ++ .../umbrella/stock/StockModule.java | 34 +++++++++++++++++++ 4 files changed, 74 insertions(+), 6 deletions(-) diff --git a/frontend/src/routes/stock/Index.svelte b/frontend/src/routes/stock/Index.svelte index 169c740..24eabab 100644 --- a/frontend/src/routes/stock/Index.svelte +++ b/frontend/src/routes/stock/Index.svelte @@ -92,6 +92,12 @@ } } + async function loadItem(){ + if (!item_id) return; + const url = api(`stock/${owner}/${owner_id}/item/${item_id}`); + const res = await get(url); + } + async function loadPath(){ if (!location_id) return; const url = api(`stock/location/${location_id}`); @@ -140,6 +146,7 @@ async function load(){ await loadUserLocations(); + loadItem(); loadPath(); loadProperties(); } @@ -244,4 +251,10 @@ {/if} {/await} + + +
+
+        {JSON.stringify({owner,owner_id,item_id},null,2)}
+    
\ No newline at end of file diff --git a/stock/src/main/java/de/srsoftware/umbrella/stock/SqliteDb.java b/stock/src/main/java/de/srsoftware/umbrella/stock/SqliteDb.java index 3b6786d..d545f03 100644 --- a/stock/src/main/java/de/srsoftware/umbrella/stock/SqliteDb.java +++ b/stock/src/main/java/de/srsoftware/umbrella/stock/SqliteDb.java @@ -211,21 +211,40 @@ public class SqliteDb extends BaseDb implements StockDb { while (rs.next()) list.add(Item.of(rs)); rs.close(); - for (var item : list){ - rs = select(ALL).from(TABLE_ITEM_PROPERTIES).leftJoin(PROPERTY_ID,TABLE_PROPERTIES,ID).where(ITEM_ID,equal(item.id())).exec(db); - while (rs.next()) item.properties().add(Property.of(rs)); - rs.close(); - } + for (var item : list) loadProperties(item); return list; } catch (SQLException e){ throw databaseException("Failed to load items at {0}",location); } } + @Override + public Item loadProperties(Item item){ + try { + var rs = select(ALL).from(TABLE_ITEM_PROPERTIES).leftJoin(PROPERTY_ID, TABLE_PROPERTIES, ID).where(ITEM_ID, equal(item.id())).exec(db); + while (rs.next()) item.properties().add(Property.of(rs)); + rs.close(); + return item; + } catch (SQLException e){ + throw databaseException("Failed to load properties of {0}",item.name()); + } + } + @Override public Item loadItem(long id) { + var query = select(ALL).from(TABLE_ITEMS).where(ID,equal(id)); + return loadItem(query); + } + + @Override + public Item loadItem(String owner, long itemNumber) { + var query = select(ALL).from(TABLE_ITEMS).where(OWNER,equal(owner)).where(OWNER_NUMBER,equal(itemNumber)); + return loadItem(query); + } + + private Item loadItem(SelectQuery query){ try { - var rs = select(ALL).from(TABLE_ITEMS).where(ID,equal(id)).exec(db); + var rs = query.exec(db); Item result = null; if (rs.next()) result = Item.of(rs); rs.close(); diff --git a/stock/src/main/java/de/srsoftware/umbrella/stock/StockDb.java b/stock/src/main/java/de/srsoftware/umbrella/stock/StockDb.java index 9fb746c..017e003 100644 --- a/stock/src/main/java/de/srsoftware/umbrella/stock/StockDb.java +++ b/stock/src/main/java/de/srsoftware/umbrella/stock/StockDb.java @@ -16,7 +16,9 @@ public interface StockDb { Collection listProperties(); Collection listUserLocations(UmbrellaUser userId); Item loadItem(long id); + Item loadItem(String owner, long itemNumber); DbLocation loadLocation(long locationId); + Item loadProperties(Item item); long nextItemNumberFor(Owner owner); Map pathToLocation(Location location); DbLocation save(DbLocation location); 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 26cd4d9..73b60d5 100644 --- a/stock/src/main/java/de/srsoftware/umbrella/stock/StockModule.java +++ b/stock/src/main/java/de/srsoftware/umbrella/stock/StockModule.java @@ -90,6 +90,14 @@ public class StockModule extends BaseHandler implements StockService { if (user.isEmpty()) return unauthorized(ex); var head = path.pop(); return switch (head) { + case COMPANY -> { + try { + var company = companyService().get(Long.parseLong(path.pop())); + yield getItem(user.get(),company,path,ex); + } catch (NumberFormatException e){ + yield super.doGet(path,ex); + } + } case LOCATION -> { try { var location = Location.of(Long.parseLong(path.pop())); @@ -100,6 +108,15 @@ public class StockModule extends BaseHandler implements StockService { } case LOCATIONS -> getLocations(path,user.get(),ex); case PROPERTIES -> getProperties(ex); + case USER -> { + try { + var userId = Long.parseLong(path.pop()); + if (userId != user.get().id()) throw forbidden("You are not allowed to access items of another user!"); + yield getItem(user.get(),user.get(),path,ex); + } catch (NumberFormatException e){ + yield super.doGet(path,ex); + } + } case null, default -> super.doGet(path,ex); }; } catch (UmbrellaException e){ @@ -157,6 +174,23 @@ public class StockModule extends BaseHandler implements StockService { return sendContent(ex, stockDb.listChildLocations(parentId).stream().sorted(comparing(l -> l.name().toLowerCase())).map(DbLocation::toMap)); } + private boolean getItem(UmbrellaUser user, Owner owner, Path path, HttpExchange ex) throws IOException { + if (!assigned(owner,user)) throw forbidden("You are not allowed to access items of {0}",owner); + return switch (path.pop()){ + case ITEM -> { + try { + var itemId = Long.parseLong(path.pop()); + var item = stockDb.loadItem(owner.dbCode(),itemId); + stockDb.loadProperties(item); + yield sendContent(ex,item); + } catch (NumberFormatException e) { + yield super.doGet(path,ex); + } + } + case null, default -> super.doGet(path,ex); + }; + } + private boolean getLocationEntities(Location location, HttpExchange ex) throws IOException { var items = stockDb.listItemsAt(location).stream().map(Item::toMap).toList(); var owner = location.resolve().owner();