Make pending messages indexable by sender and timestamp.
Rather than just timestamp. // FREEBIE
This commit is contained in:
parent
37976455bc
commit
558c72bbb7
|
@ -160,12 +160,14 @@ public class MessageController {
|
||||||
|
|
||||||
@Timed
|
@Timed
|
||||||
@DELETE
|
@DELETE
|
||||||
@Path("/{message_id}")
|
@Path("/{source}/{timestamp}")
|
||||||
public void removePendingMessage(@Auth Account account, @PathParam("message_id") long id)
|
public void removePendingMessage(@Auth Account account,
|
||||||
|
@PathParam("source") String source,
|
||||||
|
@PathParam("timestamp") long timestamp)
|
||||||
throws IOException
|
throws IOException
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
Optional<OutgoingMessageEntity> message = messagesManager.delete(account.getNumber(), id);
|
Optional<OutgoingMessageEntity> message = messagesManager.delete(account.getNumber(), source, timestamp);
|
||||||
|
|
||||||
if (message.isPresent() && message.get().getType() != OutgoingMessageSignal.Type.RECEIPT_VALUE) {
|
if (message.isPresent() && message.get().getType() != OutgoingMessageSignal.Type.RECEIPT_VALUE) {
|
||||||
receiptSender.sendReceipt(account,
|
receiptSender.sendReceipt(account,
|
||||||
|
|
|
@ -47,12 +47,12 @@ public abstract class Messages {
|
||||||
@Bind("destination_device") long destinationDevice);
|
@Bind("destination_device") long destinationDevice);
|
||||||
|
|
||||||
@Mapper(MessageMapper.class)
|
@Mapper(MessageMapper.class)
|
||||||
@SqlQuery("DELETE FROM messages WHERE " + ID + " IN (SELECT " + ID + " FROM messages WHERE " + DESTINATION + " = :destination AND " + TIMESTAMP + " = :timestamp ORDER BY " + ID + " LIMIT 1) RETURNING *")
|
@SqlQuery("DELETE FROM messages WHERE " + ID + " IN (SELECT " + ID + " FROM messages WHERE " + DESTINATION + " = :destination AND " + SOURCE + " = :source AND " + TIMESTAMP + " = :timestamp ORDER BY " + ID + " LIMIT 1) RETURNING *")
|
||||||
abstract OutgoingMessageEntity remove(@Bind("destination") String destination, @Bind("timestamp") long timestamp);
|
abstract OutgoingMessageEntity remove(@Bind("destination") String destination, @Bind("source") String source, @Bind("timestamp") long timestamp);
|
||||||
|
|
||||||
@Mapper(MessageMapper.class)
|
@Mapper(MessageMapper.class)
|
||||||
@SqlUpdate("DELETE FROM messages WHERE " + ID + " = :id")
|
@SqlUpdate("DELETE FROM messages WHERE " + ID + " = :id AND " + DESTINATION + " = :destination")
|
||||||
abstract void remove(@Bind("id") long id);
|
abstract void remove(@Bind("destination") String destination, @Bind("id") long id);
|
||||||
|
|
||||||
@SqlUpdate("DELETE FROM messages WHERE " + DESTINATION + " = :destination")
|
@SqlUpdate("DELETE FROM messages WHERE " + DESTINATION + " = :destination")
|
||||||
abstract void clear(@Bind("destination") String destination);
|
abstract void clear(@Bind("destination") String destination);
|
||||||
|
|
|
@ -28,11 +28,11 @@ public class MessagesManager {
|
||||||
this.messages.clear(destination);
|
this.messages.clear(destination);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Optional<OutgoingMessageEntity> delete(String destination, long timestamp) {
|
public Optional<OutgoingMessageEntity> delete(String destination, String source, long timestamp) {
|
||||||
return Optional.fromNullable(this.messages.remove(destination, timestamp));
|
return Optional.fromNullable(this.messages.remove(destination, source, timestamp));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void delete(long id) {
|
public void delete(String destination, long id) {
|
||||||
this.messages.remove(id);
|
this.messages.remove(destination, id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,7 +101,7 @@ public class WebSocketConnection implements DispatchChannel {
|
||||||
boolean isReceipt = message.getType() == OutgoingMessageSignal.Type.RECEIPT_VALUE;
|
boolean isReceipt = message.getType() == OutgoingMessageSignal.Type.RECEIPT_VALUE;
|
||||||
|
|
||||||
if (isSuccessResponse(response)) {
|
if (isSuccessResponse(response)) {
|
||||||
if (storedMessageId.isPresent()) messagesManager.delete(storedMessageId.get());
|
if (storedMessageId.isPresent()) messagesManager.delete(account.getNumber(), storedMessageId.get());
|
||||||
if (!isReceipt) sendDeliveryReceiptFor(message);
|
if (!isReceipt) sendDeliveryReceiptFor(message);
|
||||||
} else if (!isSuccessResponse(response) && !storedMessageId.isPresent()) {
|
} else if (!isSuccessResponse(response) && !storedMessageId.isPresent()) {
|
||||||
requeueMessage(message);
|
requeueMessage(message);
|
||||||
|
|
|
@ -218,37 +218,37 @@ public class MessageControllerTest {
|
||||||
@Test
|
@Test
|
||||||
public synchronized void testDeleteMessages() throws Exception {
|
public synchronized void testDeleteMessages() throws Exception {
|
||||||
long timestamp = System.currentTimeMillis();
|
long timestamp = System.currentTimeMillis();
|
||||||
when(messagesManager.delete(AuthHelper.VALID_NUMBER, 31337))
|
when(messagesManager.delete(AuthHelper.VALID_NUMBER, "+14152222222", 31337))
|
||||||
.thenReturn(Optional.of(new OutgoingMessageEntity(31337L,
|
.thenReturn(Optional.of(new OutgoingMessageEntity(31337L,
|
||||||
MessageProtos.OutgoingMessageSignal.Type.CIPHERTEXT_VALUE,
|
MessageProtos.OutgoingMessageSignal.Type.CIPHERTEXT_VALUE,
|
||||||
null, timestamp,
|
null, timestamp,
|
||||||
"+14152222222", 1, "hi".getBytes())));
|
"+14152222222", 1, "hi".getBytes())));
|
||||||
|
|
||||||
when(messagesManager.delete(AuthHelper.VALID_NUMBER, 31338))
|
when(messagesManager.delete(AuthHelper.VALID_NUMBER, "+14152222222", 31338))
|
||||||
.thenReturn(Optional.of(new OutgoingMessageEntity(31337L,
|
.thenReturn(Optional.of(new OutgoingMessageEntity(31337L,
|
||||||
MessageProtos.OutgoingMessageSignal.Type.RECEIPT_VALUE,
|
MessageProtos.OutgoingMessageSignal.Type.RECEIPT_VALUE,
|
||||||
null, System.currentTimeMillis(),
|
null, System.currentTimeMillis(),
|
||||||
"+14152222222", 1, null)));
|
"+14152222222", 1, null)));
|
||||||
|
|
||||||
|
|
||||||
when(messagesManager.delete(AuthHelper.VALID_NUMBER, 31339))
|
when(messagesManager.delete(AuthHelper.VALID_NUMBER, "+14152222222", 31339))
|
||||||
.thenReturn(Optional.<OutgoingMessageEntity>absent());
|
.thenReturn(Optional.<OutgoingMessageEntity>absent());
|
||||||
|
|
||||||
ClientResponse response = resources.client().resource(String.format("/v1/messages/%d", 31337))
|
ClientResponse response = resources.client().resource(String.format("/v1/messages/%s/%d", "+14152222222", 31337))
|
||||||
.header("Authorization", AuthHelper.getAuthHeader(AuthHelper.VALID_NUMBER, AuthHelper.VALID_PASSWORD))
|
.header("Authorization", AuthHelper.getAuthHeader(AuthHelper.VALID_NUMBER, AuthHelper.VALID_PASSWORD))
|
||||||
.delete(ClientResponse.class);
|
.delete(ClientResponse.class);
|
||||||
|
|
||||||
assertThat("Good Response Code", response.getStatus(), is(equalTo(204)));
|
assertThat("Good Response Code", response.getStatus(), is(equalTo(204)));
|
||||||
verify(receiptSender).sendReceipt(any(Account.class), eq("+14152222222"), eq(timestamp), eq(Optional.<String>absent()));
|
verify(receiptSender).sendReceipt(any(Account.class), eq("+14152222222"), eq(timestamp), eq(Optional.<String>absent()));
|
||||||
|
|
||||||
response = resources.client().resource(String.format("/v1/messages/%d", 31338))
|
response = resources.client().resource(String.format("/v1/messages/%s/%d", "+14152222222", 31338))
|
||||||
.header("Authorization", AuthHelper.getAuthHeader(AuthHelper.VALID_NUMBER, AuthHelper.VALID_PASSWORD))
|
.header("Authorization", AuthHelper.getAuthHeader(AuthHelper.VALID_NUMBER, AuthHelper.VALID_PASSWORD))
|
||||||
.delete(ClientResponse.class);
|
.delete(ClientResponse.class);
|
||||||
|
|
||||||
assertThat("Good Response Code", response.getStatus(), is(equalTo(204)));
|
assertThat("Good Response Code", response.getStatus(), is(equalTo(204)));
|
||||||
verifyNoMoreInteractions(receiptSender);
|
verifyNoMoreInteractions(receiptSender);
|
||||||
|
|
||||||
response = resources.client().resource(String.format("/v1/messages/%d", 31339))
|
response = resources.client().resource(String.format("/v1/messages/%s/%d", "+14152222222", 31339))
|
||||||
.header("Authorization", AuthHelper.getAuthHeader(AuthHelper.VALID_NUMBER, AuthHelper.VALID_PASSWORD))
|
.header("Authorization", AuthHelper.getAuthHeader(AuthHelper.VALID_NUMBER, AuthHelper.VALID_PASSWORD))
|
||||||
.delete(ClientResponse.class);
|
.delete(ClientResponse.class);
|
||||||
|
|
||||||
|
|
|
@ -162,7 +162,7 @@ public class WebSocketConnectionTest {
|
||||||
// add(createMessage("sender2", 3333, false, "third"));
|
// add(createMessage("sender2", 3333, false, "third"));
|
||||||
// }};
|
// }};
|
||||||
|
|
||||||
verify(storedMessages, times(1)).delete(eq(2L));
|
verify(storedMessages, times(1)).delete(eq(account.getNumber()), eq(2L));
|
||||||
|
|
||||||
// verify(pushSender, times(1)).sendMessage(eq(sender1), eq(sender1device), any(OutgoingMessageSignal.class));
|
// verify(pushSender, times(1)).sendMessage(eq(sender1), eq(sender1device), any(OutgoingMessageSignal.class));
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue