aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/traccar/helper
diff options
context:
space:
mode:
authorAnton Tananaev <anton@traccar.org>2023-03-26 06:54:29 -0700
committerAnton Tananaev <anton@traccar.org>2023-03-26 06:54:29 -0700
commit3082f7b3e5bfd00ec6f6801222060dfc0d10b7e0 (patch)
tree688ca698b70bb18aa79bf0f0434923857c26dca4 /src/main/java/org/traccar/helper
parente6960c3d49025eb63243052e4c7aedde9955fe40 (diff)
downloadtrackermap-server-3082f7b3e5bfd00ec6f6801222060dfc0d10b7e0.tar.gz
trackermap-server-3082f7b3e5bfd00ec6f6801222060dfc0d10b7e0.tar.bz2
trackermap-server-3082f7b3e5bfd00ec6f6801222060dfc0d10b7e0.zip
Implement group commands
Diffstat (limited to 'src/main/java/org/traccar/helper')
-rw-r--r--src/main/java/org/traccar/helper/model/DeviceUtil.java48
1 files changed, 47 insertions, 1 deletions
diff --git a/src/main/java/org/traccar/helper/model/DeviceUtil.java b/src/main/java/org/traccar/helper/model/DeviceUtil.java
index 597078caf..5d8cb5f25 100644
--- a/src/main/java/org/traccar/helper/model/DeviceUtil.java
+++ b/src/main/java/org/traccar/helper/model/DeviceUtil.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2022 Anton Tananaev (anton@traccar.org)
+ * Copyright 2022 - 2023 Anton Tananaev (anton@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,11 +16,20 @@
package org.traccar.helper.model;
import org.traccar.model.Device;
+import org.traccar.model.Group;
+import org.traccar.model.User;
import org.traccar.storage.Storage;
import org.traccar.storage.StorageException;
import org.traccar.storage.query.Columns;
+import org.traccar.storage.query.Condition;
import org.traccar.storage.query.Request;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
public final class DeviceUtil {
private DeviceUtil() {
@@ -30,4 +39,41 @@ public final class DeviceUtil {
storage.updateObject(new Device(), new Request(new Columns.Include("status")));
}
+
+ public static Collection<Device> getAccessibleDevices(
+ Storage storage, long userId,
+ Collection<Long> deviceIds, Collection<Long> groupIds) throws StorageException {
+
+ var devices = storage.getObjects(Device.class, new Request(
+ new Columns.All(),
+ new Condition.Permission(User.class, userId, Device.class)));
+ var deviceById = devices.stream()
+ .collect(Collectors.toUnmodifiableMap(Device::getId, x -> x));
+ var devicesByGroup = devices.stream()
+ .filter(x -> x.getGroupId() > 0)
+ .collect(Collectors.groupingBy(Device::getGroupId));
+
+ var groups = storage.getObjects(Group.class, new Request(
+ new Columns.All(),
+ new Condition.Permission(User.class, userId, Group.class)));
+ var groupsByGroup = groups.stream()
+ .filter(x -> x.getGroupId() > 0)
+ .collect(Collectors.groupingBy(Group::getGroupId));
+
+ var results = deviceIds.stream()
+ .map(deviceById::get)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toSet());
+
+ var groupQueue = new LinkedList<>(groupIds);
+ while (!groupQueue.isEmpty()) {
+ long groupId = groupQueue.pop();
+ results.addAll(devicesByGroup.getOrDefault(groupId, Collections.emptyList()));
+ groupQueue.addAll(groupsByGroup.getOrDefault(groupId, Collections.emptyList())
+ .stream().map(Group::getId).collect(Collectors.toUnmodifiableList()));
+ }
+
+ return results;
+ }
+
}