forked from Silverfish/proton-bridge
GODT-1984: Handle permanent message deletion
Only delete messages when unlabeled from trash/spam if they only exists in All Mail and (spam or trash). This patch also ports delete_from_trash.feature and use status rather than fetch to count messages in a mailboxes.
This commit is contained in:
committed by
James Houlahan
parent
df818bc2b8
commit
8f420d728c
@ -289,7 +289,9 @@ func (user *User) handleMessageEvents(ctx context.Context, messageEvents []litea
|
||||
}
|
||||
|
||||
case liteapi.EventDelete:
|
||||
return ErrNotImplemented
|
||||
if err := user.handleDeleteMessageEvent(ctx, event); err != nil {
|
||||
return fmt.Errorf("failed to handle delete message event: %w", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -331,6 +333,20 @@ func (user *User) handleUpdateMessageEvent(_ context.Context, event liteapi.Mess
|
||||
}, user.updateChLock)
|
||||
}
|
||||
|
||||
func (user *User) handleDeleteMessageEvent(_ context.Context, event liteapi.MessageEvent) error { //nolint:unparam
|
||||
return safe.RLockRet(func() error {
|
||||
for _, updateCh := range user.updateCh {
|
||||
update := imap.NewMessagesDeleted(
|
||||
imap.MessageID(event.ID),
|
||||
)
|
||||
|
||||
updateCh.Enqueue(update)
|
||||
}
|
||||
|
||||
return nil
|
||||
}, user.updateChLock)
|
||||
}
|
||||
|
||||
func getMailboxName(label liteapi.Label) []string {
|
||||
var name []string
|
||||
|
||||
|
||||
@ -311,7 +311,34 @@ func (conn *imapConnector) AddMessagesToMailbox(ctx context.Context, messageIDs
|
||||
|
||||
// RemoveMessagesFromMailbox unlabels the given messages with the given label ID.
|
||||
func (conn *imapConnector) RemoveMessagesFromMailbox(ctx context.Context, messageIDs []imap.MessageID, mailboxID imap.MailboxID) error {
|
||||
return conn.client.UnlabelMessages(ctx, mapTo[imap.MessageID, string](messageIDs), string(mailboxID))
|
||||
if err := conn.client.UnlabelMessages(ctx, mapTo[imap.MessageID, string](messageIDs), string(mailboxID)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if mailboxID == liteapi.SpamLabel || mailboxID == liteapi.TrashLabel {
|
||||
// check if messages are only in Trash and AllMail before they are permanently deleted.
|
||||
var messagesToDelete []string
|
||||
|
||||
// GODT-1993 - Update to more efficient method.
|
||||
for _, messageID := range messageIDs {
|
||||
m, err := conn.client.GetMessage(ctx, string(messageID))
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to get message info")
|
||||
}
|
||||
|
||||
if len(m.LabelIDs) == 1 && m.LabelIDs[0] == liteapi.AllMailLabel {
|
||||
messagesToDelete = append(messagesToDelete, m.ID)
|
||||
}
|
||||
}
|
||||
|
||||
if len(messagesToDelete) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
return conn.client.DeleteMessage(ctx, messagesToDelete...)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// MoveMessages removes the given messages from one label and adds them to the other label.
|
||||
|
||||
Reference in New Issue
Block a user