This is an automated email from the ASF dual-hosted git repository. rcordier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit fbd7807e75272865ab47bac5b46cd4edf67361ab Author: Tung Van TRAN <[email protected]> AuthorDate: Tue Oct 11 17:35:23 2022 +0700 JAMES-3830 UserQuotaRootResolver support method list all QuotaRoot of delegated mailboxes --- .../james/mailbox/quota/UserQuotaRootResolver.java | 3 +++ .../store/quota/DefaultUserQuotaRootResolver.java | 13 ++++++++++++ .../quota/DefaultUserQuotaRootResolverTest.java | 24 +++++++++++++++++++--- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/UserQuotaRootResolver.java b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/UserQuotaRootResolver.java index e2c1fd8f7c..d3dd310bb0 100644 --- a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/UserQuotaRootResolver.java +++ b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/UserQuotaRootResolver.java @@ -20,11 +20,14 @@ package org.apache.james.mailbox.quota; import org.apache.james.core.Username; import org.apache.james.mailbox.model.QuotaRoot; +import org.reactivestreams.Publisher; public interface UserQuotaRootResolver extends QuotaRootResolver { QuotaRoot forUser(Username username); + Publisher<QuotaRoot> listAllAccessibleQuotaRoots(Username username); + /** * When the username might not point to a user entity, and an extra translation step is required * for the quota root. diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java index dc5ebf0676..df23ba4bfb 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java @@ -29,6 +29,7 @@ import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.SessionProvider; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.model.Mailbox; +import org.apache.james.mailbox.model.MailboxACL; import org.apache.james.mailbox.model.MailboxConstants; import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MailboxPath; @@ -127,6 +128,18 @@ public class DefaultUserQuotaRootResolver implements UserQuotaRootResolver { return Mono.just(getQuotaRoot(mailboxPath)); } + @Override + public Publisher<QuotaRoot> listAllAccessibleQuotaRoots(Username username) { + MailboxSession session = sessionProvider.createSystemSession(username); + + Flux<QuotaRoot> quotaRootListFromDelegatedMailboxes = factory.getMailboxMapper(session) + .findNonPersonalMailboxes(username, MailboxACL.Right.Read) + .flatMap(this::getQuotaRootReactive) + .distinct(); + + return Flux.concat(quotaRootListFromDelegatedMailboxes, Flux.just(forUser(username))); + } + @Override public Publisher<QuotaRoot> getQuotaRootReactive(Mailbox mailbox) { return Mono.just(getQuotaRoot(mailbox)); diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolverTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolverTest.java index 596a86ff01..718c83a782 100644 --- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolverTest.java +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolverTest.java @@ -59,10 +59,13 @@ class DefaultUserQuotaRootResolverTest { DefaultUserQuotaRootResolver testee; MailboxSessionMapperFactory mockedFactory; + SessionProvider mockSessionProvider; + @BeforeEach void setUp() { mockedFactory = mock(MailboxSessionMapperFactory.class); - testee = new DefaultUserQuotaRootResolver(mock(SessionProvider.class), mockedFactory); + mockSessionProvider = mock(SessionProvider.class); + testee = new DefaultUserQuotaRootResolver(mockSessionProvider, mockedFactory); } @Test @@ -101,8 +104,8 @@ class DefaultUserQuotaRootResolverTest { @Test void retrieveAssociatedMailboxesShouldThrowWhenQuotaRootContainsSeparator2Times() { assertThatThrownBy(() -> testee.retrieveAssociatedMailboxes( - QuotaRoot.quotaRoot("#private&be&nwa", Optional.empty()), MAILBOX_SESSION) - .collectList().block()) + QuotaRoot.quotaRoot("#private&be&nwa", Optional.empty()), MAILBOX_SESSION) + .collectList().block()) .hasCauseInstanceOf(MailboxException.class); } @@ -115,4 +118,19 @@ class DefaultUserQuotaRootResolverTest { assertThat(testee.getQuotaRoot(MAILBOX_ID)).isEqualTo(QUOTA_ROOT); } + @Test + void listAllAccessibleQuotaRootsShouldReturnQuotaRootOfDelegatedMailboxes() { + MailboxMapper mockedMapper = mock(MailboxMapper.class); + MailboxSession mockSession = mock(MailboxSession.class); + when(mockSessionProvider.createSystemSession(BENWA)).thenReturn(mockSession); + when(mockedFactory.getMailboxMapper(mockSession)).thenReturn(mockedMapper); + + Mailbox delegatedMailbox = new Mailbox(MailboxPath.forUser(Username.of("delegated"), "test"), + UidValidity.of(11), TestId.of(1)); + when(mockedMapper.findNonPersonalMailboxes(any(), any())).thenReturn(Flux.just(delegatedMailbox)); + + assertThat(Flux.from(testee.listAllAccessibleQuotaRoots(BENWA)).collectList().block()) + .containsExactlyInAnyOrder(QUOTA_ROOT, testee.getQuotaRoot(delegatedMailbox)); + } + } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
