refactored location patching
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
@@ -4,6 +4,8 @@ package de.srsoftware.umbrella.core.model;
|
|||||||
import static de.srsoftware.umbrella.core.Constants.*;
|
import static de.srsoftware.umbrella.core.Constants.*;
|
||||||
|
|
||||||
import de.srsoftware.umbrella.core.api.Owner;
|
import de.srsoftware.umbrella.core.api.Owner;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@@ -59,9 +61,24 @@ public class DbLocation extends Location {
|
|||||||
return parentLocationId;
|
return parentLocationId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DbLocation parent(DbLocation newParent) {
|
public DbLocation patch(JSONObject json) {
|
||||||
parentLocationId = newParent.id();
|
for (var field : json.keySet()){
|
||||||
dirtyFields.add(PARENT_LOCATION_ID);
|
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;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -60,8 +60,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function move_dragged_to(new_loc){
|
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 data = draggedItem ? { item : draggedItem.id, target: new_loc.id } : { parent_location_id: new_loc.id }
|
||||||
const url = api(draggedItem ? 'stock/move_item' : 'stock/move_location');
|
const url = api(draggedItem ? 'stock/move_item' : `stock/location/${draggedLocation.id}`);
|
||||||
const res = await fetch(url,{
|
const res = await fetch(url,{
|
||||||
credentials : 'include',
|
credentials : 'include',
|
||||||
method : 'PATCH',
|
method : 'PATCH',
|
||||||
@@ -125,10 +125,6 @@
|
|||||||
onMount(load);
|
onMount(load);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
|
||||||
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<h2>{t('Stock')}</h2>
|
<h2>{t('Stock')}</h2>
|
||||||
<div class="grid3">
|
<div class="grid3">
|
||||||
<div class="locations">
|
<div class="locations">
|
||||||
|
|||||||
@@ -114,7 +114,15 @@ public class StockModule extends BaseHandler implements StockService {
|
|||||||
if (user.isEmpty()) return unauthorized(ex);
|
if (user.isEmpty()) return unauthorized(ex);
|
||||||
return switch (path.pop()){
|
return switch (path.pop()){
|
||||||
case MOVE_ITEM -> patchMoveItem(user.get(), path,ex);
|
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);
|
case null -> patchItem(user.get(),ex);
|
||||||
default -> super.doPatch(path,ex);
|
default -> super.doPatch(path,ex);
|
||||||
};
|
};
|
||||||
@@ -233,21 +241,20 @@ public class StockModule extends BaseHandler implements StockService {
|
|||||||
return sendContent(ex,item);
|
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);
|
var json = json(ex);
|
||||||
if (!(json.get(LOCATION) instanceof Number locationId)) throw missingFieldException(LOCATION);
|
var location = stockDb.loadLocation(locationId);
|
||||||
if (!(json.get(TARGET) instanceof Number destLocationId)) throw missingFieldException(TARGET);
|
|
||||||
var location = stockDb.loadLocation(locationId.longValue());
|
|
||||||
|
|
||||||
var owner = location.owner().resolve();
|
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());
|
if (json.has(PARENT_LOCATION_ID) && json.get(PARENT_LOCATION_ID) instanceof Number parentId){
|
||||||
var locOwner = target.resolve().owner().resolve();
|
var target = stockDb.loadLocation(parentId.longValue());
|
||||||
if (!assigned(locOwner,user)) throw forbidden("You are not allowed to modify \"{0}\"!",target.name());
|
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.patch(json));
|
||||||
location = stockDb.save(location.parent(target));
|
|
||||||
return sendContent(ex,location);
|
return sendContent(ex,location);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user