diff --git a/deprecation/protocol.go b/deprecation/protocol.go new file mode 100644 index 000000000..c65ad9399 --- /dev/null +++ b/deprecation/protocol.go @@ -0,0 +1,31 @@ +package deprecation + +const ( + ChatProfileDeprecated = true + ChatTimelineDeprecated = true +) + +func AddChatsCount(count int) int { + var add = 0 + if !ChatProfileDeprecated { + add++ + } + if !ChatTimelineDeprecated { + add++ + } + return count + add +} + +func AddProfileFiltersCount(count int) int { + if ChatProfileDeprecated { + return count + } + return count + 1 +} + +func AddTimelineFiltersCount(count int) int { + if ChatTimelineDeprecated { + return count + } + return count + 1 +} diff --git a/protocol/chat.go b/protocol/chat.go index 7be7d7127..ab5f62a67 100644 --- a/protocol/chat.go +++ b/protocol/chat.go @@ -7,6 +7,7 @@ import ( "math/rand" "time" + "github.com/status-im/status-go/deprecation" "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/types" userimage "github.com/status-im/status-go/images" @@ -32,7 +33,11 @@ const ( ChatTypeOneToOne ChatType = iota + 1 ChatTypePublic ChatTypePrivateGroupChat + // Deprecated: CreateProfileChat shouldn't be used + // and is only left here in case profile chat feature is re-introduced. ChatTypeProfile + // Deprecated: ChatTypeTimeline shouldn't be used + // and is only left here in case profile chat feature is re-introduced. ChatTypeTimeline ChatTypeCommunityChat ) @@ -63,6 +68,7 @@ const ( const pkStringLength = 68 // timelineChatID is a magic constant id for your own timeline +// Deprecated: timeline chats are no more supported const timelineChatID = "@timeline70bd746ddcc12beb96b2c9d572d0784ab137ffc774f5383e50585a932080b57cca0484b259e61cecbaa33a4c98a300a" type Chat struct { @@ -241,10 +247,14 @@ func (c *Chat) Public() bool { return c.ChatType == ChatTypePublic } +// Deprecated: ProfileUpdates shouldn't be used +// and is only left here in case profile chat feature is re-introduced. func (c *Chat) ProfileUpdates() bool { return c.ChatType == ChatTypeProfile || len(c.Profile) > 0 } +// Deprecated: Timeline shouldn't be used +// and is only left here in case profile chat feature is re-introduced. func (c *Chat) Timeline() bool { return c.ChatType == ChatTypeTimeline } @@ -527,11 +537,19 @@ func CreatePublicChat(name string, timesource common.TimeSource) *Chat { } } +// Deprecated: buildProfileChatID shouldn't be used +// and is only left here in case profile chat feature is re-introduced. func buildProfileChatID(publicKeyString string) string { return "@" + publicKeyString } +// Deprecated: CreateProfileChat shouldn't be used +// and is only left here in case profile chat feature is re-introduced. func CreateProfileChat(pubkey string, timesource common.TimeSource) *Chat { + // Return nil to prevent usage of deprecated function + if deprecation.ChatProfileDeprecated { + return nil + } id := buildProfileChatID(pubkey) return &Chat{ @@ -562,7 +580,14 @@ func CreateGroupChat(timesource common.TimeSource) Chat { } } +// Deprecated: CreateTimelineChat shouldn't be used +// and is only left here in case profile chat feature is re-introduced. func CreateTimelineChat(timesource common.TimeSource) *Chat { + // Return nil to prevent usage of deprecated function + if deprecation.ChatTimelineDeprecated { + return nil + } + return &Chat{ ID: timelineChatID, Name: "#" + timelineChatID, diff --git a/protocol/messenger.go b/protocol/messenger.go index 42f313827..8e95c4c38 100644 --- a/protocol/messenger.go +++ b/protocol/messenger.go @@ -32,6 +32,7 @@ import ( "github.com/status-im/status-go/appmetrics" "github.com/status-im/status-go/connection" "github.com/status-im/status-go/contracts" + "github.com/status-im/status-go/deprecation" "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/images" @@ -1721,15 +1722,24 @@ func (m *Messenger) Init() error { return errors.New("invalid chat type") } } + + // Timeline and profile chats are deprecated. + // This code can be removed after some reasonable time. + // upsert timeline chat - err = m.ensureTimelineChat() - if err != nil { - return err + if !deprecation.ChatProfileDeprecated { + err = m.ensureTimelineChat() + if err != nil { + return err + } } + // upsert profile chat - err = m.ensureMyOwnProfileChat() - if err != nil { - return err + if !deprecation.ChatTimelineDeprecated { + err = m.ensureMyOwnProfileChat() + if err != nil { + return err + } } // Get chat IDs and public keys from the contacts. diff --git a/protocol/messenger_chats.go b/protocol/messenger_chats.go index ee986707c..090c7d33a 100644 --- a/protocol/messenger_chats.go +++ b/protocol/messenger_chats.go @@ -5,6 +5,7 @@ import ( "errors" "strings" + "github.com/status-im/status-go/deprecation" "github.com/status-im/status-go/protocol/common" "github.com/status-im/status-go/protocol/protobuf" "github.com/status-im/status-go/protocol/requests" @@ -231,7 +232,14 @@ func (m *Messenger) CreatePublicChat(request *requests.CreatePublicChat) (*Messe return m.createPublicChat(chatID, response) } +// Deprecated: CreateProfileChat shouldn't be used +// and is only left here in case profile chat feature is re-introduced. func (m *Messenger) CreateProfileChat(request *requests.CreateProfileChat) (*MessengerResponse, error) { + // Return error to prevent usage of deprecated function + if deprecation.ChatProfileDeprecated { + return nil, errors.New("profile chats are deprecated") + } + if err := request.Validate(); err != nil { return nil, err } @@ -528,7 +536,14 @@ func (m *Messenger) Join(chat *Chat) ([]*transport.Filter, error) { } } +// Deprecated: buildProfileChat shouldn't be used +// and is only left here in case profile chat feature is re-introduced. func (m *Messenger) buildProfileChat(id string) *Chat { + // Return nil to prevent usage of deprecated function + if deprecation.ChatProfileDeprecated { + return nil + } + // Create the corresponding profile chat profileChatID := buildProfileChatID(id) profileChat, ok := m.allChats.Load(profileChatID) @@ -541,7 +556,14 @@ func (m *Messenger) buildProfileChat(id string) *Chat { } +// Deprecated: ensureTimelineChat shouldn't be used +// and is only left here in case profile chat feature is re-introduced. func (m *Messenger) ensureTimelineChat() error { + // Return error to prevent usage of deprecated function + if deprecation.ChatProfileDeprecated { + return errors.New("timeline chats are deprecated") + } + chat, err := m.persistence.Chat(timelineChatID) if err != nil { return err @@ -556,7 +578,14 @@ func (m *Messenger) ensureTimelineChat() error { return m.saveChat(chat) } +// Deprecated: ensureMyOwnProfileChat shouldn't be used +// and is only left here in case profile chat feature is re-introduced. func (m *Messenger) ensureMyOwnProfileChat() error { + // Return error to prevent usage of deprecated function + if deprecation.ChatProfileDeprecated { + return errors.New("profile chats are deprecated") + } + chatID := common.PubkeyToHex(&m.identity.PublicKey) _, ok := m.allChats.Load(chatID) if ok { diff --git a/protocol/messenger_contact_requests_test.go b/protocol/messenger_contact_requests_test.go index e73273bff..fcad44907 100644 --- a/protocol/messenger_contact_requests_test.go +++ b/protocol/messenger_contact_requests_test.go @@ -180,9 +180,8 @@ func (s *MessengerContactRequestSuite) acceptContactRequest(contactRequest *comm s.Require().Equal(resp.ActivityCenterNotifications()[0].Name, resp.Contacts[0].PrimaryName()) // Check we have active chat in the response - s.Require().Len(resp.Chats(), 2) - s.Require().True(resp.Chats()[0].Active) // This is unactive profile chat - s.Require().True(resp.Chats()[1].Active) + s.Require().Len(resp.Chats(), 1) + s.Require().True(resp.Chats()[0].Active) // Make sure the sender is added to our contacts contacts := receiver.AddedContacts() diff --git a/protocol/messenger_contact_update_test.go b/protocol/messenger_contact_update_test.go index 9531a6fe4..4039a827d 100644 --- a/protocol/messenger_contact_update_test.go +++ b/protocol/messenger_contact_update_test.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/suite" + "github.com/status-im/status-go/deprecation" gethbridge "github.com/status-im/status-go/eth-node/bridge/geth" "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/types" @@ -63,15 +64,25 @@ func (s *MessengerContactUpdateSuite) TestReceiveContactUpdate() { // It should add the contact s.Require().True(contact.added()) - // It should create a profile chat & a one to one chat - s.Require().Len(response.Chats(), 2) - chats := response.Chats() - if chats[0].ChatType == ChatTypeOneToOne { - s.Require().False(chats[0].Active) + if deprecation.ChatProfileDeprecated { + // It should a one to one chat + s.Require().Len(response.Chats(), 1) + s.Require().False(response.Chats()[0].Active) } else { - s.Require().False(chats[1].Active) + // It should create a profile chat & a one to one chat + s.Require().Len(response.Chats(), 2) + chats := response.Chats() + if chats[0].ChatType == ChatTypeOneToOne { + s.Require().False(chats[0].Active) + } else { + s.Require().False(chats[1].Active) + } } + //// It should a one to one chat + //s.Require().Len(response.Chats(), 1) + //s.Require().False(response.Chats()[0].Active) + // Wait for the message to reach its destination response, err = WaitOnMessengerResponse( s.m, @@ -123,8 +134,13 @@ func (s *MessengerContactUpdateSuite) TestAddContact() { s.Require().Len(response.Contacts, 1) contact := response.Contacts[0] - // It adds the profile chat and the one to one chat - s.Require().Len(response.Chats(), 2) + if deprecation.ChatProfileDeprecated { + // It adds the one to one chat + s.Require().Len(response.Chats(), 1) + } else { + // It adds the profile chat and the one to one chat + s.Require().Len(response.Chats(), 2) + } // It should add the contact s.Require().True(contact.added()) @@ -162,8 +178,13 @@ func (s *MessengerContactUpdateSuite) TestAddContactWithENS() { s.Require().Len(response.Contacts, 1) contact := response.Contacts[0] - // It adds the profile chat and the one to one chat - s.Require().Len(response.Chats(), 2) + if deprecation.ChatProfileDeprecated { + // It adds the one to one chat + s.Require().Len(response.Chats(), 1) + } else { + // It adds the profile chat and the one to one chat + s.Require().Len(response.Chats(), 2) + } // It should add the contact s.Require().True(contact.added()) diff --git a/protocol/messenger_contacts.go b/protocol/messenger_contacts.go index ba1745286..70cee8c39 100644 --- a/protocol/messenger_contacts.go +++ b/protocol/messenger_contacts.go @@ -10,6 +10,7 @@ import ( "github.com/golang/protobuf/proto" "go.uber.org/zap" + "github.com/status-im/status-go/deprecation" "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/protocol/common" @@ -395,16 +396,22 @@ func (m *Messenger) addContact(ctx context.Context, pubKey, ensName, nickname, d return nil, err } - // Create the corresponding chat - profileChat := m.buildProfileChat(contact.ID) + // Profile chats are deprecated. + // Code below can be removed after some reasonable time. - _, err = m.Join(profileChat) - if err != nil { - return nil, err - } + //Create the corresponding chat + var profileChat *Chat + if !deprecation.ChatProfileDeprecated { + profileChat = m.buildProfileChat(contact.ID) - if err := m.saveChat(profileChat); err != nil { - return nil, err + _, err = m.Join(profileChat) + if err != nil { + return nil, err + } + + if err := m.saveChat(profileChat); err != nil { + return nil, err + } } publicKey, err := contact.PublicKey() @@ -454,12 +461,17 @@ func (m *Messenger) addContact(ctx context.Context, pubKey, ensName, nickname, d return nil, err } - // Add chat - response.AddChat(profileChat) + // Profile chats are deprecated. + // Code below can be removed after some reasonable time. - _, err = m.transport.InitFilters([]string{profileChat.ID}, []*ecdsa.PublicKey{publicKey}) - if err != nil { - return nil, err + // Add chat + if !deprecation.ChatProfileDeprecated { + response.AddChat(profileChat) + + _, err = m.transport.InitFilters([]string{profileChat.ID}, []*ecdsa.PublicKey{publicKey}) + if err != nil { + return nil, err + } } // Publish contact code @@ -643,18 +655,23 @@ func (m *Messenger) removeContact(ctx context.Context, response *MessengerRespon return err } - // Create the corresponding profile chat - profileChatID := buildProfileChatID(contact.ID) - _, ok = m.allChats.Load(profileChatID) + // Profile chats are deprecated. + // Code below can be removed after some reasonable time. - if ok { - chatResponse, err := m.deactivateChat(profileChatID, 0, false, true) - if err != nil { - return err - } - err = response.Merge(chatResponse) - if err != nil { - return err + //Create the corresponding profile chat + if !deprecation.ChatProfileDeprecated { + profileChatID := buildProfileChatID(contact.ID) + _, ok = m.allChats.Load(profileChatID) + + if ok { + chatResponse, err := m.deactivateChat(profileChatID, 0, false, true) + if err != nil { + return err + } + err = response.Merge(chatResponse) + if err != nil { + return err + } } } diff --git a/protocol/messenger_mute_test.go b/protocol/messenger_mute_test.go index f01a5af9a..28d22f0cc 100644 --- a/protocol/messenger_mute_test.go +++ b/protocol/messenger_mute_test.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/suite" "go.uber.org/zap" + "github.com/status-im/status-go/deprecation" "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/protocol/requests" ) @@ -43,7 +44,7 @@ func (s *MessengerMuteSuite) TestSetMute() { s.NoError(error) allChats := s.m.Chats() - s.Require().Len(allChats, 3) + s.Require().Len(allChats, deprecation.AddChatsCount(1)) var actualChat *Chat @@ -93,7 +94,7 @@ func (s *MessengerMuteSuite) TestSetMuteForDuration() { s.Require().NoError(err) allChats := s.m.Chats() - s.Require().Len(allChats, 3) + s.Require().Len(allChats, deprecation.AddChatsCount(1)) var actualChat *Chat diff --git a/protocol/messenger_test.go b/protocol/messenger_test.go index 6b9afceb9..17ca2f6f2 100644 --- a/protocol/messenger_test.go +++ b/protocol/messenger_test.go @@ -16,6 +16,7 @@ import ( "github.com/stretchr/testify/suite" "go.uber.org/zap" + "github.com/status-im/status-go/deprecation" coretypes "github.com/status-im/status-go/eth-node/core/types" "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/types" @@ -163,7 +164,7 @@ func (s *MessengerSuite) TestInit() { _, err = s.m.AddContact(context.Background(), &requests.AddContact{ID: types.EncodeHex(crypto.FromECDSAPub(&key.PublicKey))}) s.Require().NoError(err) }, - AddedFilters: 2, + AddedFilters: deprecation.AddProfileFiltersCount(1), }, } @@ -175,7 +176,7 @@ func (s *MessengerSuite) TestInit() { s.Require().NoError(err) filters := s.m.transport.Filters() expectedFilters += tc.AddedFilters - s.Equal(expectedFilters+1, len(filters)) + s.Equal(deprecation.AddTimelineFiltersCount(expectedFilters), len(filters)) }) } } @@ -306,7 +307,7 @@ func (s *MessengerSuite) TestMarkAllRead() { s.Require().NoError(err) chats := s.m.Chats() - s.Require().Len(chats, 3) + s.Require().Len(chats, deprecation.AddChatsCount(1)) for idx := range chats { if chats[idx].ID == chat.ID { s.Require().Equal(uint(0), chats[idx].UnviewedMessagesCount) @@ -342,6 +343,11 @@ func (s *MessengerSuite) TestSendPublic() { } func (s *MessengerSuite) TestSendProfile() { + // Early exit to skip testing deprecated code + if deprecation.ChatProfileDeprecated { + return + } + chat := CreateProfileChat("0x"+hex.EncodeToString(crypto.FromECDSAPub(&s.privateKey.PublicKey)), s.m.transport) chat.LastClockValue = uint64(100000000000000) err := s.m.SaveChat(chat) @@ -1057,7 +1063,7 @@ func (s *MessengerSuite) TestChatPersistencePublic() { s.Require().NoError(s.m.SaveChat(chat)) savedChats := s.m.Chats() - s.Require().Equal(3, len(savedChats)) + s.Require().Equal(deprecation.AddChatsCount(1), len(savedChats)) } func (s *MessengerSuite) TestDeleteChat() { @@ -1078,11 +1084,11 @@ func (s *MessengerSuite) TestDeleteChat() { s.Require().NoError(s.m.SaveChat(chat)) savedChats := s.m.Chats() - s.Require().Equal(3, len(savedChats)) + s.Require().Equal(deprecation.AddChatsCount(1), len(savedChats)) s.Require().NoError(s.m.DeleteChat(chatID)) savedChats = s.m.Chats() - s.Require().Equal(2, len(savedChats)) + s.Require().Equal(deprecation.AddChatsCount(0), len(savedChats)) } func (s *MessengerSuite) TestChatPersistenceUpdate() { @@ -1102,7 +1108,7 @@ func (s *MessengerSuite) TestChatPersistenceUpdate() { s.Require().NoError(s.m.SaveChat(chat)) savedChats := s.m.Chats() - s.Require().Equal(3, len(savedChats)) + s.Require().Equal(deprecation.AddChatsCount(1), len(savedChats)) var actualChat *Chat for idx := range savedChats { @@ -1152,7 +1158,7 @@ func (s *MessengerSuite) TestChatPersistenceOneToOne() { s.Require().NoError(s.m.SaveChat(chat)) savedChats := s.m.Chats() - s.Require().Equal(3, len(savedChats)) + s.Require().Equal(deprecation.AddChatsCount(1), len(savedChats)) var actualChat *Chat for idx := range savedChats { @@ -1233,7 +1239,7 @@ func (s *MessengerSuite) TestChatPersistencePrivateGroupChat() { } s.Require().NoError(s.m.SaveChat(chat)) savedChats := s.m.Chats() - s.Require().Equal(3, len(savedChats)) + s.Require().Equal(deprecation.AddChatsCount(1), len(savedChats)) var actualChat *Chat for idx := range savedChats { @@ -1425,7 +1431,7 @@ func (s *MessengerSuite) TestBlockContact() { // The chat is deleted actualChats := s.m.Chats() - s.Require().Equal(4, len(actualChats)) + s.Require().Equal(deprecation.AddChatsCount(2), len(actualChats)) // The messages have been deleted chat2Messages, _, err := s.m.MessageByChatID(chat2.ID, "", 20) diff --git a/protocol/requests/create_profile_chat.go b/protocol/requests/create_profile_chat.go index 936816316..e9a35483b 100644 --- a/protocol/requests/create_profile_chat.go +++ b/protocol/requests/create_profile_chat.go @@ -2,17 +2,30 @@ package requests import ( "errors" + + "github.com/status-im/status-go/deprecation" ) -var ErrCreateProfileChatInvalidID = errors.New("create-public-chat: invalid id") +// Deprecated: errCreateProfileChatInvalidID shouldn't be used +// and is only left here in case profile chat feature is re-introduced. +var errCreateProfileChatInvalidID = errors.New("create-public-chat: invalid id") +// Deprecated: CreateProfileChat shouldn't be used +// and is only left here in case profile chat feature is re-introduced. type CreateProfileChat struct { ID string `json:"id"` } +// Deprecated: Validate shouldn't be used +// and is only left here in case profile chat feature is re-introduced. func (c *CreateProfileChat) Validate() error { + // Return error to prevent usafe of deprecated function + if deprecation.ChatProfileDeprecated { + return errors.New("profile chats are deprecated") + } + if len(c.ID) == 0 { - return ErrCreateProfileChatInvalidID + return errCreateProfileChatInvalidID } return nil