[MM-33908] Resync LDAP Groups to Teams and Channels (#17372)
* add includeRemovedMembers flag * fix API call in client4.go * remove check for 'since' * add comments * run make app-layers * re-run CI tests Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
3e5b0a7d7f
Коммит
9f4902e188
@@ -3367,7 +3367,7 @@ func (s *OpenTracingLayerGroupStore) ChannelMembersMinusGroupMembers(channelID s
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *OpenTracingLayerGroupStore) ChannelMembersToAdd(since int64, channelID *string) ([]*model.UserChannelIDPair, error) {
|
||||
func (s *OpenTracingLayerGroupStore) ChannelMembersToAdd(since int64, channelID *string, includeRemovedMembers bool) ([]*model.UserChannelIDPair, error) {
|
||||
origCtx := s.Root.Store.Context()
|
||||
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "GroupStore.ChannelMembersToAdd")
|
||||
s.Root.Store.SetContext(newCtx)
|
||||
@@ -3376,7 +3376,7 @@ func (s *OpenTracingLayerGroupStore) ChannelMembersToAdd(since int64, channelID
|
||||
}()
|
||||
|
||||
defer span.Finish()
|
||||
result, err := s.GroupStore.ChannelMembersToAdd(since, channelID)
|
||||
result, err := s.GroupStore.ChannelMembersToAdd(since, channelID, includeRemovedMembers)
|
||||
if err != nil {
|
||||
span.LogFields(spanlog.Error(err))
|
||||
ext.Error.Set(span, true)
|
||||
@@ -4033,7 +4033,7 @@ func (s *OpenTracingLayerGroupStore) TeamMembersMinusGroupMembers(teamID string,
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *OpenTracingLayerGroupStore) TeamMembersToAdd(since int64, teamID *string) ([]*model.UserTeamIDPair, error) {
|
||||
func (s *OpenTracingLayerGroupStore) TeamMembersToAdd(since int64, teamID *string, includeRemovedMembers bool) ([]*model.UserTeamIDPair, error) {
|
||||
origCtx := s.Root.Store.Context()
|
||||
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "GroupStore.TeamMembersToAdd")
|
||||
s.Root.Store.SetContext(newCtx)
|
||||
@@ -4042,7 +4042,7 @@ func (s *OpenTracingLayerGroupStore) TeamMembersToAdd(since int64, teamID *strin
|
||||
}()
|
||||
|
||||
defer span.Finish()
|
||||
result, err := s.GroupStore.TeamMembersToAdd(since, teamID)
|
||||
result, err := s.GroupStore.TeamMembersToAdd(since, teamID, includeRemovedMembers)
|
||||
if err != nil {
|
||||
span.LogFields(spanlog.Error(err))
|
||||
ext.Error.Set(span, true)
|
||||
|
||||
@@ -3606,11 +3606,11 @@ func (s *RetryLayerGroupStore) ChannelMembersMinusGroupMembers(channelID string,
|
||||
|
||||
}
|
||||
|
||||
func (s *RetryLayerGroupStore) ChannelMembersToAdd(since int64, channelID *string) ([]*model.UserChannelIDPair, error) {
|
||||
func (s *RetryLayerGroupStore) ChannelMembersToAdd(since int64, channelID *string, includeRemovedMembers bool) ([]*model.UserChannelIDPair, error) {
|
||||
|
||||
tries := 0
|
||||
for {
|
||||
result, err := s.GroupStore.ChannelMembersToAdd(since, channelID)
|
||||
result, err := s.GroupStore.ChannelMembersToAdd(since, channelID, includeRemovedMembers)
|
||||
if err == nil {
|
||||
return result, nil
|
||||
}
|
||||
@@ -4346,11 +4346,11 @@ func (s *RetryLayerGroupStore) TeamMembersMinusGroupMembers(teamID string, group
|
||||
|
||||
}
|
||||
|
||||
func (s *RetryLayerGroupStore) TeamMembersToAdd(since int64, teamID *string) ([]*model.UserTeamIDPair, error) {
|
||||
func (s *RetryLayerGroupStore) TeamMembersToAdd(since int64, teamID *string, includeRemovedMembers bool) ([]*model.UserTeamIDPair, error) {
|
||||
|
||||
tries := 0
|
||||
for {
|
||||
result, err := s.GroupStore.TeamMembersToAdd(since, teamID)
|
||||
result, err := s.GroupStore.TeamMembersToAdd(since, teamID, includeRemovedMembers)
|
||||
if err == nil {
|
||||
return result, nil
|
||||
}
|
||||
|
||||
@@ -706,23 +706,29 @@ func (s *SqlGroupStore) DeleteGroupSyncable(groupID string, syncableID string, s
|
||||
return groupSyncable, nil
|
||||
}
|
||||
|
||||
func (s *SqlGroupStore) TeamMembersToAdd(since int64, teamID *string) ([]*model.UserTeamIDPair, error) {
|
||||
func (s *SqlGroupStore) TeamMembersToAdd(since int64, teamID *string, includeRemovedMembers bool) ([]*model.UserTeamIDPair, error) {
|
||||
builder := s.getQueryBuilder().Select("GroupMembers.UserId", "GroupTeams.TeamId").
|
||||
From("GroupMembers").
|
||||
Join("GroupTeams ON GroupTeams.GroupId = GroupMembers.GroupId").
|
||||
Join("UserGroups ON UserGroups.Id = GroupMembers.GroupId").
|
||||
Join("Teams ON Teams.Id = GroupTeams.TeamId").
|
||||
JoinClause("LEFT OUTER JOIN TeamMembers ON TeamMembers.TeamId = GroupTeams.TeamId AND TeamMembers.UserId = GroupMembers.UserId").
|
||||
Where(sq.Eq{
|
||||
"TeamMembers.UserId": nil,
|
||||
"UserGroups.DeleteAt": 0,
|
||||
"GroupTeams.DeleteAt": 0,
|
||||
"GroupTeams.AutoAdd": true,
|
||||
"GroupMembers.DeleteAt": 0,
|
||||
"Teams.DeleteAt": 0,
|
||||
}).
|
||||
Where("(GroupMembers.CreateAt >= ? OR GroupTeams.UpdateAt >= ?)", since, since)
|
||||
})
|
||||
|
||||
if !includeRemovedMembers {
|
||||
builder = builder.
|
||||
JoinClause("LEFT OUTER JOIN TeamMembers ON TeamMembers.TeamId = GroupTeams.TeamId AND TeamMembers.UserId = GroupMembers.UserId").
|
||||
Where(sq.Eq{"TeamMembers.UserId": nil}).
|
||||
Where(sq.Or{
|
||||
sq.GtOrEq{"GroupMembers.CreateAt": since},
|
||||
sq.GtOrEq{"GroupTeams.UpdateAt": since},
|
||||
})
|
||||
}
|
||||
if teamID != nil {
|
||||
builder = builder.Where(sq.Eq{"Teams.Id": *teamID})
|
||||
}
|
||||
@@ -742,24 +748,32 @@ func (s *SqlGroupStore) TeamMembersToAdd(since int64, teamID *string) ([]*model.
|
||||
return teamMembers, nil
|
||||
}
|
||||
|
||||
func (s *SqlGroupStore) ChannelMembersToAdd(since int64, channelID *string) ([]*model.UserChannelIDPair, error) {
|
||||
func (s *SqlGroupStore) ChannelMembersToAdd(since int64, channelID *string, includeRemovedMembers bool) ([]*model.UserChannelIDPair, error) {
|
||||
builder := s.getQueryBuilder().Select("GroupMembers.UserId", "GroupChannels.ChannelId").
|
||||
From("GroupMembers").
|
||||
Join("GroupChannels ON GroupChannels.GroupId = GroupMembers.GroupId").
|
||||
Join("UserGroups ON UserGroups.Id = GroupMembers.GroupId").
|
||||
Join("Channels ON Channels.Id = GroupChannels.ChannelId").
|
||||
JoinClause("LEFT OUTER JOIN ChannelMemberHistory ON ChannelMemberHistory.ChannelId = GroupChannels.ChannelId AND ChannelMemberHistory.UserId = GroupMembers.UserId").
|
||||
Where(sq.Eq{
|
||||
"ChannelMemberHistory.UserId": nil,
|
||||
"ChannelMemberHistory.LeaveTime": nil,
|
||||
"UserGroups.DeleteAt": 0,
|
||||
"GroupChannels.DeleteAt": 0,
|
||||
"GroupChannels.AutoAdd": true,
|
||||
"GroupMembers.DeleteAt": 0,
|
||||
"Channels.DeleteAt": 0,
|
||||
}).
|
||||
Where("(GroupMembers.CreateAt >= ? OR GroupChannels.UpdateAt >= ?)", since, since)
|
||||
"UserGroups.DeleteAt": 0,
|
||||
"GroupChannels.DeleteAt": 0,
|
||||
"GroupChannels.AutoAdd": true,
|
||||
"GroupMembers.DeleteAt": 0,
|
||||
"Channels.DeleteAt": 0,
|
||||
})
|
||||
|
||||
if !includeRemovedMembers {
|
||||
builder = builder.
|
||||
JoinClause("LEFT OUTER JOIN ChannelMemberHistory ON ChannelMemberHistory.ChannelId = GroupChannels.ChannelId AND ChannelMemberHistory.UserId = GroupMembers.UserId").
|
||||
Where(sq.Eq{
|
||||
"ChannelMemberHistory.UserId": nil,
|
||||
"ChannelMemberHistory.LeaveTime": nil,
|
||||
}).
|
||||
Where(sq.Or{
|
||||
sq.GtOrEq{"GroupMembers.CreateAt": since},
|
||||
sq.GtOrEq{"GroupChannels.UpdateAt": since},
|
||||
})
|
||||
}
|
||||
if channelID != nil {
|
||||
builder = builder.Where(sq.Eq{"Channels.Id": *channelID})
|
||||
}
|
||||
|
||||
@@ -768,13 +768,17 @@ type GroupStore interface {
|
||||
// based on the groups configurations. The returned list can be optionally scoped to a single given team.
|
||||
//
|
||||
// Typically since will be the last successful group sync time.
|
||||
TeamMembersToAdd(since int64, teamID *string) ([]*model.UserTeamIDPair, error)
|
||||
// If includeRemovedMembers is true, then team members who left or were removed from the team will
|
||||
// be included; otherwise, they will be excluded.
|
||||
TeamMembersToAdd(since int64, teamID *string, includeRemovedMembers bool) ([]*model.UserTeamIDPair, error)
|
||||
|
||||
// ChannelMembersToAdd returns a slice of UserChannelIDPair that need newly created memberships
|
||||
// based on the groups configurations. The returned list can be optionally scoped to a single given channel.
|
||||
//
|
||||
// Typically since will be the last successful group sync time.
|
||||
ChannelMembersToAdd(since int64, channelID *string) ([]*model.UserChannelIDPair, error)
|
||||
// If includeRemovedMembers is true, then channel members who left or were removed from the channel will
|
||||
// be included; otherwise, they will be excluded.
|
||||
ChannelMembersToAdd(since int64, channelID *string, includeRemovedMembers bool) ([]*model.UserChannelIDPair, error)
|
||||
|
||||
// TeamMembersToRemove returns all team members that should be removed based on group constraints.
|
||||
TeamMembersToRemove(teamID *string) ([]*model.TeamMember, error)
|
||||
|
||||
@@ -1367,14 +1367,14 @@ func testTeamMembersToAdd(t *testing.T, ss store.Store) {
|
||||
require.NoError(t, err)
|
||||
|
||||
// Time before syncable was created
|
||||
teamMembers, err := ss.Group().TeamMembersToAdd(syncable.CreateAt-1, nil)
|
||||
teamMembers, err := ss.Group().TeamMembersToAdd(syncable.CreateAt-1, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, teamMembers, 1)
|
||||
require.Equal(t, user.Id, teamMembers[0].UserID)
|
||||
require.Equal(t, team.Id, teamMembers[0].TeamID)
|
||||
|
||||
// Time after syncable was created
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(syncable.CreateAt+1, nil)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(syncable.CreateAt+1, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, teamMembers)
|
||||
|
||||
@@ -1383,7 +1383,7 @@ func testTeamMembersToAdd(t *testing.T, ss store.Store) {
|
||||
require.NoError(t, err)
|
||||
_, err = ss.Group().UpsertMember(group.Id, user.Id)
|
||||
require.NoError(t, err)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(syncable.CreateAt+1, nil)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(syncable.CreateAt+1, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, teamMembers, 1)
|
||||
|
||||
@@ -1393,14 +1393,14 @@ func testTeamMembersToAdd(t *testing.T, ss store.Store) {
|
||||
require.NoError(t, err)
|
||||
|
||||
// Time before syncable was updated
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(syncable.UpdateAt-1, nil)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(syncable.UpdateAt-1, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, teamMembers, 1)
|
||||
require.Equal(t, user.Id, teamMembers[0].UserID)
|
||||
require.Equal(t, team.Id, teamMembers[0].TeamID)
|
||||
|
||||
// Time after syncable was updated
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(syncable.UpdateAt+1, nil)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(syncable.UpdateAt+1, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, teamMembers)
|
||||
|
||||
@@ -1408,21 +1408,21 @@ func testTeamMembersToAdd(t *testing.T, ss store.Store) {
|
||||
syncable.AutoAdd = false
|
||||
_, err = ss.Group().UpdateGroupSyncable(syncable)
|
||||
require.NoError(t, err)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, teamMembers)
|
||||
|
||||
// reset state of syncable and verify
|
||||
_, err = ss.Group().UpdateGroupSyncable(&pristineSyncable)
|
||||
require.NoError(t, err)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, teamMembers, 1)
|
||||
|
||||
// No result if Group deleted
|
||||
_, err = ss.Group().Delete(group.Id)
|
||||
require.NoError(t, err)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, teamMembers)
|
||||
|
||||
@@ -1430,7 +1430,7 @@ func testTeamMembersToAdd(t *testing.T, ss store.Store) {
|
||||
group.DeleteAt = 0
|
||||
_, err = ss.Group().Update(group)
|
||||
require.NoError(t, err)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, teamMembers, 1)
|
||||
|
||||
@@ -1438,7 +1438,7 @@ func testTeamMembersToAdd(t *testing.T, ss store.Store) {
|
||||
team.DeleteAt = model.GetMillis()
|
||||
team, nErr = ss.Team().Update(team)
|
||||
require.NoError(t, nErr)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, teamMembers)
|
||||
|
||||
@@ -1446,35 +1446,35 @@ func testTeamMembersToAdd(t *testing.T, ss store.Store) {
|
||||
team.DeleteAt = 0
|
||||
team, nErr = ss.Team().Update(team)
|
||||
require.NoError(t, nErr)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, teamMembers, 1)
|
||||
|
||||
// No result if GroupTeam deleted
|
||||
_, err = ss.Group().DeleteGroupSyncable(group.Id, team.Id, model.GroupSyncableTypeTeam)
|
||||
require.NoError(t, err)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, teamMembers)
|
||||
|
||||
// reset GroupTeam and verify
|
||||
_, err = ss.Group().UpdateGroupSyncable(&pristineSyncable)
|
||||
require.NoError(t, err)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, teamMembers, 1)
|
||||
|
||||
// No result if GroupMember deleted
|
||||
_, err = ss.Group().DeleteMember(group.Id, user.Id)
|
||||
require.NoError(t, err)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, teamMembers)
|
||||
|
||||
// restore group member and verify
|
||||
_, err = ss.Group().UpsertMember(group.Id, user.Id)
|
||||
require.NoError(t, err)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, teamMembers, 1)
|
||||
|
||||
@@ -1484,9 +1484,25 @@ func testTeamMembersToAdd(t *testing.T, ss store.Store) {
|
||||
UserId: user.Id,
|
||||
}, 999)
|
||||
require.NoError(t, nErr)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, teamMembers)
|
||||
|
||||
// Leaving Team should still not return result
|
||||
_, nErr = ss.Team().UpdateMember(&model.TeamMember{
|
||||
TeamId: team.Id,
|
||||
UserId: user.Id,
|
||||
DeleteAt: model.GetMillis(),
|
||||
})
|
||||
require.NoError(t, nErr)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, teamMembers)
|
||||
|
||||
// If includeRemovedMembers is set to true, removed members should be added back in
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, true)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, teamMembers, 1)
|
||||
}
|
||||
|
||||
func testTeamMembersToAddSingleTeam(t *testing.T, ss store.Store) {
|
||||
@@ -1566,15 +1582,15 @@ func testTeamMembersToAddSingleTeam(t *testing.T, ss store.Store) {
|
||||
_, err = ss.Group().CreateGroupSyncable(model.NewGroupTeam(group2.Id, team2.Id, true))
|
||||
require.NoError(t, err)
|
||||
|
||||
teamMembers, err := ss.Group().TeamMembersToAdd(0, nil)
|
||||
teamMembers, err := ss.Group().TeamMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, teamMembers, 3)
|
||||
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, &team1.Id)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, &team1.Id, false)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, teamMembers, 2)
|
||||
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, &team2.Id)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0, &team2.Id, false)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, teamMembers, 1)
|
||||
}
|
||||
@@ -1616,14 +1632,14 @@ func testChannelMembersToAdd(t *testing.T, ss store.Store) {
|
||||
require.NoError(t, err)
|
||||
|
||||
// Time before syncable was created
|
||||
channelMembers, err := ss.Group().ChannelMembersToAdd(syncable.CreateAt-1, nil)
|
||||
channelMembers, err := ss.Group().ChannelMembersToAdd(syncable.CreateAt-1, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, channelMembers, 1)
|
||||
require.Equal(t, user.Id, channelMembers[0].UserID)
|
||||
require.Equal(t, channel.Id, channelMembers[0].ChannelID)
|
||||
|
||||
// Time after syncable was created
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.CreateAt+1, nil)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.CreateAt+1, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, channelMembers)
|
||||
|
||||
@@ -1632,7 +1648,7 @@ func testChannelMembersToAdd(t *testing.T, ss store.Store) {
|
||||
require.NoError(t, err)
|
||||
_, err = ss.Group().UpsertMember(group.Id, user.Id)
|
||||
require.NoError(t, err)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.CreateAt+1, nil)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.CreateAt+1, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, channelMembers, 1)
|
||||
|
||||
@@ -1642,14 +1658,14 @@ func testChannelMembersToAdd(t *testing.T, ss store.Store) {
|
||||
require.NoError(t, err)
|
||||
|
||||
// Time before syncable was updated
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.UpdateAt-1, nil)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.UpdateAt-1, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, channelMembers, 1)
|
||||
require.Equal(t, user.Id, channelMembers[0].UserID)
|
||||
require.Equal(t, channel.Id, channelMembers[0].ChannelID)
|
||||
|
||||
// Time after syncable was updated
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.UpdateAt+1, nil)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.UpdateAt+1, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, channelMembers)
|
||||
|
||||
@@ -1657,21 +1673,21 @@ func testChannelMembersToAdd(t *testing.T, ss store.Store) {
|
||||
syncable.AutoAdd = false
|
||||
_, err = ss.Group().UpdateGroupSyncable(syncable)
|
||||
require.NoError(t, err)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, channelMembers)
|
||||
|
||||
// reset state of syncable and verify
|
||||
_, err = ss.Group().UpdateGroupSyncable(&pristineSyncable)
|
||||
require.NoError(t, err)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, channelMembers, 1)
|
||||
|
||||
// No result if Group deleted
|
||||
_, err = ss.Group().Delete(group.Id)
|
||||
require.NoError(t, err)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, channelMembers)
|
||||
|
||||
@@ -1679,14 +1695,14 @@ func testChannelMembersToAdd(t *testing.T, ss store.Store) {
|
||||
group.DeleteAt = 0
|
||||
_, err = ss.Group().Update(group)
|
||||
require.NoError(t, err)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, channelMembers, 1)
|
||||
|
||||
// No result if Channel deleted
|
||||
nErr = ss.Channel().Delete(channel.Id, model.GetMillis())
|
||||
require.NoError(t, nErr)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, channelMembers)
|
||||
|
||||
@@ -1694,56 +1710,63 @@ func testChannelMembersToAdd(t *testing.T, ss store.Store) {
|
||||
channel.DeleteAt = 0
|
||||
_, nErr = ss.Channel().Update(channel)
|
||||
require.NoError(t, nErr)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, channelMembers, 1)
|
||||
|
||||
// No result if GroupChannel deleted
|
||||
_, err = ss.Group().DeleteGroupSyncable(group.Id, channel.Id, model.GroupSyncableTypeChannel)
|
||||
require.NoError(t, err)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, channelMembers)
|
||||
|
||||
// reset GroupChannel and verify
|
||||
_, err = ss.Group().UpdateGroupSyncable(&pristineSyncable)
|
||||
require.NoError(t, err)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, channelMembers, 1)
|
||||
|
||||
// No result if GroupMember deleted
|
||||
_, err = ss.Group().DeleteMember(group.Id, user.Id)
|
||||
require.NoError(t, err)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, channelMembers)
|
||||
|
||||
// restore group member and verify
|
||||
_, err = ss.Group().UpsertMember(group.Id, user.Id)
|
||||
require.NoError(t, err)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, channelMembers, 1)
|
||||
|
||||
// Adding Channel (ChannelMemberHistory) should stop returning result
|
||||
nErr = ss.ChannelMemberHistory().LogJoinEvent(user.Id, channel.Id, model.GetMillis())
|
||||
require.NoError(t, nErr)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, channelMembers)
|
||||
|
||||
// Leaving Channel (ChannelMemberHistory) should still not return result
|
||||
nErr = ss.ChannelMemberHistory().LogLeaveEvent(user.Id, channel.Id, model.GetMillis())
|
||||
require.NoError(t, nErr)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, channelMembers)
|
||||
|
||||
// Purging ChannelMemberHistory re-returns the result
|
||||
_, nErr = ss.ChannelMemberHistory().PermanentDeleteBatch(model.GetMillis()+1, 100)
|
||||
require.NoError(t, nErr)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, channelMembers, 1)
|
||||
|
||||
// If includeRemovedMembers is set to true, removed members should be added back in
|
||||
nErr = ss.ChannelMemberHistory().LogLeaveEvent(user.Id, channel.Id, model.GetMillis())
|
||||
require.NoError(t, nErr)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, true)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, channelMembers, 1)
|
||||
}
|
||||
@@ -1815,15 +1838,15 @@ func testChannelMembersToAddSingleChannel(t *testing.T, ss store.Store) {
|
||||
_, err = ss.Group().CreateGroupSyncable(model.NewGroupChannel(group2.Id, channel2.Id, true))
|
||||
require.NoError(t, err)
|
||||
|
||||
channelMembers, err := ss.Group().ChannelMembersToAdd(0, nil)
|
||||
channelMembers, err := ss.Group().ChannelMembersToAdd(0, nil, false)
|
||||
require.NoError(t, err)
|
||||
require.GreaterOrEqual(t, len(channelMembers), 3)
|
||||
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, &channel1.Id)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, &channel1.Id, false)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, channelMembers, 2)
|
||||
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, &channel2.Id)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0, &channel2.Id, false)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, channelMembers, 1)
|
||||
}
|
||||
|
||||
@@ -60,13 +60,13 @@ func (_m *GroupStore) ChannelMembersMinusGroupMembers(channelID string, groupIDs
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// ChannelMembersToAdd provides a mock function with given fields: since, channelID
|
||||
func (_m *GroupStore) ChannelMembersToAdd(since int64, channelID *string) ([]*model.UserChannelIDPair, error) {
|
||||
ret := _m.Called(since, channelID)
|
||||
// ChannelMembersToAdd provides a mock function with given fields: since, channelID, includeRemovedMembers
|
||||
func (_m *GroupStore) ChannelMembersToAdd(since int64, channelID *string, includeRemovedMembers bool) ([]*model.UserChannelIDPair, error) {
|
||||
ret := _m.Called(since, channelID, includeRemovedMembers)
|
||||
|
||||
var r0 []*model.UserChannelIDPair
|
||||
if rf, ok := ret.Get(0).(func(int64, *string) []*model.UserChannelIDPair); ok {
|
||||
r0 = rf(since, channelID)
|
||||
if rf, ok := ret.Get(0).(func(int64, *string, bool) []*model.UserChannelIDPair); ok {
|
||||
r0 = rf(since, channelID, includeRemovedMembers)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).([]*model.UserChannelIDPair)
|
||||
@@ -74,8 +74,8 @@ func (_m *GroupStore) ChannelMembersToAdd(since int64, channelID *string) ([]*mo
|
||||
}
|
||||
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(1).(func(int64, *string) error); ok {
|
||||
r1 = rf(since, channelID)
|
||||
if rf, ok := ret.Get(1).(func(int64, *string, bool) error); ok {
|
||||
r1 = rf(since, channelID, includeRemovedMembers)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
@@ -880,13 +880,13 @@ func (_m *GroupStore) TeamMembersMinusGroupMembers(teamID string, groupIDs []str
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// TeamMembersToAdd provides a mock function with given fields: since, teamID
|
||||
func (_m *GroupStore) TeamMembersToAdd(since int64, teamID *string) ([]*model.UserTeamIDPair, error) {
|
||||
ret := _m.Called(since, teamID)
|
||||
// TeamMembersToAdd provides a mock function with given fields: since, teamID, includeRemovedMembers
|
||||
func (_m *GroupStore) TeamMembersToAdd(since int64, teamID *string, includeRemovedMembers bool) ([]*model.UserTeamIDPair, error) {
|
||||
ret := _m.Called(since, teamID, includeRemovedMembers)
|
||||
|
||||
var r0 []*model.UserTeamIDPair
|
||||
if rf, ok := ret.Get(0).(func(int64, *string) []*model.UserTeamIDPair); ok {
|
||||
r0 = rf(since, teamID)
|
||||
if rf, ok := ret.Get(0).(func(int64, *string, bool) []*model.UserTeamIDPair); ok {
|
||||
r0 = rf(since, teamID, includeRemovedMembers)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).([]*model.UserTeamIDPair)
|
||||
@@ -894,8 +894,8 @@ func (_m *GroupStore) TeamMembersToAdd(since int64, teamID *string) ([]*model.Us
|
||||
}
|
||||
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(1).(func(int64, *string) error); ok {
|
||||
r1 = rf(since, teamID)
|
||||
if rf, ok := ret.Get(1).(func(int64, *string, bool) error); ok {
|
||||
r1 = rf(since, teamID, includeRemovedMembers)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
@@ -3083,10 +3083,10 @@ func (s *TimerLayerGroupStore) ChannelMembersMinusGroupMembers(channelID string,
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *TimerLayerGroupStore) ChannelMembersToAdd(since int64, channelID *string) ([]*model.UserChannelIDPair, error) {
|
||||
func (s *TimerLayerGroupStore) ChannelMembersToAdd(since int64, channelID *string, includeRemovedMembers bool) ([]*model.UserChannelIDPair, error) {
|
||||
start := timemodule.Now()
|
||||
|
||||
result, err := s.GroupStore.ChannelMembersToAdd(since, channelID)
|
||||
result, err := s.GroupStore.ChannelMembersToAdd(since, channelID, includeRemovedMembers)
|
||||
|
||||
elapsed := float64(timemodule.Since(start)) / float64(timemodule.Second)
|
||||
if s.Root.Metrics != nil {
|
||||
@@ -3675,10 +3675,10 @@ func (s *TimerLayerGroupStore) TeamMembersMinusGroupMembers(teamID string, group
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *TimerLayerGroupStore) TeamMembersToAdd(since int64, teamID *string) ([]*model.UserTeamIDPair, error) {
|
||||
func (s *TimerLayerGroupStore) TeamMembersToAdd(since int64, teamID *string, includeRemovedMembers bool) ([]*model.UserTeamIDPair, error) {
|
||||
start := timemodule.Now()
|
||||
|
||||
result, err := s.GroupStore.TeamMembersToAdd(since, teamID)
|
||||
result, err := s.GroupStore.TeamMembersToAdd(since, teamID, includeRemovedMembers)
|
||||
|
||||
elapsed := float64(timemodule.Since(start)) / float64(timemodule.Second)
|
||||
if s.Root.Metrics != nil {
|
||||
|
||||
Ссылка в новой задаче
Block a user