From 68d2d6bdfbf422ce8a37e14b5e7d56777b59ffb2 Mon Sep 17 00:00:00 2001 From: yqrashawn Date: Thu, 17 Nov 2022 18:11:58 +0800 Subject: [PATCH] feat: delete message for new design (#2922) --- protocol/message_persistence.go | 30 ++++++++++++ .../messenger_delete_message_for_me_test.go | 1 + protocol/messenger_handler.go | 17 +++---- protocol/messenger_messages.go | 13 ++--- protocol/persistence_test.go | 48 +++++++++++++++++++ 5 files changed, 95 insertions(+), 14 deletions(-) diff --git a/protocol/message_persistence.go b/protocol/message_persistence.go index 49262e484..0c025ea80 100644 --- a/protocol/message_persistence.go +++ b/protocol/message_persistence.go @@ -620,6 +620,36 @@ func (db sqlitePersistence) MessageByChatID(chatID string, currCursor string, li return result, newCursor, nil } +// Get last chat message that is not hide or deleted or deleted_for_me +func (db sqlitePersistence) LatestMessageByChatID(chatID string) ([]*common.Message, error) { + args := []interface{}{chatID} + where := `WHERE + NOT(m1.hide) AND NOT(m1.deleted) AND NOT(m1.deleted_for_me) AND m1.local_chat_id = ? + ORDER BY cursor DESC + LIMIT ?` + + query := db.buildMessagesQueryWithAdditionalFields(cursorField, where) + + rows, err := db.db.Query( + query, + append(args, 2)..., // take one more to figure our whether a cursor should be returned + ) + if err != nil { + return nil, err + } + defer rows.Close() + + result, _, err := getMessagesAndCursorsFromScanRows(db, rows) + if err != nil { + return nil, err + } + + if len(result) > 1 { + result = result[:1] + } + return result, nil +} + func (db sqlitePersistence) latestIncomingMessageClock(chatID string) (uint64, error) { var clock uint64 err := db.db.QueryRow( diff --git a/protocol/messenger_delete_message_for_me_test.go b/protocol/messenger_delete_message_for_me_test.go index cbb7c6c11..8972fb980 100644 --- a/protocol/messenger_delete_message_for_me_test.go +++ b/protocol/messenger_delete_message_for_me_test.go @@ -162,6 +162,7 @@ func (s *MessengerDeleteMessageForMeSuite) TestDeleteMessageForMe() { response, err = s.alice1.DeleteMessageForMeAndSync(context.Background(), chatID, messageID) s.Require().NoError(err) s.Require().True(response.Messages()[0].DeletedForMe) + s.Require().Nil(response.Chats()[0].LastMessage) err = tt.RetryWithBackOff(func() error { var err error diff --git a/protocol/messenger_handler.go b/protocol/messenger_handler.go index 27a26dc55..640affd61 100644 --- a/protocol/messenger_handler.go +++ b/protocol/messenger_handler.go @@ -1270,11 +1270,6 @@ func (m *Messenger) HandleDeleteMessage(state *ReceivedMessageState, deleteMessa return err } - err = m.persistence.SetHideOnMessage(deleteMessage.MessageId) - if err != nil { - return err - } - m.logger.Debug("deleting activity center notification for message", zap.String("chatID", chat.ID), zap.String("messageID", deleteMessage.MessageId)) err = m.persistence.DeleteActivityCenterNotificationForMessage(chat.ID, deleteMessage.MessageId) @@ -1343,6 +1338,12 @@ func (m *Messenger) HandleDeleteForMeMessage(state *ReceivedMessageState, delete return err } + if chat.LastMessage != nil && chat.LastMessage.ID == originalMessage.ID { + if err := m.updateLastMessage(chat); err != nil { + return err + } + } + state.Response.AddMessage(originalMessage) state.Response.AddChat(chat) @@ -1351,7 +1352,7 @@ func (m *Messenger) HandleDeleteForMeMessage(state *ReceivedMessageState, delete func (m *Messenger) updateLastMessage(chat *Chat) error { // Get last message that is not hidden - messages, _, err := m.persistence.MessageByChatID(chat.ID, "", 1) + messages, err := m.persistence.LatestMessageByChatID(chat.ID) if err != nil { return err } @@ -1500,9 +1501,9 @@ func (m *Messenger) HandleChatMessage(state *ReceivedMessageState) error { return err } - if receivedMessage.Deleted && (chat.LastMessage == nil || chat.LastMessage.ID == receivedMessage.ID) { + if (receivedMessage.Deleted || receivedMessage.DeletedForMe) && (chat.LastMessage == nil || chat.LastMessage.ID == receivedMessage.ID) { // Get last message that is not hidden - messages, _, err := m.persistence.MessageByChatID(receivedMessage.LocalChatID, "", 1) + messages, err := m.persistence.LatestMessageByChatID(receivedMessage.LocalChatID) if err != nil { return err } diff --git a/protocol/messenger_messages.go b/protocol/messenger_messages.go index 72f1b7764..244d6af54 100644 --- a/protocol/messenger_messages.go +++ b/protocol/messenger_messages.go @@ -143,11 +143,6 @@ func (m *Messenger) DeleteMessageAndSend(ctx context.Context, messageID string) return nil, err } - err = m.persistence.HideMessage(messageID) - if err != nil { - return nil, err - } - if chat.LastMessage != nil && chat.LastMessage.ID == message.ID { if err := m.updateLastMessage(chat); err != nil { return nil, err @@ -189,6 +184,12 @@ func (m *Messenger) DeleteMessageForMeAndSync(ctx context.Context, chatID string return nil, err } + if chat.LastMessage != nil && chat.LastMessage.ID == message.ID { + if err := m.updateLastMessage(chat); err != nil { + return nil, err + } + } + response := &MessengerResponse{} response.AddMessage(message) response.AddChat(chat) @@ -273,7 +274,7 @@ func (m *Messenger) applyDeleteMessage(messageDeletes []*DeleteMessage, message return err } - return m.persistence.HideMessage(message.ID) + return nil } func (m *Messenger) applyDeleteForMeMessage(messageDeletes []*DeleteForMeMessage, message *common.Message) error { diff --git a/protocol/persistence_test.go b/protocol/persistence_test.go index 4598794a6..fc3c92d22 100644 --- a/protocol/persistence_test.go +++ b/protocol/persistence_test.go @@ -247,6 +247,34 @@ func TestMessageByChatID(t *testing.T) { ) } +func TestLatestMessageByChatID(t *testing.T) { + db, err := openTestDB() + require.NoError(t, err) + p := newSQLitePersistence(db) + + var ids []string + for i := 0; i < 10; i++ { + id := strconv.Itoa(i) + err := insertMinimalMessage(p, id) + require.NoError(t, err) + ids = append(ids, id) + } + + id := strconv.Itoa(10) + err = insertMinimalDeletedMessage(p, id) + require.NoError(t, err) + ids = append(ids, id) + + id = strconv.Itoa(11) + err = insertMinimalDeletedForMeMessage(p, id) + require.NoError(t, err) + ids = append(ids, id) + + m, err := p.LatestMessageByChatID(testPublicChatID) + require.NoError(t, err) + require.Equal(t, m[0].ID, ids[9]) +} + func TestOldestMessageWhisperTimestampByChatID(t *testing.T) { db, err := openTestDB() require.NoError(t, err) @@ -781,6 +809,26 @@ func insertMinimalMessage(p *sqlitePersistence, id string) error { }}) } +func insertMinimalDeletedMessage(p *sqlitePersistence, id string) error { + return p.SaveMessages([]*common.Message{{ + ID: id, + Deleted: true, + LocalChatID: testPublicChatID, + ChatMessage: protobuf.ChatMessage{Text: "some-text"}, + From: "me", + }}) +} + +func insertMinimalDeletedForMeMessage(p *sqlitePersistence, id string) error { + return p.SaveMessages([]*common.Message{{ + ID: id, + DeletedForMe: true, + LocalChatID: testPublicChatID, + ChatMessage: protobuf.ChatMessage{Text: "some-text"}, + From: "me", + }}) +} + func insertDiscordMessageWithAttachments(p *sqlitePersistence, id string, discordMessageID string) error { err := insertMinimalDiscordMessage(p, id, discordMessageID) if err != nil {