feat: delete message for new design (#2922)
This commit is contained in:
parent
2b6c0da1c7
commit
68d2d6bdfb
|
@ -620,6 +620,36 @@ func (db sqlitePersistence) MessageByChatID(chatID string, currCursor string, li
|
||||||
return result, newCursor, nil
|
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) {
|
func (db sqlitePersistence) latestIncomingMessageClock(chatID string) (uint64, error) {
|
||||||
var clock uint64
|
var clock uint64
|
||||||
err := db.db.QueryRow(
|
err := db.db.QueryRow(
|
||||||
|
|
|
@ -162,6 +162,7 @@ func (s *MessengerDeleteMessageForMeSuite) TestDeleteMessageForMe() {
|
||||||
response, err = s.alice1.DeleteMessageForMeAndSync(context.Background(), chatID, messageID)
|
response, err = s.alice1.DeleteMessageForMeAndSync(context.Background(), chatID, messageID)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
s.Require().True(response.Messages()[0].DeletedForMe)
|
s.Require().True(response.Messages()[0].DeletedForMe)
|
||||||
|
s.Require().Nil(response.Chats()[0].LastMessage)
|
||||||
|
|
||||||
err = tt.RetryWithBackOff(func() error {
|
err = tt.RetryWithBackOff(func() error {
|
||||||
var err error
|
var err error
|
||||||
|
|
|
@ -1270,11 +1270,6 @@ func (m *Messenger) HandleDeleteMessage(state *ReceivedMessageState, deleteMessa
|
||||||
return err
|
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))
|
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)
|
err = m.persistence.DeleteActivityCenterNotificationForMessage(chat.ID, deleteMessage.MessageId)
|
||||||
|
|
||||||
|
@ -1343,6 +1338,12 @@ func (m *Messenger) HandleDeleteForMeMessage(state *ReceivedMessageState, delete
|
||||||
return err
|
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.AddMessage(originalMessage)
|
||||||
state.Response.AddChat(chat)
|
state.Response.AddChat(chat)
|
||||||
|
|
||||||
|
@ -1351,7 +1352,7 @@ func (m *Messenger) HandleDeleteForMeMessage(state *ReceivedMessageState, delete
|
||||||
|
|
||||||
func (m *Messenger) updateLastMessage(chat *Chat) error {
|
func (m *Messenger) updateLastMessage(chat *Chat) error {
|
||||||
// Get last message that is not hidden
|
// 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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -1500,9 +1501,9 @@ func (m *Messenger) HandleChatMessage(state *ReceivedMessageState) error {
|
||||||
return err
|
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
|
// 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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -143,11 +143,6 @@ func (m *Messenger) DeleteMessageAndSend(ctx context.Context, messageID string)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = m.persistence.HideMessage(messageID)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if chat.LastMessage != nil && chat.LastMessage.ID == message.ID {
|
if chat.LastMessage != nil && chat.LastMessage.ID == message.ID {
|
||||||
if err := m.updateLastMessage(chat); err != nil {
|
if err := m.updateLastMessage(chat); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -189,6 +184,12 @@ func (m *Messenger) DeleteMessageForMeAndSync(ctx context.Context, chatID string
|
||||||
return nil, err
|
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 := &MessengerResponse{}
|
||||||
response.AddMessage(message)
|
response.AddMessage(message)
|
||||||
response.AddChat(chat)
|
response.AddChat(chat)
|
||||||
|
@ -273,7 +274,7 @@ func (m *Messenger) applyDeleteMessage(messageDeletes []*DeleteMessage, message
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return m.persistence.HideMessage(message.ID)
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Messenger) applyDeleteForMeMessage(messageDeletes []*DeleteForMeMessage, message *common.Message) error {
|
func (m *Messenger) applyDeleteForMeMessage(messageDeletes []*DeleteForMeMessage, message *common.Message) error {
|
||||||
|
|
|
@ -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) {
|
func TestOldestMessageWhisperTimestampByChatID(t *testing.T) {
|
||||||
db, err := openTestDB()
|
db, err := openTestDB()
|
||||||
require.NoError(t, err)
|
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 {
|
func insertDiscordMessageWithAttachments(p *sqlitePersistence, id string, discordMessageID string) error {
|
||||||
err := insertMinimalDiscordMessage(p, id, discordMessageID)
|
err := insertMinimalDiscordMessage(p, id, discordMessageID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Reference in New Issue