This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit c4d7861ae0376a9a80bc5ed0b3b686fbee3a82f7
Author: Benoit TELLIER <btell...@linagora.com>
AuthorDate: Wed Nov 20 11:47:33 2024 +0100

    JAMES-4090 Allow disconnecting several user at once
    
    This allows doing so with a single pass onto the channels
---
 .../java/org/apache/james/DisconnectorNotifier.java |  4 +++-
 .../james/jmap/routes/EventSourceRoutes.scala       |  3 ++-
 .../apache/james/jmap/routes/WebSocketRoutes.scala  |  3 ++-
 .../protocols/webadmin/ProtocolServerRoutes.java    | 21 ++++++++++++++++++++-
 4 files changed, 27 insertions(+), 4 deletions(-)

diff --git 
a/server/data/data-api/src/main/java/org/apache/james/DisconnectorNotifier.java 
b/server/data/data-api/src/main/java/org/apache/james/DisconnectorNotifier.java
index e0f4b3786e..f65610f333 100644
--- 
a/server/data/data-api/src/main/java/org/apache/james/DisconnectorNotifier.java
+++ 
b/server/data/data-api/src/main/java/org/apache/james/DisconnectorNotifier.java
@@ -19,6 +19,8 @@
 
 package org.apache.james;
 
+import java.util.function.Predicate;
+
 import jakarta.inject.Inject;
 
 import org.apache.james.core.Disconnector;
@@ -34,7 +36,7 @@ public interface DisconnectorNotifier extends Disconnector {
         }
 
         @Override
-        public void disconnect(Username username) {
+        public void disconnect(Predicate<Username> username) {
             disconnector.disconnect(username);
         }
     }
diff --git 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/EventSourceRoutes.scala
 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/EventSourceRoutes.scala
index 0d530e2f3c..c67888bd24 100644
--- 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/EventSourceRoutes.scala
+++ 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/EventSourceRoutes.scala
@@ -21,7 +21,9 @@ package org.apache.james.jmap.routes
 
 import java.nio.charset.StandardCharsets
 import java.util.concurrent.atomic.AtomicReference
+import java.util.function.Predicate
 import java.util.stream
+
 import cats.implicits._
 import eu.timepit.refined.api.Refined
 import eu.timepit.refined.numeric.Positive
@@ -52,7 +54,6 @@ import reactor.core.scala.publisher.{SFlux, SMono}
 import reactor.core.scheduler.Schedulers
 import reactor.netty.http.server.{HttpServerRequest, HttpServerResponse}
 
-import java.util.function.Predicate
 import scala.concurrent.duration._
 import scala.jdk.CollectionConverters._
 import scala.language.postfixOps
diff --git 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/WebSocketRoutes.scala
 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/WebSocketRoutes.scala
index f2c9e7ee9d..2471f79e97 100644
--- 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/WebSocketRoutes.scala
+++ 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/WebSocketRoutes.scala
@@ -21,7 +21,9 @@ package org.apache.james.jmap.routes
 
 import java.nio.charset.StandardCharsets
 import java.util.concurrent.atomic.AtomicReference
+import java.util.function.Predicate
 import java.util.stream
+
 import io.netty.handler.codec.http.HttpHeaderNames.CONTENT_TYPE
 import io.netty.handler.codec.http.websocketx.WebSocketFrame
 import io.netty.handler.codec.http.{HttpHeaderNames, HttpMethod}
@@ -51,7 +53,6 @@ import reactor.core.scheduler.Schedulers
 import reactor.netty.http.server.{HttpServerRequest, HttpServerResponse}
 import reactor.netty.http.websocket.{WebsocketInbound, WebsocketOutbound}
 
-import java.util.function.Predicate
 import scala.jdk.CollectionConverters._
 
 object WebSocketRoutes {
diff --git 
a/server/protocols/webadmin/webadmin-protocols/src/main/java/org/apache/james/protocols/webadmin/ProtocolServerRoutes.java
 
b/server/protocols/webadmin/webadmin-protocols/src/main/java/org/apache/james/protocols/webadmin/ProtocolServerRoutes.java
index 9211ade17e..d0b9de4c1c 100644
--- 
a/server/protocols/webadmin/webadmin-protocols/src/main/java/org/apache/james/protocols/webadmin/ProtocolServerRoutes.java
+++ 
b/server/protocols/webadmin/webadmin-protocols/src/main/java/org/apache/james/protocols/webadmin/ProtocolServerRoutes.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.protocols.webadmin;
 
+import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 
@@ -33,15 +34,23 @@ import org.apache.james.webadmin.utils.ErrorResponder;
 import org.apache.james.webadmin.utils.Responses;
 import org.eclipse.jetty.http.HttpStatus;
 
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.github.fge.lambdas.Throwing;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
 
 import spark.Request;
 import spark.Service;
 
 public class ProtocolServerRoutes implements Routes {
     public static final String SERVERS = "servers";
+    public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+    public static final TypeReference<List<String>> LIST_OF_STRING = new 
TypeReference<>() {
+
+    };
 
     private final Set<CertificateReloadable.Factory> servers;
     private final DisconnectorNotifier disconnector;
@@ -87,7 +96,17 @@ public class ProtocolServerRoutes implements Routes {
         });
 
         service.delete(SERVERS + "/users", (request, response) -> {
-            disconnector.disconnect(any -> true);
+            String body = request.body();
+
+            if (Strings.isNullOrEmpty(body)) {
+                disconnector.disconnect(any -> true);
+            } else {
+                ImmutableSet<Username> userSet = OBJECT_MAPPER.readValue(body, 
LIST_OF_STRING)
+                    .stream()
+                    .map(Username::of)
+                    .collect(ImmutableSet.toImmutableSet());
+                disconnector.disconnect(userSet::contains);
+            }
 
             return Responses.returnNoContent(response);
         });


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org
For additional commands, e-mail: notifications-h...@james.apache.org

Reply via email to