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 2020/12/18 07:27:31 UTC

[james-project] 03/13: JAMES-3463 MailboxChangeRepository::getLatestState

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 33a65de0a28be8dc59705670f06279f4a3d587e5
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Dec 15 10:31:58 2020 +0700

    JAMES-3463 MailboxChangeRepository::getLatestState
---
 .../change/CassandraMailboxChangeRepository.java   |  5 +++++
 .../jmap/api/change/MailboxChangeRepository.java   |  2 ++
 .../change/MemoryMailboxChangeRepository.java      |  8 ++++++++
 .../change/MailboxChangeRepositoryContract.java    | 23 ++++++++++++++++++++++
 4 files changed, 38 insertions(+)

diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/CassandraMailboxChangeRepository.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/CassandraMailboxChangeRepository.java
index 65b6d3f..738d9c2 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/CassandraMailboxChangeRepository.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/CassandraMailboxChangeRepository.java
@@ -39,4 +39,9 @@ public class CassandraMailboxChangeRepository implements MailboxChangeRepository
     public Mono<MailboxChanges> getSinceState(AccountId accountId, MailboxChange.State state, Optional<MailboxChange.Limit> maxIdsToReturn) {
         return Mono.empty();
     }
+
+    @Override
+    public Mono<MailboxChange.State> getLatestState(AccountId accountId) {
+        return Mono.just(MailboxChange.State.INITIAL);
+    }
 }
diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/change/MailboxChangeRepository.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/change/MailboxChangeRepository.java
index fb965be..ccc0a36 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/change/MailboxChangeRepository.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/change/MailboxChangeRepository.java
@@ -32,4 +32,6 @@ public interface MailboxChangeRepository {
     Mono<Void> save(MailboxChange change);
 
     Mono<MailboxChanges> getSinceState(AccountId accountId, State state, Optional<Limit> maxIdsToReturn);
+
+    Mono<State> getLatestState(AccountId accountId);
 }
diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/change/MemoryMailboxChangeRepository.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/change/MemoryMailboxChangeRepository.java
index 0ff0fa5..5dad517 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/change/MemoryMailboxChangeRepository.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/change/MemoryMailboxChangeRepository.java
@@ -79,4 +79,12 @@ public class MemoryMailboxChangeRepository implements MailboxChangeRepository {
             .switchIfEmpty(Mono.error(new ChangeNotFoundException(state, String.format("State '%s' could not be found", state.getValue()))))
             .single();
     }
+
+    @Override
+    public Mono<State> getLatestState(AccountId accountId) {
+        return Flux.fromIterable(mailboxChangeMap.get(accountId))
+            .sort(Comparator.comparing(MailboxChange::getDate))
+            .map(MailboxChange::getState)
+            .last(State.INITIAL);
+    }
 }
diff --git a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/change/MailboxChangeRepositoryContract.java b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/change/MailboxChangeRepositoryContract.java
index 75f10af..fe9764f 100644
--- a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/change/MailboxChangeRepositoryContract.java
+++ b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/change/MailboxChangeRepositoryContract.java
@@ -56,6 +56,29 @@ public interface MailboxChangeRepositoryContract {
     }
 
     @Test
+    default void getLatestStateShouldReturnInitialWhenEmpty() {
+        MailboxChangeRepository repository = mailboxChangeRepository();
+
+        assertThat(repository.getLatestState(ACCOUNT_ID).block())
+            .isEqualTo(State.INITIAL);
+    }
+
+    @Test
+    default void getLatestStateShouldReturnLastPersistedState() {
+        MailboxChangeRepository repository = mailboxChangeRepository();
+
+        MailboxChange change1 = MailboxChange.of(ACCOUNT_ID, State.of(UUID.randomUUID()), DATE.minusHours(2), ImmutableList.of(TestId.of(2)), ImmutableList.of(), ImmutableList.of());
+        MailboxChange change2 = MailboxChange.of(ACCOUNT_ID, State.of(UUID.randomUUID()), DATE.minusHours(1), ImmutableList.of(TestId.of(3)), ImmutableList.of(), ImmutableList.of());
+        MailboxChange change3 = MailboxChange.of(ACCOUNT_ID, State.of(UUID.randomUUID()), DATE, ImmutableList.of(TestId.of(4)), ImmutableList.of(), ImmutableList.of());
+        repository.save(change1);
+        repository.save(change2);
+        repository.save(change3);
+
+        assertThat(repository.getLatestState(ACCOUNT_ID).block())
+            .isEqualTo(change3.getState());
+    }
+
+    @Test
     default void saveChangeShouldFailWhenNoAccountId() {
         MailboxChangeRepository repository = mailboxChangeRepository();
 


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