fix(community): don't delete chat and messages when leaving community
This creates a smoother experience for users when they leave a community since they can see the exact same messages they had before without having to rely on the mailserver.
This commit is contained in:
parent
49b3c573f6
commit
d87ed0e357
|
@ -1746,12 +1746,32 @@ func (s *MessengerCommunitiesSuite) TestLeaveAndRejoinCommunity() {
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
s.Require().Equal(2, joinedCommunities[0].MembersCount())
|
s.Require().Equal(2, joinedCommunities[0].MembersCount())
|
||||||
|
|
||||||
|
chats, err := s.alice.persistence.Chats()
|
||||||
|
s.Require().NoError(err)
|
||||||
|
var numberInactiveChats = 0
|
||||||
|
for i := 0; i < len(chats); i++ {
|
||||||
|
if !chats[i].Active {
|
||||||
|
numberInactiveChats++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
s.Require().Equal(3, numberInactiveChats)
|
||||||
|
|
||||||
// alice can rejoin
|
// alice can rejoin
|
||||||
s.joinCommunity(community, s.alice)
|
s.joinCommunity(community, s.alice)
|
||||||
|
|
||||||
joinedCommunities, err = s.admin.communitiesManager.Joined()
|
joinedCommunities, err = s.admin.communitiesManager.Joined()
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
s.Require().Equal(3, joinedCommunities[0].MembersCount())
|
s.Require().Equal(3, joinedCommunities[0].MembersCount())
|
||||||
|
|
||||||
|
chats, err = s.alice.persistence.Chats()
|
||||||
|
s.Require().NoError(err)
|
||||||
|
numberInactiveChats = 0
|
||||||
|
for i := 0; i < len(chats); i++ {
|
||||||
|
if !chats[i].Active {
|
||||||
|
numberInactiveChats++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
s.Require().Equal(1, numberInactiveChats)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MessengerCommunitiesSuite) TestShareCommunity() {
|
func (s *MessengerCommunitiesSuite) TestShareCommunity() {
|
||||||
|
|
|
@ -2149,7 +2149,7 @@ func (db sqlitePersistence) ClearHistoryFromSyncMessage(chat *Chat, currentClock
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deactivate chat sets a chat as inactive and clear its history
|
// Deactivate chat sets a chat as inactive and clear its history
|
||||||
func (db sqlitePersistence) DeactivateChat(chat *Chat, currentClockValue uint64) (err error) {
|
func (db sqlitePersistence) DeactivateChat(chat *Chat, currentClockValue uint64, doClearHistory bool) (err error) {
|
||||||
var tx *sql.Tx
|
var tx *sql.Tx
|
||||||
|
|
||||||
tx, err = db.db.BeginTx(context.Background(), &sql.TxOptions{})
|
tx, err = db.db.BeginTx(context.Background(), &sql.TxOptions{})
|
||||||
|
@ -2165,18 +2165,21 @@ func (db sqlitePersistence) DeactivateChat(chat *Chat, currentClockValue uint64)
|
||||||
// don't shadow original error
|
// don't shadow original error
|
||||||
_ = tx.Rollback()
|
_ = tx.Rollback()
|
||||||
}()
|
}()
|
||||||
err = db.deactivateChat(chat, currentClockValue, tx)
|
err = db.deactivateChat(chat, currentClockValue, tx, doClearHistory)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db sqlitePersistence) deactivateChat(chat *Chat, currentClockValue uint64, tx *sql.Tx) error {
|
func (db sqlitePersistence) deactivateChat(chat *Chat, currentClockValue uint64, tx *sql.Tx, doClearHistory bool) error {
|
||||||
chat.Active = false
|
chat.Active = false
|
||||||
err := db.saveChat(tx, *chat)
|
err := db.saveChat(tx, *chat)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !doClearHistory {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
return db.clearHistory(chat, currentClockValue, tx, true)
|
return db.clearHistory(chat, currentClockValue, tx, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -347,10 +347,10 @@ func (m *Messenger) DeactivateChat(request *requests.DeactivateChat) (*Messenger
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return m.deactivateChat(request.ID, 0, true)
|
return m.deactivateChat(request.ID, 0, true, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Messenger) deactivateChat(chatID string, deactivationClock uint64, shouldBeSynced bool) (*MessengerResponse, error) {
|
func (m *Messenger) deactivateChat(chatID string, deactivationClock uint64, shouldBeSynced bool, doClearHistory bool) (*MessengerResponse, error) {
|
||||||
var response MessengerResponse
|
var response MessengerResponse
|
||||||
chat, ok := m.allChats.Load(chatID)
|
chat, ok := m.allChats.Load(chatID)
|
||||||
if !ok {
|
if !ok {
|
||||||
|
@ -380,7 +380,7 @@ func (m *Messenger) deactivateChat(chatID string, deactivationClock uint64, shou
|
||||||
deactivationClock, _ = chat.NextClockAndTimestamp(m.getTimesource())
|
deactivationClock, _ = chat.NextClockAndTimestamp(m.getTimesource())
|
||||||
}
|
}
|
||||||
|
|
||||||
err = m.persistence.DeactivateChat(chat, deactivationClock)
|
err = m.persistence.DeactivateChat(chat, deactivationClock, doClearHistory)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -861,12 +861,12 @@ func (m *Messenger) leaveCommunity(communityID types.HexBytes) (*MessengerRespon
|
||||||
// Make chat inactive
|
// Make chat inactive
|
||||||
for chatID := range community.Chats() {
|
for chatID := range community.Chats() {
|
||||||
communityChatID := communityID.String() + chatID
|
communityChatID := communityID.String() + chatID
|
||||||
err := m.deleteChat(communityChatID)
|
response.AddRemovedChat(communityChatID)
|
||||||
|
|
||||||
|
_, err = m.deactivateChat(communityChatID, 0, false, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
response.AddRemovedChat(communityChatID)
|
|
||||||
|
|
||||||
_, err = m.transport.RemoveFilterByChatID(communityChatID)
|
_, err = m.transport.RemoveFilterByChatID(communityChatID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -471,7 +471,7 @@ func (m *Messenger) removeContact(ctx context.Context, response *MessengerRespon
|
||||||
_, ok = m.allChats.Load(profileChatID)
|
_, ok = m.allChats.Load(profileChatID)
|
||||||
|
|
||||||
if ok {
|
if ok {
|
||||||
chatResponse, err := m.deactivateChat(profileChatID, 0, false)
|
chatResponse, err := m.deactivateChat(profileChatID, 0, false, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -619,7 +619,7 @@ func (m *Messenger) HandleSyncChatRemoved(state *ReceivedMessageState, message p
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
response, err := m.deactivateChat(message.Id, message.Clock, false)
|
response, err := m.deactivateChat(message.Id, message.Clock, false, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -172,7 +172,7 @@ func (s *MessengerInstallationSuite) TestSyncInstallation() {
|
||||||
chat2.DeletedAtClockValue = 1
|
chat2.DeletedAtClockValue = 1
|
||||||
err = s.m.SaveChat(chat2)
|
err = s.m.SaveChat(chat2)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
_, err = s.m.deactivateChat(removedChatID, 0, true)
|
_, err = s.m.deactivateChat(removedChatID, 0, true, true)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
// pair
|
// pair
|
||||||
|
|
|
@ -121,7 +121,7 @@ func (s *MessengerSyncChatSuite) TestRemovePubChat() {
|
||||||
|
|
||||||
s.Pair()
|
s.Pair()
|
||||||
|
|
||||||
_, err = s.alice1.deactivateChat(publicChatName, 0, true)
|
_, err = s.alice1.deactivateChat(publicChatName, 0, true, true)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
var allChats []*Chat
|
var allChats []*Chat
|
||||||
|
|
|
@ -1150,7 +1150,7 @@ func TestDeactivatePublicChat(t *testing.T) {
|
||||||
publicChat.LastMessage = &lastMessage
|
publicChat.LastMessage = &lastMessage
|
||||||
publicChat.UnviewedMessagesCount = 1
|
publicChat.UnviewedMessagesCount = 1
|
||||||
|
|
||||||
err = p.DeactivateChat(publicChat, currentClockValue)
|
err = p.DeactivateChat(publicChat, currentClockValue, true)
|
||||||
|
|
||||||
// It does not set deleted at for a public chat
|
// It does not set deleted at for a public chat
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -1219,7 +1219,7 @@ func TestDeactivateOneToOneChat(t *testing.T) {
|
||||||
chat.LastMessage = &lastMessage
|
chat.LastMessage = &lastMessage
|
||||||
chat.UnviewedMessagesCount = 1
|
chat.UnviewedMessagesCount = 1
|
||||||
|
|
||||||
err = p.DeactivateChat(chat, currentClockValue)
|
err = p.DeactivateChat(chat, currentClockValue, true)
|
||||||
|
|
||||||
// It does set deleted at for a public chat
|
// It does set deleted at for a public chat
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
Loading…
Reference in New Issue