Skip to content

Commit 5a8310d

Browse files
authored
fix(pins)_: delete pins when the og message is deleted (#6173)
Found when fixing status-im/status-desktop#16639 When a message is deleted, we need to delete the pins too as they are no longer available. This was done using an ON DELETE clause (thanks @osmaczko) I also made sure the SELECT query for the pins doesn't return deleted messages
1 parent 137698e commit 5a8310d

File tree

3 files changed

+64
-0
lines changed

3 files changed

+64
-0
lines changed

protocol/message_persistence.go

+1
Original file line numberDiff line numberDiff line change
@@ -1250,6 +1250,7 @@ func (db sqlitePersistence) PinnedMessageByChatIDs(chatIDs []string, currCursor
12501250
WHERE
12511251
pm.pinned = 1
12521252
AND NOT(m1.hide) AND m1.local_chat_id IN %s %s
1253+
AND m1.deleted = 0
12531254
ORDER BY cursor DESC
12541255
%s
12551256
`, allFields, cursorField, "(?"+strings.Repeat(",?", len(chatIDs)-1)+")", cursorWhere, limitStr),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
CREATE TABLE pin_messages_new (
2+
id VARCHAR PRIMARY KEY NOT NULL,
3+
message_id VARCHAR NOT NULL,
4+
whisper_timestamp INTEGER NOT NULL,
5+
chat_id VARCHAR NOT NULL,
6+
local_chat_id VARCHAR NOT NULL,
7+
clock_value INT NOT NULL,
8+
pinned BOOLEAN NOT NULL,
9+
pinned_by TEXT,
10+
FOREIGN KEY (message_id) REFERENCES user_messages(id) ON DELETE CASCADE
11+
);
12+
13+
INSERT INTO pin_messages_new (id, message_id, whisper_timestamp, chat_id, local_chat_id, clock_value, pinned, pinned_by)
14+
SELECT id, message_id, whisper_timestamp, chat_id, local_chat_id, clock_value, pinned, pinned_by
15+
FROM pin_messages;
16+
17+
DROP TABLE pin_messages;
18+
19+
ALTER TABLE pin_messages_new RENAME TO pin_messages;

protocol/persistence_test.go

+44
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,50 @@ func TestDeleteMessagesByChatID(t *testing.T) {
666666

667667
}
668668

669+
func TestDeletePinnedMessageByID(t *testing.T) {
670+
db, err := openTestDB()
671+
require.NoError(t, err)
672+
p := newSQLitePersistence(db)
673+
id := "1"
674+
675+
err = insertMinimalMessage(p, id)
676+
require.NoError(t, err)
677+
678+
m, err := p.MessageByID(id)
679+
require.NoError(t, err)
680+
require.Equal(t, id, m.ID)
681+
682+
pinMessageProto := protobuf.PinMessage{
683+
ChatId: testPublicChatID,
684+
MessageId: m.ID,
685+
Pinned: true,
686+
Clock: 2,
687+
MessageType: protobuf.MessageType_PUBLIC_GROUP,
688+
}
689+
690+
pinMessage := &common.PinMessage{
691+
PinMessage: &pinMessageProto,
692+
}
693+
694+
inserted, err := p.SavePinMessage(pinMessage)
695+
require.NoError(t, err)
696+
require.True(t, inserted)
697+
698+
pinnedMsgs, _, err := p.PinnedMessageByChatID(testPublicChatID, "", 10)
699+
require.NoError(t, err)
700+
require.Len(t, pinnedMsgs, 1)
701+
702+
err = p.DeleteMessage(m.ID)
703+
require.NoError(t, err)
704+
705+
_, err = p.MessageByID(id)
706+
require.EqualError(t, err, "record not found")
707+
708+
pinnedMsgs, _, err = p.PinnedMessageByChatID(testPublicChatID, "", 10)
709+
require.NoError(t, err)
710+
require.Len(t, pinnedMsgs, 0)
711+
}
712+
669713
func TestMarkMessageSeen(t *testing.T) {
670714
chatID := "test-chat"
671715
db, err := openTestDB()

0 commit comments

Comments
 (0)