fx: deprecate profile and timeline chats (#3809)

This commit is contained in:
Igor Sirotin 2023-08-03 17:16:11 +03:00 committed by GitHub
parent fbffcdc7a7
commit d535cd95f8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 209 additions and 57 deletions

31
deprecation/protocol.go Normal file
View File

@ -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
}

View File

@ -7,6 +7,7 @@ import (
"math/rand" "math/rand"
"time" "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/crypto"
"github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/eth-node/types"
userimage "github.com/status-im/status-go/images" userimage "github.com/status-im/status-go/images"
@ -32,7 +33,11 @@ const (
ChatTypeOneToOne ChatType = iota + 1 ChatTypeOneToOne ChatType = iota + 1
ChatTypePublic ChatTypePublic
ChatTypePrivateGroupChat ChatTypePrivateGroupChat
// Deprecated: CreateProfileChat shouldn't be used
// and is only left here in case profile chat feature is re-introduced.
ChatTypeProfile ChatTypeProfile
// Deprecated: ChatTypeTimeline shouldn't be used
// and is only left here in case profile chat feature is re-introduced.
ChatTypeTimeline ChatTypeTimeline
ChatTypeCommunityChat ChatTypeCommunityChat
) )
@ -63,6 +68,7 @@ const (
const pkStringLength = 68 const pkStringLength = 68
// timelineChatID is a magic constant id for your own timeline // timelineChatID is a magic constant id for your own timeline
// Deprecated: timeline chats are no more supported
const timelineChatID = "@timeline70bd746ddcc12beb96b2c9d572d0784ab137ffc774f5383e50585a932080b57cca0484b259e61cecbaa33a4c98a300a" const timelineChatID = "@timeline70bd746ddcc12beb96b2c9d572d0784ab137ffc774f5383e50585a932080b57cca0484b259e61cecbaa33a4c98a300a"
type Chat struct { type Chat struct {
@ -241,10 +247,14 @@ func (c *Chat) Public() bool {
return c.ChatType == ChatTypePublic 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 { func (c *Chat) ProfileUpdates() bool {
return c.ChatType == ChatTypeProfile || len(c.Profile) > 0 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 { func (c *Chat) Timeline() bool {
return c.ChatType == ChatTypeTimeline 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 { func buildProfileChatID(publicKeyString string) string {
return "@" + publicKeyString 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 { func CreateProfileChat(pubkey string, timesource common.TimeSource) *Chat {
// Return nil to prevent usage of deprecated function
if deprecation.ChatProfileDeprecated {
return nil
}
id := buildProfileChatID(pubkey) id := buildProfileChatID(pubkey)
return &Chat{ 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 { func CreateTimelineChat(timesource common.TimeSource) *Chat {
// Return nil to prevent usage of deprecated function
if deprecation.ChatTimelineDeprecated {
return nil
}
return &Chat{ return &Chat{
ID: timelineChatID, ID: timelineChatID,
Name: "#" + timelineChatID, Name: "#" + timelineChatID,

View File

@ -32,6 +32,7 @@ import (
"github.com/status-im/status-go/appmetrics" "github.com/status-im/status-go/appmetrics"
"github.com/status-im/status-go/connection" "github.com/status-im/status-go/connection"
"github.com/status-im/status-go/contracts" "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/crypto"
"github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/eth-node/types"
"github.com/status-im/status-go/images" "github.com/status-im/status-go/images"
@ -1721,15 +1722,24 @@ func (m *Messenger) Init() error {
return errors.New("invalid chat type") return errors.New("invalid chat type")
} }
} }
// Timeline and profile chats are deprecated.
// This code can be removed after some reasonable time.
// upsert timeline chat // upsert timeline chat
err = m.ensureTimelineChat() if !deprecation.ChatProfileDeprecated {
if err != nil { err = m.ensureTimelineChat()
return err if err != nil {
return err
}
} }
// upsert profile chat // upsert profile chat
err = m.ensureMyOwnProfileChat() if !deprecation.ChatTimelineDeprecated {
if err != nil { err = m.ensureMyOwnProfileChat()
return err if err != nil {
return err
}
} }
// Get chat IDs and public keys from the contacts. // Get chat IDs and public keys from the contacts.

View File

@ -5,6 +5,7 @@ import (
"errors" "errors"
"strings" "strings"
"github.com/status-im/status-go/deprecation"
"github.com/status-im/status-go/protocol/common" "github.com/status-im/status-go/protocol/common"
"github.com/status-im/status-go/protocol/protobuf" "github.com/status-im/status-go/protocol/protobuf"
"github.com/status-im/status-go/protocol/requests" "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) 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) { 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 { if err := request.Validate(); err != nil {
return nil, err 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 { 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 // Create the corresponding profile chat
profileChatID := buildProfileChatID(id) profileChatID := buildProfileChatID(id)
profileChat, ok := m.allChats.Load(profileChatID) 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 { 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) chat, err := m.persistence.Chat(timelineChatID)
if err != nil { if err != nil {
return err return err
@ -556,7 +578,14 @@ func (m *Messenger) ensureTimelineChat() error {
return m.saveChat(chat) 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 { 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) chatID := common.PubkeyToHex(&m.identity.PublicKey)
_, ok := m.allChats.Load(chatID) _, ok := m.allChats.Load(chatID)
if ok { if ok {

View File

@ -180,9 +180,8 @@ func (s *MessengerContactRequestSuite) acceptContactRequest(contactRequest *comm
s.Require().Equal(resp.ActivityCenterNotifications()[0].Name, resp.Contacts[0].PrimaryName()) s.Require().Equal(resp.ActivityCenterNotifications()[0].Name, resp.Contacts[0].PrimaryName())
// Check we have active chat in the response // Check we have active chat in the response
s.Require().Len(resp.Chats(), 2) s.Require().Len(resp.Chats(), 1)
s.Require().True(resp.Chats()[0].Active) // This is unactive profile chat s.Require().True(resp.Chats()[0].Active)
s.Require().True(resp.Chats()[1].Active)
// Make sure the sender is added to our contacts // Make sure the sender is added to our contacts
contacts := receiver.AddedContacts() contacts := receiver.AddedContacts()

View File

@ -6,6 +6,7 @@ import (
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
"github.com/status-im/status-go/deprecation"
gethbridge "github.com/status-im/status-go/eth-node/bridge/geth" 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/crypto"
"github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/eth-node/types"
@ -63,15 +64,25 @@ func (s *MessengerContactUpdateSuite) TestReceiveContactUpdate() {
// It should add the contact // It should add the contact
s.Require().True(contact.added()) s.Require().True(contact.added())
// It should create a profile chat & a one to one chat if deprecation.ChatProfileDeprecated {
s.Require().Len(response.Chats(), 2) // It should a one to one chat
chats := response.Chats() s.Require().Len(response.Chats(), 1)
if chats[0].ChatType == ChatTypeOneToOne { s.Require().False(response.Chats()[0].Active)
s.Require().False(chats[0].Active)
} else { } 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 // Wait for the message to reach its destination
response, err = WaitOnMessengerResponse( response, err = WaitOnMessengerResponse(
s.m, s.m,
@ -123,8 +134,13 @@ func (s *MessengerContactUpdateSuite) TestAddContact() {
s.Require().Len(response.Contacts, 1) s.Require().Len(response.Contacts, 1)
contact := response.Contacts[0] contact := response.Contacts[0]
// It adds the profile chat and the one to one chat if deprecation.ChatProfileDeprecated {
s.Require().Len(response.Chats(), 2) // 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 // It should add the contact
s.Require().True(contact.added()) s.Require().True(contact.added())
@ -162,8 +178,13 @@ func (s *MessengerContactUpdateSuite) TestAddContactWithENS() {
s.Require().Len(response.Contacts, 1) s.Require().Len(response.Contacts, 1)
contact := response.Contacts[0] contact := response.Contacts[0]
// It adds the profile chat and the one to one chat if deprecation.ChatProfileDeprecated {
s.Require().Len(response.Chats(), 2) // 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 // It should add the contact
s.Require().True(contact.added()) s.Require().True(contact.added())

View File

@ -10,6 +10,7 @@ import (
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"go.uber.org/zap" "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/crypto"
"github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/eth-node/types"
"github.com/status-im/status-go/protocol/common" "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 return nil, err
} }
// Create the corresponding chat // Profile chats are deprecated.
profileChat := m.buildProfileChat(contact.ID) // Code below can be removed after some reasonable time.
_, err = m.Join(profileChat) //Create the corresponding chat
if err != nil { var profileChat *Chat
return nil, err if !deprecation.ChatProfileDeprecated {
} profileChat = m.buildProfileChat(contact.ID)
if err := m.saveChat(profileChat); err != nil { _, err = m.Join(profileChat)
return nil, err if err != nil {
return nil, err
}
if err := m.saveChat(profileChat); err != nil {
return nil, err
}
} }
publicKey, err := contact.PublicKey() publicKey, err := contact.PublicKey()
@ -454,12 +461,17 @@ func (m *Messenger) addContact(ctx context.Context, pubKey, ensName, nickname, d
return nil, err return nil, err
} }
// Add chat // Profile chats are deprecated.
response.AddChat(profileChat) // Code below can be removed after some reasonable time.
_, err = m.transport.InitFilters([]string{profileChat.ID}, []*ecdsa.PublicKey{publicKey}) // Add chat
if err != nil { if !deprecation.ChatProfileDeprecated {
return nil, err response.AddChat(profileChat)
_, err = m.transport.InitFilters([]string{profileChat.ID}, []*ecdsa.PublicKey{publicKey})
if err != nil {
return nil, err
}
} }
// Publish contact code // Publish contact code
@ -643,18 +655,23 @@ func (m *Messenger) removeContact(ctx context.Context, response *MessengerRespon
return err return err
} }
// Create the corresponding profile chat // Profile chats are deprecated.
profileChatID := buildProfileChatID(contact.ID) // Code below can be removed after some reasonable time.
_, ok = m.allChats.Load(profileChatID)
if ok { //Create the corresponding profile chat
chatResponse, err := m.deactivateChat(profileChatID, 0, false, true) if !deprecation.ChatProfileDeprecated {
if err != nil { profileChatID := buildProfileChatID(contact.ID)
return err _, ok = m.allChats.Load(profileChatID)
}
err = response.Merge(chatResponse) if ok {
if err != nil { chatResponse, err := m.deactivateChat(profileChatID, 0, false, true)
return err if err != nil {
return err
}
err = response.Merge(chatResponse)
if err != nil {
return err
}
} }
} }

View File

@ -7,6 +7,7 @@ import (
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
"go.uber.org/zap" "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/crypto"
"github.com/status-im/status-go/protocol/requests" "github.com/status-im/status-go/protocol/requests"
) )
@ -43,7 +44,7 @@ func (s *MessengerMuteSuite) TestSetMute() {
s.NoError(error) s.NoError(error)
allChats := s.m.Chats() allChats := s.m.Chats()
s.Require().Len(allChats, 3) s.Require().Len(allChats, deprecation.AddChatsCount(1))
var actualChat *Chat var actualChat *Chat
@ -93,7 +94,7 @@ func (s *MessengerMuteSuite) TestSetMuteForDuration() {
s.Require().NoError(err) s.Require().NoError(err)
allChats := s.m.Chats() allChats := s.m.Chats()
s.Require().Len(allChats, 3) s.Require().Len(allChats, deprecation.AddChatsCount(1))
var actualChat *Chat var actualChat *Chat

View File

@ -16,6 +16,7 @@ import (
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
"go.uber.org/zap" "go.uber.org/zap"
"github.com/status-im/status-go/deprecation"
coretypes "github.com/status-im/status-go/eth-node/core/types" 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/crypto"
"github.com/status-im/status-go/eth-node/types" "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))}) _, err = s.m.AddContact(context.Background(), &requests.AddContact{ID: types.EncodeHex(crypto.FromECDSAPub(&key.PublicKey))})
s.Require().NoError(err) s.Require().NoError(err)
}, },
AddedFilters: 2, AddedFilters: deprecation.AddProfileFiltersCount(1),
}, },
} }
@ -175,7 +176,7 @@ func (s *MessengerSuite) TestInit() {
s.Require().NoError(err) s.Require().NoError(err)
filters := s.m.transport.Filters() filters := s.m.transport.Filters()
expectedFilters += tc.AddedFilters 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) s.Require().NoError(err)
chats := s.m.Chats() chats := s.m.Chats()
s.Require().Len(chats, 3) s.Require().Len(chats, deprecation.AddChatsCount(1))
for idx := range chats { for idx := range chats {
if chats[idx].ID == chat.ID { if chats[idx].ID == chat.ID {
s.Require().Equal(uint(0), chats[idx].UnviewedMessagesCount) s.Require().Equal(uint(0), chats[idx].UnviewedMessagesCount)
@ -342,6 +343,11 @@ func (s *MessengerSuite) TestSendPublic() {
} }
func (s *MessengerSuite) TestSendProfile() { 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 := CreateProfileChat("0x"+hex.EncodeToString(crypto.FromECDSAPub(&s.privateKey.PublicKey)), s.m.transport)
chat.LastClockValue = uint64(100000000000000) chat.LastClockValue = uint64(100000000000000)
err := s.m.SaveChat(chat) err := s.m.SaveChat(chat)
@ -1057,7 +1063,7 @@ func (s *MessengerSuite) TestChatPersistencePublic() {
s.Require().NoError(s.m.SaveChat(chat)) s.Require().NoError(s.m.SaveChat(chat))
savedChats := s.m.Chats() savedChats := s.m.Chats()
s.Require().Equal(3, len(savedChats)) s.Require().Equal(deprecation.AddChatsCount(1), len(savedChats))
} }
func (s *MessengerSuite) TestDeleteChat() { func (s *MessengerSuite) TestDeleteChat() {
@ -1078,11 +1084,11 @@ func (s *MessengerSuite) TestDeleteChat() {
s.Require().NoError(s.m.SaveChat(chat)) s.Require().NoError(s.m.SaveChat(chat))
savedChats := s.m.Chats() 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)) s.Require().NoError(s.m.DeleteChat(chatID))
savedChats = s.m.Chats() savedChats = s.m.Chats()
s.Require().Equal(2, len(savedChats)) s.Require().Equal(deprecation.AddChatsCount(0), len(savedChats))
} }
func (s *MessengerSuite) TestChatPersistenceUpdate() { func (s *MessengerSuite) TestChatPersistenceUpdate() {
@ -1102,7 +1108,7 @@ func (s *MessengerSuite) TestChatPersistenceUpdate() {
s.Require().NoError(s.m.SaveChat(chat)) s.Require().NoError(s.m.SaveChat(chat))
savedChats := s.m.Chats() savedChats := s.m.Chats()
s.Require().Equal(3, len(savedChats)) s.Require().Equal(deprecation.AddChatsCount(1), len(savedChats))
var actualChat *Chat var actualChat *Chat
for idx := range savedChats { for idx := range savedChats {
@ -1152,7 +1158,7 @@ func (s *MessengerSuite) TestChatPersistenceOneToOne() {
s.Require().NoError(s.m.SaveChat(chat)) s.Require().NoError(s.m.SaveChat(chat))
savedChats := s.m.Chats() savedChats := s.m.Chats()
s.Require().Equal(3, len(savedChats)) s.Require().Equal(deprecation.AddChatsCount(1), len(savedChats))
var actualChat *Chat var actualChat *Chat
for idx := range savedChats { for idx := range savedChats {
@ -1233,7 +1239,7 @@ func (s *MessengerSuite) TestChatPersistencePrivateGroupChat() {
} }
s.Require().NoError(s.m.SaveChat(chat)) s.Require().NoError(s.m.SaveChat(chat))
savedChats := s.m.Chats() savedChats := s.m.Chats()
s.Require().Equal(3, len(savedChats)) s.Require().Equal(deprecation.AddChatsCount(1), len(savedChats))
var actualChat *Chat var actualChat *Chat
for idx := range savedChats { for idx := range savedChats {
@ -1425,7 +1431,7 @@ func (s *MessengerSuite) TestBlockContact() {
// The chat is deleted // The chat is deleted
actualChats := s.m.Chats() actualChats := s.m.Chats()
s.Require().Equal(4, len(actualChats)) s.Require().Equal(deprecation.AddChatsCount(2), len(actualChats))
// The messages have been deleted // The messages have been deleted
chat2Messages, _, err := s.m.MessageByChatID(chat2.ID, "", 20) chat2Messages, _, err := s.m.MessageByChatID(chat2.ID, "", 20)

View File

@ -2,17 +2,30 @@ package requests
import ( import (
"errors" "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 { type CreateProfileChat struct {
ID string `json:"id"` 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 { 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 { if len(c.ID) == 0 {
return ErrCreateProfileChatInvalidID return errCreateProfileChatInvalidID
} }
return nil return nil