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 9d2b42211ccae57b2569feddb0e3df84da4cc4cf
Author: Benoit TELLIER <btell...@linagora.com>
AuthorDate: Tue Jun 3 17:59:25 2025 +0200

    JAMES-4316 Allow deleting all groups
---
 .../modules/servers/partials/operate/webadmin.adoc | 13 ++++++++++++
 .../apache/james/webadmin/routes/GroupsRoutes.java | 14 +++++++++++++
 .../james/webadmin/routes/GroupsRoutesTest.java    | 23 ++++++++++++++++++++++
 src/site/markdown/server/manage-webadmin.md        | 13 ++++++++++++
 4 files changed, 63 insertions(+)

diff --git a/docs/modules/servers/partials/operate/webadmin.adoc 
b/docs/modules/servers/partials/operate/webadmin.adoc
index 49df9447f5..8fe440c42c 100644
--- a/docs/modules/servers/partials/operate/webadmin.adoc
+++ b/docs/modules/servers/partials/operate/webadmin.adoc
@@ -2962,6 +2962,19 @@ Response codes:
 
 * 200: Success
 
+==== Deleting all groups
+
+
+....
+curl -XDELETE http://ip:port/address/groups
+....
+
+Will delete all groups.
+
+Response codes:
+
+* 204: Success
+
 ==== Listing members of a group
 
 ....
diff --git 
a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/GroupsRoutes.java
 
b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/GroupsRoutes.java
index 19c9af4504..37d13c8fa3 100644
--- 
a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/GroupsRoutes.java
+++ 
b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/GroupsRoutes.java
@@ -27,6 +27,7 @@ import java.util.Optional;
 
 import jakarta.inject.Inject;
 
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.core.Username;
@@ -45,6 +46,7 @@ import 
org.apache.james.webadmin.utils.ErrorResponder.ErrorType;
 import org.apache.james.webadmin.utils.JsonTransformer;
 import org.eclipse.jetty.http.HttpStatus;
 
+import com.github.fge.lambdas.Throwing;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSortedSet;
@@ -83,6 +85,7 @@ public class GroupsRoutes implements Routes {
     @Override
     public void define(Service service) {
         service.get(ROOT_PATH, this::listGroups, jsonTransformer);
+        service.delete(ROOT_PATH, this::deleteGroups, jsonTransformer);
         service.get(GROUP_ADDRESS_PATH, this::listGroupMembers, 
jsonTransformer);
         service.put(GROUP_ADDRESS_PATH, (request, response) -> 
halt(HttpStatus.BAD_REQUEST_400));
         service.put(USER_IN_GROUP_ADDRESS_PATH, this::addToGroup);
@@ -94,6 +97,17 @@ public class GroupsRoutes implements Routes {
         return 
recipientRewriteTable.getSourcesForType(Mapping.Type.Group).collect(ImmutableList.toImmutableList());
     }
 
+    public HaltException deleteGroups(Request request, Response response) 
throws RecipientRewriteTableException {
+        recipientRewriteTable.getSourcesForType(Mapping.Type.Group)
+            .flatMap(Throwing.function(source -> 
recipientRewriteTable.getStoredMappings(source)
+                .select(Mapping.Type.Group)
+                .asStream()
+                .map(mapping -> Pair.of(source, mapping))))
+            .forEach(Throwing.consumer(pair -> 
recipientRewriteTable.removeMapping(pair.getLeft(), pair.getRight())));
+
+        return halt(HttpStatus.NO_CONTENT_204);
+    }
+
     public HaltException addToGroup(Request request, Response response) {
         MailAddress groupAddress = 
MailAddressParser.parseMailAddress(request.params(GROUP_ADDRESS), 
GROUP_ADDRESS_TYPE);
         Domain domain = groupAddress.getDomain();
diff --git 
a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java
 
b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java
index b6f78e4bed..f8bbd8c2dd 100644
--- 
a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java
+++ 
b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java
@@ -178,6 +178,29 @@ class GroupsRoutesTest {
             assertThat(addresses).containsExactly(GROUP1, GROUP2);
         }
 
+        @Test
+        void shouldReturnEmptyWhenAllGroupsDeleted() {
+            given()
+                .put(GROUP2 + SEPARATOR + USER_A);
+
+            given()
+                .put(GROUP1 + SEPARATOR + USER_A);
+
+            given().delete();
+
+            List<String> addresses =
+                when()
+                    .get()
+                .then()
+                    .contentType(ContentType.JSON)
+                    .statusCode(HttpStatus.OK_200)
+                    .extract()
+                    .body()
+                    .jsonPath()
+                    .getList(".");
+            assertThat(addresses).isEmpty();
+        }
+
         @Test
         void putShouldBeIdempotent() {
             with()
diff --git a/src/site/markdown/server/manage-webadmin.md 
b/src/site/markdown/server/manage-webadmin.md
index 460dfbec42..5a82d26dc6 100644
--- a/src/site/markdown/server/manage-webadmin.md
+++ b/src/site/markdown/server/manage-webadmin.md
@@ -2832,6 +2832,7 @@ to be configured.
 Note that email addresses are restricted to ASCII character set. Mail 
addresses not matching this criteria will be rejected.
 
  - [Listing groups](#Listing_groups)
+ - [Deleting all groups](#Deleting_all_groups)
  - [Listing members of a group](#Listing_members_of_a_group)
  - [Adding a group member](#Adding_a_group_member)
  - [Removing a group member](#Removing_a_group_member)
@@ -2852,6 +2853,18 @@ Response codes:
 
  - 200: Success
 
+### Deleting all groups
+
+```
+curl -XDELETE http://ip:port/address/groups
+```
+
+Will delete all groups.
+
+Response codes:
+
+- 204: Success
+
 ### Listing members of a group
 
 ```


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

Reply via email to