New way of sharing communities (#4341)
This commit is contained in:
parent
7af313cd53
commit
90c31afe7c
|
@ -5102,3 +5102,53 @@ func (m *Manager) GetCuratedCommunities() (*CuratedCommunities, error) {
|
||||||
func (m *Manager) SetCuratedCommunities(communities *CuratedCommunities) error {
|
func (m *Manager) SetCuratedCommunities(communities *CuratedCommunities) error {
|
||||||
return m.persistence.SetCuratedCommunities(communities)
|
return m.persistence.SetCuratedCommunities(communities)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ToLinkPreveiwThumbnail(image images.IdentityImage) (*common.LinkPreviewThumbnail, error) {
|
||||||
|
thumbnail := &common.LinkPreviewThumbnail{}
|
||||||
|
|
||||||
|
if image.IsEmpty() {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
width, height, err := images.GetImageDimensions(image.Payload)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to get image dimensions: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
dataURI, err := image.GetDataURI()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to get data uri: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
thumbnail.Width = width
|
||||||
|
thumbnail.Height = height
|
||||||
|
thumbnail.DataURI = dataURI
|
||||||
|
return thumbnail, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Community) ToStatusLinkPreview() (*common.StatusCommunityLinkPreview, error) {
|
||||||
|
communityLinkPreview := &common.StatusCommunityLinkPreview{}
|
||||||
|
if image, ok := c.Images()[images.SmallDimName]; ok {
|
||||||
|
thumbnail, err := ToLinkPreveiwThumbnail(images.IdentityImage{Payload: image.Payload})
|
||||||
|
if err != nil {
|
||||||
|
c.config.Logger.Warn("unfurling status link: failed to set community thumbnail", zap.Error(err))
|
||||||
|
}
|
||||||
|
communityLinkPreview.Icon = *thumbnail
|
||||||
|
}
|
||||||
|
|
||||||
|
if image, ok := c.Images()[images.BannerIdentityName]; ok {
|
||||||
|
thumbnail, err := ToLinkPreveiwThumbnail(images.IdentityImage{Payload: image.Payload})
|
||||||
|
if err != nil {
|
||||||
|
c.config.Logger.Warn("unfurling status link: failed to set community thumbnail", zap.Error(err))
|
||||||
|
}
|
||||||
|
communityLinkPreview.Banner = *thumbnail
|
||||||
|
}
|
||||||
|
|
||||||
|
communityLinkPreview.CommunityID = c.IDString()
|
||||||
|
communityLinkPreview.DisplayName = c.Name()
|
||||||
|
communityLinkPreview.Description = c.DescriptionText()
|
||||||
|
communityLinkPreview.MembersCount = uint32(c.MembersCount())
|
||||||
|
communityLinkPreview.Color = c.Color()
|
||||||
|
|
||||||
|
return communityLinkPreview, nil
|
||||||
|
}
|
||||||
|
|
|
@ -116,8 +116,8 @@ func setUpCommunityAndRoles(base CommunityEventsTestsInterface, role protobuf.Co
|
||||||
refreshMessengerResponses(base)
|
refreshMessengerResponses(base)
|
||||||
|
|
||||||
// add events sender and member to the community
|
// add events sender and member to the community
|
||||||
advertiseCommunityTo(suite, community, base.GetControlNode(), base.GetEventSender())
|
advertiseCommunityToUserOldWay(suite, community, base.GetControlNode(), base.GetEventSender())
|
||||||
advertiseCommunityTo(suite, community, base.GetControlNode(), base.GetMember())
|
advertiseCommunityToUserOldWay(suite, community, base.GetControlNode(), base.GetMember())
|
||||||
|
|
||||||
request := &requests.RequestToJoinCommunity{
|
request := &requests.RequestToJoinCommunity{
|
||||||
CommunityID: community.ID(),
|
CommunityID: community.ID(),
|
||||||
|
@ -417,8 +417,8 @@ func setUpOnRequestCommunityAndRoles(base CommunityEventsTestsInterface, role pr
|
||||||
community := createTestCommunity(base, protobuf.CommunityPermissions_MANUAL_ACCEPT)
|
community := createTestCommunity(base, protobuf.CommunityPermissions_MANUAL_ACCEPT)
|
||||||
refreshMessengerResponses(base)
|
refreshMessengerResponses(base)
|
||||||
|
|
||||||
advertiseCommunityTo(s, community, base.GetControlNode(), base.GetEventSender())
|
advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), base.GetEventSender())
|
||||||
advertiseCommunityTo(s, community, base.GetControlNode(), base.GetMember())
|
advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), base.GetMember())
|
||||||
|
|
||||||
requestEventSender := &requests.RequestToJoinCommunity{
|
requestEventSender := &requests.RequestToJoinCommunity{
|
||||||
CommunityID: community.ID(),
|
CommunityID: community.ID(),
|
||||||
|
@ -451,7 +451,7 @@ func setUpOnRequestCommunityAndRoles(base CommunityEventsTestsInterface, role pr
|
||||||
waitOnMessengerResponse(s, checkPermissionGranted, base.GetMember())
|
waitOnMessengerResponse(s, checkPermissionGranted, base.GetMember())
|
||||||
|
|
||||||
for _, eventSender := range additionalEventSenders {
|
for _, eventSender := range additionalEventSenders {
|
||||||
advertiseCommunityTo(s, community, base.GetControlNode(), eventSender)
|
advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), eventSender)
|
||||||
joinOnRequestCommunity(s, community, base.GetControlNode(), eventSender, requestEventSender)
|
joinOnRequestCommunity(s, community, base.GetControlNode(), eventSender, requestEventSender)
|
||||||
|
|
||||||
grantPermission(s, community, base.GetControlNode(), eventSender, role)
|
grantPermission(s, community, base.GetControlNode(), eventSender, role)
|
||||||
|
@ -1019,6 +1019,34 @@ func testCreateEditDeleteBecomeMemberPermission(base CommunityEventsTestsInterfa
|
||||||
deleteTokenPermission(base, community, deleteTokenPermissionRequest)
|
deleteTokenPermission(base, community, deleteTokenPermissionRequest)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// To be removed in https://github.com/status-im/status-go/issues/4437
|
||||||
|
func advertiseCommunityToUserOldWay(s *suite.Suite, community *communities.Community, owner *Messenger, user *Messenger) {
|
||||||
|
|
||||||
|
chat := CreateOneToOneChat(common.PubkeyToHex(&user.identity.PublicKey), &user.identity.PublicKey, user.transport)
|
||||||
|
|
||||||
|
inputMessage := common.NewMessage()
|
||||||
|
inputMessage.ChatId = chat.ID
|
||||||
|
inputMessage.Text = "some text"
|
||||||
|
inputMessage.CommunityID = community.IDString()
|
||||||
|
|
||||||
|
err := owner.SaveChat(chat)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
_, err = owner.SendChatMessage(context.Background(), inputMessage)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
// Ensure community is received
|
||||||
|
response, err := WaitOnMessengerResponse(
|
||||||
|
user,
|
||||||
|
func(r *MessengerResponse) bool {
|
||||||
|
return len(r.Communities()) > 0
|
||||||
|
},
|
||||||
|
"event sender did not receive community request to join",
|
||||||
|
)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
communityInResponse := response.Communities()[0]
|
||||||
|
s.Require().Equal(community.ID(), communityInResponse.ID())
|
||||||
|
}
|
||||||
|
|
||||||
func testAcceptMemberRequestToJoin(base CommunityEventsTestsInterface, community *communities.Community, user *Messenger) {
|
func testAcceptMemberRequestToJoin(base CommunityEventsTestsInterface, community *communities.Community, user *Messenger) {
|
||||||
// set up additional user that will send request to join
|
// set up additional user that will send request to join
|
||||||
_, err := user.Start()
|
_, err := user.Start()
|
||||||
|
@ -1028,7 +1056,7 @@ func testAcceptMemberRequestToJoin(base CommunityEventsTestsInterface, community
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
defer TearDownMessenger(s, user)
|
defer TearDownMessenger(s, user)
|
||||||
|
|
||||||
advertiseCommunityTo(s, community, base.GetControlNode(), user)
|
advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), user)
|
||||||
|
|
||||||
// user sends request to join
|
// user sends request to join
|
||||||
requestToJoin := &requests.RequestToJoinCommunity{CommunityID: community.ID(), ENSName: "testName"}
|
requestToJoin := &requests.RequestToJoinCommunity{CommunityID: community.ID(), ENSName: "testName"}
|
||||||
|
@ -1158,7 +1186,7 @@ func testAcceptMemberRequestToJoinResponseSharedWithOtherEventSenders(base Commu
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
defer TearDownMessenger(s, user)
|
defer TearDownMessenger(s, user)
|
||||||
|
|
||||||
advertiseCommunityTo(s, community, base.GetControlNode(), user)
|
advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), user)
|
||||||
|
|
||||||
// user sends request to join
|
// user sends request to join
|
||||||
requestToJoin := &requests.RequestToJoinCommunity{CommunityID: community.ID()}
|
requestToJoin := &requests.RequestToJoinCommunity{CommunityID: community.ID()}
|
||||||
|
@ -1236,7 +1264,7 @@ func testRejectMemberRequestToJoinResponseSharedWithOtherEventSenders(base Commu
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
defer TearDownMessenger(s, user)
|
defer TearDownMessenger(s, user)
|
||||||
|
|
||||||
advertiseCommunityTo(s, community, base.GetControlNode(), user)
|
advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), user)
|
||||||
|
|
||||||
// user sends request to join
|
// user sends request to join
|
||||||
requestToJoin := &requests.RequestToJoinCommunity{CommunityID: community.ID()}
|
requestToJoin := &requests.RequestToJoinCommunity{CommunityID: community.ID()}
|
||||||
|
@ -1313,7 +1341,7 @@ func testRejectMemberRequestToJoin(base CommunityEventsTestsInterface, community
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
defer TearDownMessenger(s, user)
|
defer TearDownMessenger(s, user)
|
||||||
|
|
||||||
advertiseCommunityTo(s, community, base.GetControlNode(), user)
|
advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), user)
|
||||||
|
|
||||||
// user sends request to join
|
// user sends request to join
|
||||||
requestToJoin := &requests.RequestToJoinCommunity{CommunityID: community.ID()}
|
requestToJoin := &requests.RequestToJoinCommunity{CommunityID: community.ID()}
|
||||||
|
@ -1411,7 +1439,7 @@ func testControlNodeHandlesMultipleEventSenderRequestToJoinDecisions(base Commun
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
defer TearDownMessenger(s, user)
|
defer TearDownMessenger(s, user)
|
||||||
|
|
||||||
advertiseCommunityTo(s, community, base.GetControlNode(), user)
|
advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), user)
|
||||||
|
|
||||||
// user sends request to join
|
// user sends request to join
|
||||||
requestToJoin := &requests.RequestToJoinCommunity{CommunityID: community.ID()}
|
requestToJoin := &requests.RequestToJoinCommunity{CommunityID: community.ID()}
|
||||||
|
@ -2029,8 +2057,8 @@ func testJoinedPrivilegedMemberReceiveRequestsToJoin(base CommunityEventsTestsIn
|
||||||
|
|
||||||
s := base.GetSuite()
|
s := base.GetSuite()
|
||||||
|
|
||||||
advertiseCommunityTo(s, community, base.GetControlNode(), bob)
|
advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), bob)
|
||||||
advertiseCommunityTo(s, community, base.GetControlNode(), newPrivilegedUser)
|
advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), newPrivilegedUser)
|
||||||
|
|
||||||
requestNewPrivilegedUser := &requests.RequestToJoinCommunity{
|
requestNewPrivilegedUser := &requests.RequestToJoinCommunity{
|
||||||
CommunityID: community.ID(),
|
CommunityID: community.ID(),
|
||||||
|
@ -2095,9 +2123,9 @@ func testMemberReceiveRequestsToJoinAfterGettingNewRole(base CommunityEventsTest
|
||||||
// control node creates a community and chat
|
// control node creates a community and chat
|
||||||
community := createTestCommunity(base, protobuf.CommunityPermissions_MANUAL_ACCEPT)
|
community := createTestCommunity(base, protobuf.CommunityPermissions_MANUAL_ACCEPT)
|
||||||
|
|
||||||
advertiseCommunityTo(s, community, base.GetControlNode(), base.GetEventSender())
|
advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), base.GetEventSender())
|
||||||
advertiseCommunityTo(s, community, base.GetControlNode(), base.GetMember())
|
advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), base.GetMember())
|
||||||
advertiseCommunityTo(s, community, base.GetControlNode(), bob)
|
advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), bob)
|
||||||
|
|
||||||
requestAlice := &requests.RequestToJoinCommunity{
|
requestAlice := &requests.RequestToJoinCommunity{
|
||||||
CommunityID: community.ID(),
|
CommunityID: community.ID(),
|
||||||
|
|
|
@ -29,7 +29,6 @@ import (
|
||||||
"github.com/status-im/status-go/protocol/communities"
|
"github.com/status-im/status-go/protocol/communities"
|
||||||
"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"
|
||||||
"github.com/status-im/status-go/protocol/tt"
|
|
||||||
"github.com/status-im/status-go/services/communitytokens"
|
"github.com/status-im/status-go/services/communitytokens"
|
||||||
walletToken "github.com/status-im/status-go/services/wallet/token"
|
walletToken "github.com/status-im/status-go/services/wallet/token"
|
||||||
"github.com/status-im/status-go/t/helpers"
|
"github.com/status-im/status-go/t/helpers"
|
||||||
|
@ -320,29 +319,19 @@ func createCommunityConfigurable(s *suite.Suite, owner *Messenger, permission pr
|
||||||
}
|
}
|
||||||
|
|
||||||
func advertiseCommunityTo(s *suite.Suite, community *communities.Community, owner *Messenger, user *Messenger) {
|
func advertiseCommunityTo(s *suite.Suite, community *communities.Community, owner *Messenger, user *Messenger) {
|
||||||
chat := CreateOneToOneChat(common.PubkeyToHex(&user.identity.PublicKey), &user.identity.PublicKey, user.transport)
|
// Create wrapped (Signed) community data.
|
||||||
|
wrappedCommunity, err := community.ToProtocolMessageBytes()
|
||||||
inputMessage := common.NewMessage()
|
|
||||||
inputMessage.ChatId = chat.ID
|
|
||||||
inputMessage.Text = "some text"
|
|
||||||
inputMessage.CommunityID = community.IDString()
|
|
||||||
|
|
||||||
err := owner.SaveChat(chat)
|
|
||||||
s.Require().NoError(err)
|
|
||||||
_, err = owner.SendChatMessage(context.Background(), inputMessage)
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
// Ensure community is received
|
// Unwrap signer (Admin) data at user side.
|
||||||
err = tt.RetryWithBackOff(func() error {
|
signer, description, err := communities.UnwrapCommunityDescriptionMessage(wrappedCommunity)
|
||||||
response, err := user.RetrieveAll()
|
s.Require().NoError(err)
|
||||||
if err != nil {
|
|
||||||
return err
|
// Handle community data state at receiver side
|
||||||
}
|
messageState := user.buildMessageState()
|
||||||
if len(response.Communities()) == 0 {
|
messageState.CurrentMessageState = &CurrentMessageState{}
|
||||||
return errors.New("community not received")
|
messageState.CurrentMessageState.PublicKey = &user.identity.PublicKey
|
||||||
}
|
err = user.handleCommunityDescription(messageState, signer, description, wrappedCommunity, nil)
|
||||||
return nil
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@ import (
|
||||||
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"
|
||||||
|
"github.com/status-im/status-go/images"
|
||||||
"github.com/status-im/status-go/multiaccounts/accounts"
|
"github.com/status-im/status-go/multiaccounts/accounts"
|
||||||
"github.com/status-im/status-go/protocol/common"
|
"github.com/status-im/status-go/protocol/common"
|
||||||
"github.com/status-im/status-go/protocol/communities"
|
"github.com/status-im/status-go/protocol/communities"
|
||||||
|
@ -496,8 +497,8 @@ func (s *MessengerCommunitiesSuite) TestCommunityContactCodeAdvertisement() {
|
||||||
|
|
||||||
// create community and make bob and alice join to it
|
// create community and make bob and alice join to it
|
||||||
community, _ := s.createCommunity()
|
community, _ := s.createCommunity()
|
||||||
s.advertiseCommunityTo(community, s.owner, s.bob)
|
advertiseCommunityToUserOldWay(&s.Suite, community, s.owner, s.bob)
|
||||||
s.advertiseCommunityTo(community, s.owner, s.alice)
|
advertiseCommunityToUserOldWay(&s.Suite, community, s.owner, s.alice)
|
||||||
|
|
||||||
s.joinCommunity(community, s.owner, s.bob)
|
s.joinCommunity(community, s.owner, s.bob)
|
||||||
s.joinCommunity(community, s.owner, s.alice)
|
s.joinCommunity(community, s.owner, s.alice)
|
||||||
|
@ -2106,8 +2107,8 @@ func (s *MessengerCommunitiesSuite) TestDeclineAccess() {
|
||||||
|
|
||||||
func (s *MessengerCommunitiesSuite) TestLeaveAndRejoinCommunity() {
|
func (s *MessengerCommunitiesSuite) TestLeaveAndRejoinCommunity() {
|
||||||
community, _ := s.createCommunity()
|
community, _ := s.createCommunity()
|
||||||
s.advertiseCommunityTo(community, s.owner, s.alice)
|
advertiseCommunityToUserOldWay(&s.Suite, community, s.owner, s.alice)
|
||||||
s.advertiseCommunityTo(community, s.owner, s.bob)
|
advertiseCommunityToUserOldWay(&s.Suite, community, s.owner, s.bob)
|
||||||
|
|
||||||
s.joinCommunity(community, s.owner, s.alice)
|
s.joinCommunity(community, s.owner, s.alice)
|
||||||
s.joinCommunity(community, s.owner, s.bob)
|
s.joinCommunity(community, s.owner, s.bob)
|
||||||
|
@ -2192,57 +2193,54 @@ func (s *MessengerCommunitiesSuite) TestLeaveAndRejoinCommunity() {
|
||||||
|
|
||||||
func (s *MessengerCommunitiesSuite) TestShareCommunity() {
|
func (s *MessengerCommunitiesSuite) TestShareCommunity() {
|
||||||
description := &requests.CreateCommunity{
|
description := &requests.CreateCommunity{
|
||||||
Membership: protobuf.CommunityPermissions_AUTO_ACCEPT,
|
Membership: protobuf.CommunityPermissions_MANUAL_ACCEPT,
|
||||||
Name: "status",
|
Name: "status",
|
||||||
Color: "#ffffff",
|
|
||||||
Description: "status community description",
|
Description: "status community description",
|
||||||
|
Color: "#FFFFFF",
|
||||||
|
Image: "../_assets/tests/status.png",
|
||||||
|
ImageAx: 0,
|
||||||
|
ImageAy: 0,
|
||||||
|
ImageBx: 256,
|
||||||
|
ImageBy: 256,
|
||||||
|
Banner: images.CroppedImage{
|
||||||
|
ImagePath: "../_assets/tests/IMG_1205.HEIC.jpg",
|
||||||
|
X: 0,
|
||||||
|
Y: 0,
|
||||||
|
Width: 160,
|
||||||
|
Height: 90,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
inviteMessage := "invite to community testing message"
|
response, err := s.owner.CreateCommunity(description, true)
|
||||||
|
|
||||||
// Create an community
|
|
||||||
response, err := s.bob.CreateCommunity(description, true)
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
s.Require().NotNil(response)
|
s.Require().NotNil(response)
|
||||||
s.Require().Len(response.Communities(), 1)
|
s.Require().Len(response.Communities(), 1)
|
||||||
|
s.Require().Len(response.Chats(), 1)
|
||||||
community := response.Communities()[0]
|
community := response.Communities()[0]
|
||||||
|
|
||||||
response, err = s.bob.ShareCommunity(
|
inputMessageText := "Come on alice, You'll like it here!"
|
||||||
&requests.ShareCommunity{
|
// Alice shares community with Bob
|
||||||
CommunityID: community.ID(),
|
response, err = s.owner.ShareCommunity(&requests.ShareCommunity{
|
||||||
Users: []types.HexBytes{common.PubkeyToHexBytes(&s.alice.identity.PublicKey)},
|
CommunityID: community.ID(),
|
||||||
InviteMessage: inviteMessage,
|
Users: []types.HexBytes{common.PubkeyToHexBytes(&s.alice.identity.PublicKey)},
|
||||||
},
|
InviteMessage: inputMessageText,
|
||||||
)
|
|
||||||
s.Require().NoError(err)
|
|
||||||
s.Require().NotNil(response)
|
|
||||||
s.Require().Len(response.Messages(), 1)
|
|
||||||
|
|
||||||
// Add bob to contacts so it does not go on activity center
|
|
||||||
bobPk := common.PubkeyToHex(&s.bob.identity.PublicKey)
|
|
||||||
request := &requests.AddContact{ID: bobPk}
|
|
||||||
_, err = s.alice.AddContact(context.Background(), request)
|
|
||||||
s.Require().NoError(err)
|
|
||||||
|
|
||||||
// Pull message and make sure org is received
|
|
||||||
err = tt.RetryWithBackOff(func() error {
|
|
||||||
response, err = s.alice.RetrieveAll()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if len(response.messages) == 0 {
|
|
||||||
return errors.New("community link not received")
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
})
|
||||||
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
s.Require().NotNil(response)
|
||||||
s.Require().Len(response.Messages(), 1)
|
s.Require().Len(response.Messages(), 1)
|
||||||
|
sentMessageText := response.Messages()[0].Text
|
||||||
|
|
||||||
message := response.Messages()[0]
|
_, err = WaitOnMessengerResponse(s.alice, func(r *MessengerResponse) bool {
|
||||||
s.Require().Equal(community.IDString(), message.CommunityID)
|
return len(r.Messages()) > 0
|
||||||
s.Require().Equal(inviteMessage, message.Text)
|
}, "Messages not received")
|
||||||
|
|
||||||
|
communityURL := response.Messages()[0].UnfurledStatusLinks.GetUnfurledStatusLinks()[0].Url
|
||||||
|
s.Require().NoError(err)
|
||||||
|
s.Require().Len(response.Messages(), 1)
|
||||||
|
s.Require().Equal(fmt.Sprintf("%s\n%s", inputMessageText, communityURL), sentMessageText)
|
||||||
|
s.Require().NotNil(response.Messages()[0].UnfurledStatusLinks.GetUnfurledStatusLinks()[0].GetCommunity().CommunityId)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MessengerCommunitiesSuite) TestShareCommunityWithPreviousMember() {
|
func (s *MessengerCommunitiesSuite) TestShareCommunityWithPreviousMember() {
|
||||||
|
@ -2253,8 +2251,6 @@ func (s *MessengerCommunitiesSuite) TestShareCommunityWithPreviousMember() {
|
||||||
Description: "status community description",
|
Description: "status community description",
|
||||||
}
|
}
|
||||||
|
|
||||||
inviteMessage := "invite to community testing message"
|
|
||||||
|
|
||||||
// Create an community chat
|
// Create an community chat
|
||||||
response, err := s.bob.CreateCommunity(description, true)
|
response, err := s.bob.CreateCommunity(description, true)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
@ -2289,16 +2285,7 @@ func (s *MessengerCommunitiesSuite) TestShareCommunityWithPreviousMember() {
|
||||||
err = s.bob.communitiesManager.SaveCommunity(community)
|
err = s.bob.communitiesManager.SaveCommunity(community)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
response, err = s.bob.ShareCommunity(
|
advertiseCommunityToUserOldWay(&s.Suite, community, s.bob, s.alice)
|
||||||
&requests.ShareCommunity{
|
|
||||||
CommunityID: community.ID(),
|
|
||||||
Users: []types.HexBytes{common.PubkeyToHexBytes(&s.alice.identity.PublicKey)},
|
|
||||||
InviteMessage: inviteMessage,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
s.Require().NoError(err)
|
|
||||||
s.Require().NotNil(response)
|
|
||||||
s.Require().Len(response.Messages(), 1)
|
|
||||||
|
|
||||||
// Add bob to contacts so it does not go on activity center
|
// Add bob to contacts so it does not go on activity center
|
||||||
bobPk := common.PubkeyToHex(&s.bob.identity.PublicKey)
|
bobPk := common.PubkeyToHex(&s.bob.identity.PublicKey)
|
||||||
|
@ -2306,25 +2293,6 @@ func (s *MessengerCommunitiesSuite) TestShareCommunityWithPreviousMember() {
|
||||||
_, err = s.alice.AddContact(context.Background(), request)
|
_, err = s.alice.AddContact(context.Background(), request)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
// Pull message and make sure org is received
|
|
||||||
err = tt.RetryWithBackOff(func() error {
|
|
||||||
response, err = s.alice.RetrieveAll()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if len(response.messages) == 0 {
|
|
||||||
return errors.New("community link not received")
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
s.Require().NoError(err)
|
|
||||||
s.Require().Len(response.Messages(), 1)
|
|
||||||
|
|
||||||
message := response.Messages()[0]
|
|
||||||
s.Require().Equal(community.IDString(), message.CommunityID)
|
|
||||||
s.Require().Equal(inviteMessage, message.Text)
|
|
||||||
|
|
||||||
// Alice should have the Joined status for the community
|
// Alice should have the Joined status for the community
|
||||||
communityInResponse := response.Communities()[0]
|
communityInResponse := response.Communities()[0]
|
||||||
s.Require().Equal(community.ID(), communityInResponse.ID())
|
s.Require().Equal(community.ID(), communityInResponse.ID())
|
||||||
|
|
|
@ -79,22 +79,6 @@ func (u *StatusUnfurler) buildContactData(publicKey string) (*common.StatusConta
|
||||||
return c, nil
|
return c, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *StatusUnfurler) fillCommunityImages(community *communities.Community, icon *common.LinkPreviewThumbnail, banner *common.LinkPreviewThumbnail) error {
|
|
||||||
if image, ok := community.Images()[images.SmallDimName]; ok {
|
|
||||||
if err := updateThumbnail(&images.IdentityImage{Payload: image.Payload}, icon); err != nil {
|
|
||||||
u.logger.Warn("unfurling status link: failed to set community thumbnail", zap.Error(err))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if image, ok := community.Images()[images.BannerIdentityName]; ok {
|
|
||||||
if err := updateThumbnail(&images.IdentityImage{Payload: image.Payload}, banner); err != nil {
|
|
||||||
u.logger.Warn("unfurling status link: failed to set community banner", zap.Error(err))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *StatusUnfurler) buildCommunityData(communityID string, shard *shard.Shard) (*communities.Community, *common.StatusCommunityLinkPreview, error) {
|
func (u *StatusUnfurler) buildCommunityData(communityID string, shard *shard.Shard) (*communities.Community, *common.StatusCommunityLinkPreview, error) {
|
||||||
// This automatically checks the database
|
// This automatically checks the database
|
||||||
community, err := u.m.FetchCommunity(&FetchCommunityRequest{
|
community, err := u.m.FetchCommunity(&FetchCommunityRequest{
|
||||||
|
@ -112,20 +96,12 @@ func (u *StatusUnfurler) buildCommunityData(communityID string, shard *shard.Sha
|
||||||
return community, nil, fmt.Errorf("community info fetched, but it is empty")
|
return community, nil, fmt.Errorf("community info fetched, but it is empty")
|
||||||
}
|
}
|
||||||
|
|
||||||
c := &common.StatusCommunityLinkPreview{
|
statusCommunityLinkPreviews, err := community.ToStatusLinkPreview()
|
||||||
CommunityID: community.IDString(),
|
|
||||||
DisplayName: community.Name(),
|
|
||||||
Description: community.DescriptionText(),
|
|
||||||
MembersCount: uint32(community.MembersCount()),
|
|
||||||
Color: community.Color(),
|
|
||||||
}
|
|
||||||
|
|
||||||
err = u.fillCommunityImages(community, &c.Icon, &c.Banner)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return community, c, err
|
return nil, nil, fmt.Errorf("failed to get status community link preview for communityID '%s': %w", communityID, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return community, c, nil
|
return community, statusCommunityLinkPreviews, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *StatusUnfurler) buildChannelData(channelUUID string, communityID string, communityShard *shard.Shard) (*common.StatusCommunityChannelLinkPreview, error) {
|
func (u *StatusUnfurler) buildChannelData(channelUUID string, communityID string, communityShard *shard.Shard) (*common.StatusCommunityChannelLinkPreview, error) {
|
||||||
|
|
|
@ -2311,22 +2311,35 @@ func (m *Messenger) ShareCommunity(request *requests.ShareCommunity) (*Messenger
|
||||||
if err := request.Validate(); err != nil {
|
if err := request.Validate(); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
response := &MessengerResponse{}
|
community, err := m.GetCommunityByID(request.CommunityID)
|
||||||
|
|
||||||
community, err := m.communitiesManager.GetByID(request.CommunityID)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
response := &MessengerResponse{}
|
||||||
|
communityURL, err := m.ShareCommunityURLWithData(request.CommunityID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var statusLinkPreview common.StatusLinkPreview
|
||||||
|
statusCommunityLinkPreview, err := community.ToStatusLinkPreview()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
statusLinkPreview.URL = communityURL
|
||||||
|
statusLinkPreview.Community = statusCommunityLinkPreview
|
||||||
var messages []*common.Message
|
var messages []*common.Message
|
||||||
for _, pk := range request.Users {
|
for _, pk := range request.Users {
|
||||||
message := common.NewMessage()
|
message := common.NewMessage()
|
||||||
|
message.StatusLinkPreviews = []common.StatusLinkPreview{statusLinkPreview}
|
||||||
message.ChatId = pk.String()
|
message.ChatId = pk.String()
|
||||||
message.CommunityID = request.CommunityID.String()
|
|
||||||
message.Shard = community.Shard().Protobuffer()
|
message.Shard = community.Shard().Protobuffer()
|
||||||
message.Text = fmt.Sprintf("Community %s has been shared with you", community.Name())
|
message.ContentType = protobuf.ChatMessage_TEXT_PLAIN
|
||||||
|
message.Text = communityURL
|
||||||
if request.InviteMessage != "" {
|
if request.InviteMessage != "" {
|
||||||
message.Text = request.InviteMessage
|
message.Text = fmt.Sprintf("%s\n%s", request.InviteMessage, communityURL)
|
||||||
}
|
}
|
||||||
messages = append(messages, message)
|
messages = append(messages, message)
|
||||||
r, err := m.CreateOneToOneChat(&requests.CreateOneToOneChat{ID: pk})
|
r, err := m.CreateOneToOneChat(&requests.CreateOneToOneChat{ID: pk})
|
||||||
|
|
|
@ -215,17 +215,9 @@ func (s *MessengerSyncActivityCenterSuite) addContactAndShareCommunity(userB *Me
|
||||||
return false
|
return false
|
||||||
}, "contact request not accepted on device 2")
|
}, "contact request not accepted on device 2")
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
community, err := s.m.GetCommunityByID(communityID)
|
||||||
_, err = s.m.ShareCommunity(&requests.ShareCommunity{
|
|
||||||
CommunityID: communityID,
|
|
||||||
Users: []types.HexBytes{common.PubkeyToHexBytes(&userB.identity.PublicKey)},
|
|
||||||
InviteMessage: "invite to community testing message",
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
|
||||||
_, err = WaitOnMessengerResponse(userB, func(r *MessengerResponse) bool {
|
|
||||||
return len(r.Communities()) > 0
|
|
||||||
}, "community not received")
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
advertiseCommunityToUserOldWay(&s.Suite, community, s.m, userB)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MessengerSyncActivityCenterSuite) requestToJoinCommunity(userB *Messenger, communityID types.HexBytes) {
|
func (s *MessengerSyncActivityCenterSuite) requestToJoinCommunity(userB *Messenger, communityID types.HexBytes) {
|
||||||
|
|
|
@ -6,7 +6,6 @@ import (
|
||||||
|
|
||||||
_ "github.com/mutecomm/go-sqlcipher/v4" // require go-sqlcipher that overrides default implementation
|
_ "github.com/mutecomm/go-sqlcipher/v4" // require go-sqlcipher that overrides default implementation
|
||||||
|
|
||||||
"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"
|
||||||
"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"
|
||||||
|
@ -287,8 +286,6 @@ func (s *MessengerSuite) TestMarkMessageWithNotificationAsUnreadInCommunityChatS
|
||||||
Description: "This is just a test description for the community",
|
Description: "This is just a test description for the community",
|
||||||
}
|
}
|
||||||
|
|
||||||
inviteMessage := "You are invited to community testing message"
|
|
||||||
|
|
||||||
response, err := other.CreateCommunity(description, true)
|
response, err := other.CreateCommunity(description, true)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
s.Require().NotNil(response)
|
s.Require().NotNil(response)
|
||||||
|
@ -303,29 +300,7 @@ func (s *MessengerSuite) TestMarkMessageWithNotificationAsUnreadInCommunityChatS
|
||||||
err = other.communitiesManager.SaveCommunity(community)
|
err = other.communitiesManager.SaveCommunity(community)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
response, err = other.ShareCommunity(
|
advertiseCommunityToUserOldWay(&s.Suite, community, other, s.m)
|
||||||
&requests.ShareCommunity{
|
|
||||||
CommunityID: community.ID(),
|
|
||||||
Users: []types.HexBytes{common.PubkeyToHexBytes(&s.m.identity.PublicKey)},
|
|
||||||
InviteMessage: inviteMessage,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
s.Require().NoError(err)
|
|
||||||
s.Require().NotNil(response)
|
|
||||||
s.Require().Len(response.Messages(), 1)
|
|
||||||
|
|
||||||
response, err = s.retrieveAllWithRetry("community link not received")
|
|
||||||
|
|
||||||
s.Require().NoError(err)
|
|
||||||
s.Require().Len(response.Messages(), 1)
|
|
||||||
|
|
||||||
message := response.Messages()[0]
|
|
||||||
s.Require().Equal(community.IDString(), message.CommunityID)
|
|
||||||
s.Require().Equal(inviteMessage, message.Text)
|
|
||||||
|
|
||||||
communityInResponse := response.Communities()[0]
|
|
||||||
s.Require().Equal(community.ID(), communityInResponse.ID())
|
|
||||||
s.Require().True(communityInResponse.Joined())
|
|
||||||
|
|
||||||
inputMessage1 := buildTestMessage(*communityChat)
|
inputMessage1 := buildTestMessage(*communityChat)
|
||||||
inputMessage1.ChatId = communityChat.ID
|
inputMessage1.ChatId = communityChat.ID
|
||||||
|
|
Loading…
Reference in New Issue