From 6a77d7e673b1f13107d21408e75e5d9feb3614c3 Mon Sep 17 00:00:00 2001 From: jcardus Date: Thu, 8 Jul 2021 01:17:48 +0100 Subject: bulk permission update --- .../traccar/api/resource/PermissionsResource.java | 65 ++++++++++++++++------ 1 file changed, 49 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/main/java/org/traccar/api/resource/PermissionsResource.java b/src/main/java/org/traccar/api/resource/PermissionsResource.java index b89d9d376..1dbbfa190 100644 --- a/src/main/java/org/traccar/api/resource/PermissionsResource.java +++ b/src/main/java/org/traccar/api/resource/PermissionsResource.java @@ -17,7 +17,9 @@ package org.traccar.api.resource; import java.sql.SQLException; -import java.util.LinkedHashMap; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; @@ -55,30 +57,61 @@ public class PermissionsResource extends BaseResource { permission.getPropertyClass(), getUserId(), permission.getPropertyId()); } + private void refreshPermissions(List> entities) { + Set ownerProperty = new HashSet<>(); + entities.stream() + .map(e -> { + try { + return new Permission(e); + } catch (ClassNotFoundException classNotFoundException) { + classNotFoundException.printStackTrace(); + return null; + } + }) + .filter(Objects::nonNull) + .filter(p -> ownerProperty.add(p.getOwnerClass().getName() + p.getPropertyClass().getName())) + .forEach(p -> Context.getPermissionsManager().refreshPermissions(p)); + } + @POST public Response add(LinkedHashMap entity) throws SQLException, ClassNotFoundException { + return add(Stream.of(entity).collect(Collectors.toList())); + } + + @Path("bulk") + @POST + public Response add(List> entities) throws SQLException, ClassNotFoundException { Context.getPermissionsManager().checkReadonly(getUserId()); - Permission permission = new Permission(entity); - checkPermission(permission, true); - Context.getDataManager().linkObject(permission.getOwnerClass(), permission.getOwnerId(), - permission.getPropertyClass(), permission.getPropertyId(), true); - LogAction.link(getUserId(), permission.getOwnerClass(), permission.getOwnerId(), - permission.getPropertyClass(), permission.getPropertyId()); - Context.getPermissionsManager().refreshPermissions(permission); + for (LinkedHashMap entity: entities) { + Permission permission = new Permission(entity); + checkPermission(permission, true); + Context.getDataManager().linkObject(permission.getOwnerClass(), permission.getOwnerId(), + permission.getPropertyClass(), permission.getPropertyId(), true); + LogAction.link(getUserId(), permission.getOwnerClass(), permission.getOwnerId(), + permission.getPropertyClass(), permission.getPropertyId()); + } + refreshPermissions(entities); return Response.noContent().build(); } @DELETE public Response remove(LinkedHashMap entity) throws SQLException, ClassNotFoundException { + return remove(Stream.of(entity).collect(Collectors.toList())); + } + + @DELETE + @Path("bulk") + public Response remove(List> entities) throws SQLException, ClassNotFoundException { Context.getPermissionsManager().checkReadonly(getUserId()); - Permission permission = new Permission(entity); - checkPermission(permission, false); - Context.getDataManager().linkObject(permission.getOwnerClass(), permission.getOwnerId(), - permission.getPropertyClass(), permission.getPropertyId(), false); - LogAction.unlink(getUserId(), permission.getOwnerClass(), permission.getOwnerId(), - permission.getPropertyClass(), permission.getPropertyId()); - Context.getPermissionsManager().refreshPermissions(permission); + for (LinkedHashMap entity: entities) { + Permission permission = new Permission(entity); + checkPermission(permission, false); + Context.getDataManager().linkObject(permission.getOwnerClass(), permission.getOwnerId(), + permission.getPropertyClass(), permission.getPropertyId(), false); + LogAction.unlink(getUserId(), permission.getOwnerClass(), permission.getOwnerId(), + permission.getPropertyClass(), permission.getPropertyId()); + } + refreshPermissions(entities); return Response.noContent().build(); } - } -- cgit v1.2.3