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
The following commit(s) were added to refs/heads/master by this push:
new d7a4f45fa4 JAMES-3539 PushSubscription/get should return expired
subscriptions (#1845)
d7a4f45fa4 is described below
commit d7a4f45fa4d248a4911612eb367cef72e56c5f8c
Author: Trần Hồng Quân <[email protected]>
AuthorDate: Mon Dec 11 13:45:53 2023 +0700
JAMES-3539 PushSubscription/get should return expired subscriptions (#1845)
---
.../CassandraPushSubscriptionRepository.java | 7 ++---
.../MemoryPushSubscriptionRepository.java | 7 ++---
.../PushSubscriptionRepositoryContract.scala | 34 ++++++----------------
.../james/jmap/pushsubscription/PushListener.scala | 6 +++-
.../jmap/pushsubscription/PushListenerTest.scala | 2 +-
5 files changed, 19 insertions(+), 37 deletions(-)
diff --git
a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/pushsubscription/CassandraPushSubscriptionRepository.java
b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/pushsubscription/CassandraPushSubscriptionRepository.java
index 47dd50f047..ae6f5748d4 100644
---
a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/pushsubscription/CassandraPushSubscriptionRepository.java
+++
b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/pushsubscription/CassandraPushSubscriptionRepository.java
@@ -22,7 +22,6 @@ package org.apache.james.jmap.cassandra.pushsubscription;
import static
org.apache.james.jmap.api.pushsubscription.PushSubscriptionHelpers.evaluateExpiresTime;
import static
org.apache.james.jmap.api.pushsubscription.PushSubscriptionHelpers.isInThePast;
import static
org.apache.james.jmap.api.pushsubscription.PushSubscriptionHelpers.isInvalidPushSubscriptionKey;
-import static
org.apache.james.jmap.api.pushsubscription.PushSubscriptionHelpers.isNotOutdatedSubscription;
import java.time.Clock;
import java.time.ZonedDateTime;
@@ -130,14 +129,12 @@ public class CassandraPushSubscriptionRepository
implements PushSubscriptionRepo
@Override
public Publisher<PushSubscription> get(Username username,
Set<PushSubscriptionId> ids) {
return dao.selectAll(username)
- .filter(subscription -> ids.contains(subscription.id()))
- .filter(subscription -> isNotOutdatedSubscription(subscription,
clock));
+ .filter(subscription -> ids.contains(subscription.id()));
}
@Override
public Publisher<PushSubscription> list(Username username) {
- return dao.selectAll(username)
- .filter(subscription -> isNotOutdatedSubscription(subscription,
clock));
+ return dao.selectAll(username);
}
private Mono<PushSubscription> retrieveByPushSubscriptionId(Username
username, PushSubscriptionId id) {
diff --git
a/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/pushsubscription/MemoryPushSubscriptionRepository.java
b/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/pushsubscription/MemoryPushSubscriptionRepository.java
index c7cf16ac85..3033409414 100644
---
a/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/pushsubscription/MemoryPushSubscriptionRepository.java
+++
b/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/pushsubscription/MemoryPushSubscriptionRepository.java
@@ -22,7 +22,6 @@ package org.apache.james.jmap.memory.pushsubscription;
import static
org.apache.james.jmap.api.pushsubscription.PushSubscriptionHelpers.evaluateExpiresTime;
import static
org.apache.james.jmap.api.pushsubscription.PushSubscriptionHelpers.isInThePast;
import static
org.apache.james.jmap.api.pushsubscription.PushSubscriptionHelpers.isInvalidPushSubscriptionKey;
-import static
org.apache.james.jmap.api.pushsubscription.PushSubscriptionHelpers.isNotOutdatedSubscription;
import java.time.Clock;
import java.time.ZonedDateTime;
@@ -126,15 +125,13 @@ public class MemoryPushSubscriptionRepository implements
PushSubscriptionReposit
public Publisher<PushSubscription> get(Username username,
Set<PushSubscriptionId> ids) {
return Flux.fromStream(table.row(username).entrySet().stream())
.filter(entry -> ids.contains(entry.getKey()))
- .map(Map.Entry::getValue)
- .filter(subscription -> isNotOutdatedSubscription(subscription,
clock));
+ .map(Map.Entry::getValue);
}
@Override
public Publisher<PushSubscription> list(Username username) {
return Flux.fromStream(table.row(username).entrySet().stream())
- .map(Map.Entry::getValue)
- .filter(subscription -> isNotOutdatedSubscription(subscription,
clock));
+ .map(Map.Entry::getValue);
}
@Override
diff --git
a/server/data/data-jmap/src/test/scala/org/apache/james/jmap/api/pushsubscription/PushSubscriptionRepositoryContract.scala
b/server/data/data-jmap/src/test/scala/org/apache/james/jmap/api/pushsubscription/PushSubscriptionRepositoryContract.scala
index 209563d0e9..c499dfe13d 100644
---
a/server/data/data-jmap/src/test/scala/org/apache/james/jmap/api/pushsubscription/PushSubscriptionRepositoryContract.scala
+++
b/server/data/data-jmap/src/test/scala/org/apache/james/jmap/api/pushsubscription/PushSubscriptionRepositoryContract.scala
@@ -316,27 +316,19 @@ trait PushSubscriptionRepositoryContract {
}
@Test
- def getSubscriptionShouldNotReturnOutdatedSubscriptions(): Unit = {
- val deviceClientId1 = DeviceClientId("1")
- val deviceClientId2 = DeviceClientId("2")
+ def getSubscriptionShouldReturnExpiredSubscriptions(): Unit = {
val validRequest1 = PushSubscriptionCreationRequest(
- deviceClientId = deviceClientId1,
+ deviceClientId = DeviceClientId("1"),
url = PushSubscriptionServerURL(new URL("https://example.com/push")),
expires = Option(PushSubscriptionExpiredTime(VALID_EXPIRE.plusDays(1))),
types = Seq(CustomTypeName1))
- val validRequest2 = PushSubscriptionCreationRequest(
- deviceClientId = deviceClientId2,
- url = PushSubscriptionServerURL(new URL("https://example.com/push")),
- expires = Option(PushSubscriptionExpiredTime(VALID_EXPIRE.plusDays(3))),
- types = Seq(CustomTypeName2))
- val pushSubscriptionId1 = SMono.fromPublisher(testee.save(ALICE,
validRequest1)).block().id
- val pushSubscriptionId2 = SMono.fromPublisher(testee.save(ALICE,
validRequest2)).block().id
+ val pushSubscriptionId = SMono.fromPublisher(testee.save(ALICE,
validRequest1)).block().id
clock.setInstant(VALID_EXPIRE.plusDays(2).toInstant)
- val pushSubscriptions = SFlux.fromPublisher(testee.get(ALICE,
Set(pushSubscriptionId1, pushSubscriptionId2).asJava)).collectSeq().block()
+ val pushSubscriptions = SFlux.fromPublisher(testee.get(ALICE,
Set(pushSubscriptionId).asJava)).collectSeq().block()
-
assertThat(pushSubscriptions.map(_.id).toList.asJava).containsExactlyInAnyOrder(pushSubscriptionId2)
+
assertThat(pushSubscriptions.map(_.id).toList.asJava).containsOnly(pushSubscriptionId)
}
@Test
@@ -363,27 +355,19 @@ trait PushSubscriptionRepositoryContract {
}
@Test
- def listSubscriptionShouldNotReturnOutdatedSubscriptions(): Unit = {
- val deviceClientId1 = DeviceClientId("1")
- val deviceClientId2 = DeviceClientId("2")
+ def listSubscriptionShouldReturnExpiredSubscriptions(): Unit = {
val validRequest1 = PushSubscriptionCreationRequest(
- deviceClientId = deviceClientId1,
+ deviceClientId = DeviceClientId("1"),
url = PushSubscriptionServerURL(new URL("https://example.com/push")),
expires = Option(PushSubscriptionExpiredTime(VALID_EXPIRE.plusDays(1))),
types = Seq(CustomTypeName1))
- val validRequest2 = PushSubscriptionCreationRequest(
- deviceClientId = deviceClientId2,
- url = PushSubscriptionServerURL(new URL("https://example.com/push")),
- expires = Option(PushSubscriptionExpiredTime(VALID_EXPIRE.plusDays(3))),
- types = Seq(CustomTypeName2))
- SMono.fromPublisher(testee.save(ALICE, validRequest1)).block().id
- val pushSubscriptionId2 = SMono.fromPublisher(testee.save(ALICE,
validRequest2)).block().id
+ val pushSubscriptionId = SMono.fromPublisher(testee.save(ALICE,
validRequest1)).block().id
clock.setInstant(VALID_EXPIRE.plusDays(2).toInstant)
val pushSubscriptions =
SFlux.fromPublisher(testee.list(ALICE)).collectSeq().block()
-
assertThat(pushSubscriptions.map(_.id).toList.asJava).containsExactlyInAnyOrder(pushSubscriptionId2)
+
assertThat(pushSubscriptions.map(_.id).toList.asJava).containsOnly(pushSubscriptionId)
}
@Test
diff --git
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/pushsubscription/PushListener.scala
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/pushsubscription/PushListener.scala
index c64a0913b6..3ce9df64ee 100644
---
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/pushsubscription/PushListener.scala
+++
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/pushsubscription/PushListener.scala
@@ -20,6 +20,7 @@
package org.apache.james.jmap.pushsubscription
import java.nio.charset.StandardCharsets
+import java.time.Clock
import java.util.Base64
import com.google.common.annotations.VisibleForTesting
@@ -28,6 +29,7 @@ import javax.inject.Inject
import org.apache.james.events.EventListener.ReactiveGroupEventListener
import org.apache.james.events.{Event, Group}
import org.apache.james.jmap.api.model.PushSubscription
+import
org.apache.james.jmap.api.pushsubscription.PushSubscriptionHelpers.isNotOutdatedSubscription
import org.apache.james.jmap.api.pushsubscription.PushSubscriptionRepository
import org.apache.james.jmap.change.{EmailDeliveryTypeName, StateChangeEvent}
import org.apache.james.jmap.core.StateChange
@@ -61,7 +63,8 @@ object PushListener {
class PushListener @Inject()(pushRepository: PushSubscriptionRepository,
webPushClient: WebPushClient,
pushSerializer: PushSerializer,
- delegationStore: DelegationStore) extends
ReactiveGroupEventListener {
+ delegationStore: DelegationStore,
+ clock: Clock) extends ReactiveGroupEventListener {
override def getDefaultGroup: Group = PushListenerGroup()
@@ -71,6 +74,7 @@ class PushListener @Inject()(pushRepository:
PushSubscriptionRepository,
SMono.just(event.username)
.concatWith(delegationStore.authorizedUsers(event.username))
.flatMap(pushRepository.list)
+ .filter(isNotOutdatedSubscription(_, clock))
.filter(_.validated)
.flatMap(sendNotification(_, event),
ReactorUtils.DEFAULT_CONCURRENCY)
.`then`()
diff --git
a/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/pushsubscription/PushListenerTest.scala
b/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/pushsubscription/PushListenerTest.scala
index bae016a02c..53ef0a4c7a 100644
---
a/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/pushsubscription/PushListenerTest.scala
+++
b/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/pushsubscription/PushListenerTest.scala
@@ -69,7 +69,7 @@ class PushListenerTest {
pushSubscriptionRepository = new
MemoryPushSubscriptionRepository(Clock.systemUTC())
webPushClient = mock(classOf[WebPushClient])
delegationStore = new MemoryDelegationStore()
- testee = new PushListener(pushSubscriptionRepository, webPushClient,
pushSerializer, delegationStore)
+ testee = new PushListener(pushSubscriptionRepository, webPushClient,
pushSerializer, delegationStore, Clock.systemUTC())
when(webPushClient.push(any(), any())).thenReturn(SMono.empty[Unit])
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]