You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2023/05/25 05:45:22 UTC

[james-project] 02/03: JAMES-3909 Add UsersRepository::listUsersOfADomainReactive

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 1baee47628621729c0e9da5e1a2f2724e1ef86fe
Author: Quan Tran <hq...@linagora.com>
AuthorDate: Mon May 22 10:58:23 2023 +0700

    JAMES-3909 Add UsersRepository::listUsersOfADomainReactive
    
    The user listing + filtering by domain is not really optimized. Therefore, it is a default method for now, and people can optimize/override it later.
---
 .../java/org/apache/james/user/api/UsersRepository.java  | 10 ++++++++++
 .../apache/james/user/lib/UsersRepositoryContract.java   | 16 ++++++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/server/data/data-api/src/main/java/org/apache/james/user/api/UsersRepository.java b/server/data/data-api/src/main/java/org/apache/james/user/api/UsersRepository.java
index 34c99decef..4a3e67523b 100644
--- a/server/data/data-api/src/main/java/org/apache/james/user/api/UsersRepository.java
+++ b/server/data/data-api/src/main/java/org/apache/james/user/api/UsersRepository.java
@@ -21,11 +21,14 @@ package org.apache.james.user.api;
 
 import java.util.Iterator;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.core.Username;
 import org.apache.james.user.api.model.User;
 import org.reactivestreams.Publisher;
 
+import reactor.core.publisher.Flux;
+
 /**
  * Interface for a repository of users. A repository represents a logical
  * grouping of users, typically by common purpose. E.g. the users served by an
@@ -170,4 +173,11 @@ public interface UsersRepository {
             throw new UsersRepositoryException(username.asString() + " username candidate do not match the virtualHosting strategy");
         }
     }
+
+    default Publisher<Username> listUsersOfADomainReactive(Domain domain) {
+        return Flux.from(listReactive())
+            .filter(username -> username.getDomainPart()
+                .map(domain::equals)
+                .orElse(false));
+    }
 }
diff --git a/server/data/data-library/src/test/java/org/apache/james/user/lib/UsersRepositoryContract.java b/server/data/data-library/src/test/java/org/apache/james/user/lib/UsersRepositoryContract.java
index 8fe9e17c71..f13dfa473f 100644
--- a/server/data/data-library/src/test/java/org/apache/james/user/lib/UsersRepositoryContract.java
+++ b/server/data/data-library/src/test/java/org/apache/james/user/lib/UsersRepositoryContract.java
@@ -50,6 +50,8 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 
+import reactor.core.publisher.Flux;
+
 public interface UsersRepositoryContract {
 
     class UserRepositoryExtension implements BeforeEachCallback, ParameterResolver {
@@ -551,6 +553,20 @@ public interface UsersRepositoryContract {
             assertThat(actual).isTrue();
         }
 
+        @Test
+        default void listUsersOfADomainShouldNotListOtherDomainUsers(TestSystem testSystem) throws Exception {
+            testSystem.domainList.addDomain(Domain.of("domain1.tld"));
+            testee().addUser(Username.of("user1@domain1.tld"), "password");
+
+            testSystem.domainList.addDomain(Domain.of("domain2.tld"));
+            testee().addUser(Username.of("user2@domain2.tld"), "password");
+
+            assertThat(Flux.from(testee().listUsersOfADomainReactive(Domain.of("domain1.tld")))
+                .collectList()
+                .block())
+                .containsOnly(Username.of("user1@domain1.tld"));
+        }
+
         @Test
         default void addUserShouldThrowWhenUserDoesNotBelongToDomainList(TestSystem testSystem) {
             assertThatThrownBy(() -> testee().addUser(testSystem.userWithUnknownDomain, "password"))


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