parent
ad326fa290
commit
e6a3f63ec7
|
@ -836,7 +836,6 @@ func (m *Manager) DeclineRequestToJoin(request *requests.DeclineRequestToJoinCom
|
|||
}
|
||||
|
||||
return m.persistence.SetRequestToJoinState(dbRequest.PublicKey, dbRequest.CommunityID, RequestToJoinStateDeclined)
|
||||
|
||||
}
|
||||
|
||||
func (m *Manager) HandleCommunityRequestToJoin(signer *ecdsa.PublicKey, request *protobuf.CommunityRequestToJoin) (*RequestToJoin, error) {
|
||||
|
@ -1212,6 +1211,11 @@ func (m *Manager) PendingRequestsToJoinForCommunity(id types.HexBytes) ([]*Reque
|
|||
return m.persistence.PendingRequestsToJoinForCommunity(id)
|
||||
}
|
||||
|
||||
func (m *Manager) DeclinedRequestsToJoinForCommunity(id types.HexBytes) ([]*RequestToJoin, error) {
|
||||
m.logger.Info("fetching declined invitations", zap.String("community-id", id.String()))
|
||||
return m.persistence.DeclinedRequestsToJoinForCommunity(id)
|
||||
}
|
||||
|
||||
func (m *Manager) CanPost(pk *ecdsa.PublicKey, communityID string, chatID string, grant []byte) (bool, error) {
|
||||
community, err := m.GetByIDString(communityID)
|
||||
if err != nil {
|
||||
|
|
|
@ -337,9 +337,9 @@ func (p *Persistence) HasPendingRequestsToJoinForUserAndCommunity(userPk string,
|
|||
return count > 0, nil
|
||||
}
|
||||
|
||||
func (p *Persistence) PendingRequestsToJoinForCommunity(id []byte) ([]*RequestToJoin, error) {
|
||||
func (p *Persistence) RequestsToJoinForCommunityWithState(id []byte, state RequestToJoinState) ([]*RequestToJoin, error) {
|
||||
var requests []*RequestToJoin
|
||||
rows, err := p.db.Query(`SELECT id,public_key,clock,ens_name,chat_id,community_id,state FROM communities_requests_to_join WHERE state = ? AND community_id = ?`, RequestToJoinStatePending, id)
|
||||
rows, err := p.db.Query(`SELECT id,public_key,clock,ens_name,chat_id,community_id,state FROM communities_requests_to_join WHERE state = ? AND community_id = ?`, state, id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -356,6 +356,14 @@ func (p *Persistence) PendingRequestsToJoinForCommunity(id []byte) ([]*RequestTo
|
|||
return requests, nil
|
||||
}
|
||||
|
||||
func (p *Persistence) PendingRequestsToJoinForCommunity(id []byte) ([]*RequestToJoin, error) {
|
||||
return p.RequestsToJoinForCommunityWithState(id, RequestToJoinStatePending)
|
||||
}
|
||||
|
||||
func (p *Persistence) DeclinedRequestsToJoinForCommunity(id []byte) ([]*RequestToJoin, error) {
|
||||
return p.RequestsToJoinForCommunityWithState(id, RequestToJoinStateDeclined)
|
||||
}
|
||||
|
||||
func (p *Persistence) SetRequestToJoinState(pk string, communityID []byte, state RequestToJoinState) error {
|
||||
_, err := p.db.Exec(`UPDATE communities_requests_to_join SET state = ? WHERE community_id = ? AND public_key = ?`, state, communityID, pk)
|
||||
return err
|
||||
|
|
|
@ -1185,6 +1185,185 @@ func (s *MessengerCommunitiesSuite) TestRequestAccessAgain() {
|
|||
s.Require().Equal(requestToJoin3.ID, requestToJoin4.ID)
|
||||
}
|
||||
|
||||
func (s *MessengerCommunitiesSuite) TestDeclineAccess() {
|
||||
ctx := context.Background()
|
||||
|
||||
description := &requests.CreateCommunity{
|
||||
Membership: protobuf.CommunityPermissions_ON_REQUEST,
|
||||
Name: "status",
|
||||
Color: "#ffffff",
|
||||
Description: "status community description",
|
||||
}
|
||||
|
||||
// Create an community chat
|
||||
response, err := s.bob.CreateCommunity(description, true)
|
||||
s.Require().NoError(err)
|
||||
s.Require().NotNil(response)
|
||||
s.Require().Len(response.Communities(), 1)
|
||||
|
||||
community := response.Communities()[0]
|
||||
|
||||
chat := CreateOneToOneChat(common.PubkeyToHex(&s.alice.identity.PublicKey), &s.alice.identity.PublicKey, s.alice.transport)
|
||||
|
||||
s.Require().NoError(s.bob.SaveChat(chat))
|
||||
|
||||
message := buildTestMessage(*chat)
|
||||
message.CommunityID = community.IDString()
|
||||
|
||||
// We send a community link to alice
|
||||
response, err = s.bob.SendChatMessage(ctx, message)
|
||||
s.Require().NoError(err)
|
||||
s.Require().NotNil(response)
|
||||
|
||||
// Retrieve community link & community
|
||||
err = tt.RetryWithBackOff(func() error {
|
||||
response, err = s.alice.RetrieveAll()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(response.Communities()) == 0 {
|
||||
return errors.New("message not received")
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
s.Require().NoError(err)
|
||||
|
||||
request := &requests.RequestToJoinCommunity{CommunityID: community.ID()}
|
||||
// We try to join the org
|
||||
response, err = s.alice.RequestToJoinCommunity(request)
|
||||
s.Require().NoError(err)
|
||||
s.Require().NotNil(response)
|
||||
s.Require().Len(response.RequestsToJoinCommunity, 1)
|
||||
|
||||
requestToJoin1 := response.RequestsToJoinCommunity[0]
|
||||
s.Require().NotNil(requestToJoin1)
|
||||
s.Require().Equal(community.ID(), requestToJoin1.CommunityID)
|
||||
s.Require().True(requestToJoin1.Our)
|
||||
s.Require().NotEmpty(requestToJoin1.ID)
|
||||
s.Require().NotEmpty(requestToJoin1.Clock)
|
||||
s.Require().Equal(requestToJoin1.PublicKey, common.PubkeyToHex(&s.alice.identity.PublicKey))
|
||||
s.Require().Equal(communities.RequestToJoinStatePending, requestToJoin1.State)
|
||||
|
||||
// Make sure clock is not empty
|
||||
s.Require().NotEmpty(requestToJoin1.Clock)
|
||||
|
||||
s.Require().Len(response.Communities(), 1)
|
||||
s.Require().Equal(response.Communities()[0].RequestedToJoinAt(), requestToJoin1.Clock)
|
||||
|
||||
// pull all communities to make sure we set RequestedToJoinAt
|
||||
|
||||
allCommunities, err := s.alice.Communities()
|
||||
s.Require().NoError(err)
|
||||
s.Require().Len(allCommunities, 2)
|
||||
|
||||
if bytes.Equal(allCommunities[0].ID(), community.ID()) {
|
||||
s.Require().Equal(allCommunities[0].RequestedToJoinAt(), requestToJoin1.Clock)
|
||||
} else {
|
||||
s.Require().Equal(allCommunities[1].RequestedToJoinAt(), requestToJoin1.Clock)
|
||||
}
|
||||
|
||||
// Retrieve request to join
|
||||
err = tt.RetryWithBackOff(func() error {
|
||||
response, err = s.bob.RetrieveAll()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(response.RequestsToJoinCommunity) == 0 {
|
||||
return errors.New("request to join community not received")
|
||||
}
|
||||
return nil
|
||||
})
|
||||
s.Require().NoError(err)
|
||||
s.Require().Len(response.RequestsToJoinCommunity, 1)
|
||||
|
||||
// Check if admin sees requests correctly
|
||||
requestsToJoin, err := s.bob.PendingRequestsToJoinForCommunity(community.ID())
|
||||
s.Require().NoError(err)
|
||||
s.Require().Len(requestsToJoin, 1)
|
||||
|
||||
requestsToJoin, err = s.bob.DeclinedRequestsToJoinForCommunity(community.ID())
|
||||
s.Require().NoError(err)
|
||||
s.Require().Len(requestsToJoin, 0)
|
||||
|
||||
requestToJoin2 := response.RequestsToJoinCommunity[0]
|
||||
|
||||
s.Require().NotNil(requestToJoin2)
|
||||
s.Require().Equal(community.ID(), requestToJoin2.CommunityID)
|
||||
s.Require().False(requestToJoin2.Our)
|
||||
s.Require().NotEmpty(requestToJoin2.ID)
|
||||
s.Require().NotEmpty(requestToJoin2.Clock)
|
||||
s.Require().Equal(requestToJoin2.PublicKey, common.PubkeyToHex(&s.alice.identity.PublicKey))
|
||||
s.Require().Equal(communities.RequestToJoinStatePending, requestToJoin2.State)
|
||||
|
||||
s.Require().Equal(requestToJoin1.ID, requestToJoin2.ID)
|
||||
|
||||
// Decline request
|
||||
declinedRequestToJoin := &requests.DeclineRequestToJoinCommunity{ID: requestToJoin1.ID}
|
||||
err = s.bob.DeclineRequestToJoinCommunity(declinedRequestToJoin)
|
||||
s.Require().NoError(err)
|
||||
|
||||
// Check if admin sees requests correctly
|
||||
requestsToJoin, err = s.bob.PendingRequestsToJoinForCommunity(community.ID())
|
||||
s.Require().NoError(err)
|
||||
s.Require().Len(requestsToJoin, 0)
|
||||
|
||||
requestsToJoin, err = s.bob.DeclinedRequestsToJoinForCommunity(community.ID())
|
||||
s.Require().NoError(err)
|
||||
s.Require().Len(requestsToJoin, 1)
|
||||
|
||||
// Accept declined request
|
||||
acceptRequestToJoin := &requests.AcceptRequestToJoinCommunity{ID: requestToJoin1.ID}
|
||||
response, err = s.bob.AcceptRequestToJoinCommunity(acceptRequestToJoin)
|
||||
s.Require().NoError(err)
|
||||
s.Require().NotNil(response)
|
||||
|
||||
s.Require().Len(response.Communities(), 1)
|
||||
|
||||
updatedCommunity := response.Communities()[0]
|
||||
|
||||
s.Require().NotNil(updatedCommunity)
|
||||
s.Require().True(updatedCommunity.HasMember(&s.alice.identity.PublicKey))
|
||||
|
||||
// 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.Communities()) == 0 {
|
||||
return errors.New("community not received")
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
s.Require().NoError(err)
|
||||
s.Require().NotNil(response)
|
||||
|
||||
s.Require().Len(response.Communities(), 1)
|
||||
|
||||
aliceCommunity := response.Communities()[0]
|
||||
|
||||
s.Require().Equal(community.ID(), aliceCommunity.ID())
|
||||
s.Require().True(aliceCommunity.HasMember(&s.alice.identity.PublicKey))
|
||||
|
||||
// Community should be joined at this point
|
||||
s.Require().True(aliceCommunity.Joined())
|
||||
|
||||
// Make sure the requests are not pending on either sides
|
||||
requestsToJoin, err = s.bob.PendingRequestsToJoinForCommunity(community.ID())
|
||||
s.Require().NoError(err)
|
||||
s.Require().Len(requestsToJoin, 0)
|
||||
|
||||
requestsToJoin, err = s.bob.DeclinedRequestsToJoinForCommunity(community.ID())
|
||||
s.Require().NoError(err)
|
||||
s.Require().Len(requestsToJoin, 0)
|
||||
|
||||
requestsToJoin, err = s.alice.MyPendingRequestsToJoin()
|
||||
s.Require().NoError(err)
|
||||
s.Require().Len(requestsToJoin, 0)
|
||||
}
|
||||
|
||||
func (s *MessengerCommunitiesSuite) TestShareCommunity() {
|
||||
description := &requests.CreateCommunity{
|
||||
Membership: protobuf.CommunityPermissions_NO_MEMBERSHIP,
|
||||
|
|
|
@ -1021,6 +1021,10 @@ func (m *Messenger) PendingRequestsToJoinForCommunity(id types.HexBytes) ([]*com
|
|||
return m.communitiesManager.PendingRequestsToJoinForCommunity(id)
|
||||
}
|
||||
|
||||
func (m *Messenger) DeclinedRequestsToJoinForCommunity(id types.HexBytes) ([]*communities.RequestToJoin, error) {
|
||||
return m.communitiesManager.DeclinedRequestsToJoinForCommunity(id)
|
||||
}
|
||||
|
||||
func (m *Messenger) RemoveUserFromCommunity(id types.HexBytes, pkString string) (*MessengerResponse, error) {
|
||||
publicKey, err := common.HexToPubkey(pkString)
|
||||
if err != nil {
|
||||
|
|
|
@ -474,6 +474,11 @@ func (api *PublicAPI) PendingRequestsToJoinForCommunity(id types.HexBytes) ([]*c
|
|||
return api.service.messenger.PendingRequestsToJoinForCommunity(id)
|
||||
}
|
||||
|
||||
// DeclinedRequestsToJoinForCommunity returns the declined requests to join for a given community
|
||||
func (api *PublicAPI) DeclinedRequestsToJoinForCommunity(id types.HexBytes) ([]*communities.RequestToJoin, error) {
|
||||
return api.service.messenger.DeclinedRequestsToJoinForCommunity(id)
|
||||
}
|
||||
|
||||
// AcceptRequestToJoinCommunity accepts a pending request to join a community
|
||||
func (api *PublicAPI) AcceptRequestToJoinCommunity(request *requests.AcceptRequestToJoinCommunity) (*protocol.MessengerResponse, error) {
|
||||
return api.service.messenger.AcceptRequestToJoinCommunity(request)
|
||||
|
|
Loading…
Reference in New Issue