Make pending messages indexable by sender and timestamp.

Rather than just timestamp.

// FREEBIE
This commit is contained in:
Moxie Marlinspike
2015-04-15 16:43:44 -07:00
parent 37976455bc
commit 558c72bbb7
6 changed files with 21 additions and 19 deletions

View File

@@ -160,12 +160,14 @@ public class MessageController {
@Timed
@DELETE
@Path("/{message_id}")
public void removePendingMessage(@Auth Account account, @PathParam("message_id") long id)
@Path("/{source}/{timestamp}")
public void removePendingMessage(@Auth Account account,
@PathParam("source") String source,
@PathParam("timestamp") long timestamp)
throws IOException
{
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) {
receiptSender.sendReceipt(account,

View File

@@ -47,12 +47,12 @@ public abstract class Messages {
@Bind("destination_device") long destinationDevice);
@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 *")
abstract OutgoingMessageEntity remove(@Bind("destination") String destination, @Bind("timestamp") long timestamp);
@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("source") String source, @Bind("timestamp") long timestamp);
@Mapper(MessageMapper.class)
@SqlUpdate("DELETE FROM messages WHERE " + ID + " = :id")
abstract void remove(@Bind("id") long id);
@SqlUpdate("DELETE FROM messages WHERE " + ID + " = :id AND " + DESTINATION + " = :destination")
abstract void remove(@Bind("destination") String destination, @Bind("id") long id);
@SqlUpdate("DELETE FROM messages WHERE " + DESTINATION + " = :destination")
abstract void clear(@Bind("destination") String destination);

View File

@@ -28,11 +28,11 @@ public class MessagesManager {
this.messages.clear(destination);
}
public Optional<OutgoingMessageEntity> delete(String destination, long timestamp) {
return Optional.fromNullable(this.messages.remove(destination, timestamp));
public Optional<OutgoingMessageEntity> delete(String destination, String source, long timestamp) {
return Optional.fromNullable(this.messages.remove(destination, source, timestamp));
}
public void delete(long id) {
this.messages.remove(id);
public void delete(String destination, long id) {
this.messages.remove(destination, id);
}
}

View File

@@ -101,7 +101,7 @@ public class WebSocketConnection implements DispatchChannel {
boolean isReceipt = message.getType() == OutgoingMessageSignal.Type.RECEIPT_VALUE;
if (isSuccessResponse(response)) {
if (storedMessageId.isPresent()) messagesManager.delete(storedMessageId.get());
if (storedMessageId.isPresent()) messagesManager.delete(account.getNumber(), storedMessageId.get());
if (!isReceipt) sendDeliveryReceiptFor(message);
} else if (!isSuccessResponse(response) && !storedMessageId.isPresent()) {
requeueMessage(message);