fix: remove mailserver topic when deactivating a chat (#2460)

This fixes an issue where re-joining a chat does not load the messages again from the mailserver
This commit is contained in:
Richard Ramos 2021-12-09 21:55:00 +00:00 committed by GitHub
parent 90122f3e2e
commit ebd4511d24
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 30 additions and 3 deletions

View File

@ -1 +1 @@
0.92.2 0.92.3

View File

@ -356,9 +356,28 @@ func (m *Messenger) deactivateChat(chatID string, shouldBeSynced bool) (*Messeng
return nil, ErrChatNotFound return nil, ErrChatNotFound
} }
// Reset mailserver last request to allow re-fetching messages if joining a chat again
filters, err := m.filtersForChat(chatID)
if err != nil && err != ErrNoFiltersForChat {
return nil, err
}
if m.mailserversDatabase != nil {
for _, filter := range filters {
if !filter.Listen || filter.Ephemeral {
continue
}
err := m.mailserversDatabase.ResetLastRequest(filter.Topic.String())
if err != nil {
return nil, err
}
}
}
clock, _ := chat.NextClockAndTimestamp(m.getTimesource()) clock, _ := chat.NextClockAndTimestamp(m.getTimesource())
err := m.persistence.DeactivateChat(chat, clock) err = m.persistence.DeactivateChat(chat, clock)
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -23,6 +23,8 @@ var tolerance uint32 = 60
var mailserverRequestTimeout = 45 * time.Second var mailserverRequestTimeout = 45 * time.Second
var oneMonthInSeconds uint32 = 31 * 24 * 60 * 60 var oneMonthInSeconds uint32 = 31 * 24 * 60 * 60
var ErrNoFiltersForChat = errors.New("no filter registered for given chat")
func (m *Messenger) shouldSync() (bool, error) { func (m *Messenger) shouldSync() (bool, error) {
if m.mailserver == nil || !m.online() { if m.mailserver == nil || !m.online() {
return false, nil return false, nil
@ -140,7 +142,7 @@ func (m *Messenger) filtersForChat(chatID string) ([]*transport.Filter, error) {
} else { } else {
filter := m.transport.FilterByChatID(chatID) filter := m.transport.FilterByChatID(chatID)
if filter == nil { if filter == nil {
return nil, errors.New("no filter registered for given chat") return nil, ErrNoFiltersForChat
} }
filters = []*transport.Filter{filter} filters = []*transport.Filter{filter}
} }
@ -277,6 +279,7 @@ func (m *Messenger) syncFilters(filters []*transport.Filter) (*MessengerResponse
LastRequest: int(lastRequest), LastRequest: int(lastRequest),
} }
} }
batch, ok := batches[topicData.LastRequest] batch, ok := batches[topicData.LastRequest]
if !ok { if !ok {
from, err := m.capToDefaultSyncPeriod(uint32(topicData.LastRequest)) from, err := m.capToDefaultSyncPeriod(uint32(topicData.LastRequest))

View File

@ -297,6 +297,11 @@ func (d *Database) Topics() ([]MailserverTopic, error) {
return result, nil return result, nil
} }
func (d *Database) ResetLastRequest(topic string) error {
_, err := d.db.Exec("UPDATE mailserver_topics SET last_request = 0 WHERE topic = ?", topic)
return err
}
func (d *Database) DeleteTopic(topic string) error { func (d *Database) DeleteTopic(topic string) error {
_, err := d.db.Exec(`DELETE FROM mailserver_topics WHERE topic = ?`, topic) _, err := d.db.Exec(`DELETE FROM mailserver_topics WHERE topic = ?`, topic)
return err return err