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