Migrate Groups store to sync by default (Add/Remove Channel/Team Members) (#10997)
* Migrate Groups store to sync by default (Add/Remove Channel/Team Members) * Addressing PR review comments
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
17e6297a15
Коммит
b3118ce605
24
app/group.go
24
app/group.go
@@ -134,35 +134,19 @@ func (a *App) DeleteGroupSyncable(groupID string, syncableID string, syncableTyp
|
||||
}
|
||||
|
||||
func (a *App) TeamMembersToAdd(since int64) ([]*model.UserTeamIDPair, *model.AppError) {
|
||||
result := <-a.Srv.Store.Group().TeamMembersToAdd(since)
|
||||
if result.Err != nil {
|
||||
return nil, result.Err
|
||||
}
|
||||
return result.Data.([]*model.UserTeamIDPair), nil
|
||||
return a.Srv.Store.Group().TeamMembersToAdd(since)
|
||||
}
|
||||
|
||||
func (a *App) ChannelMembersToAdd(since int64) ([]*model.UserChannelIDPair, *model.AppError) {
|
||||
result := <-a.Srv.Store.Group().ChannelMembersToAdd(since)
|
||||
if result.Err != nil {
|
||||
return nil, result.Err
|
||||
}
|
||||
return result.Data.([]*model.UserChannelIDPair), nil
|
||||
return a.Srv.Store.Group().ChannelMembersToAdd(since)
|
||||
}
|
||||
|
||||
func (a *App) TeamMembersToRemove() ([]*model.TeamMember, *model.AppError) {
|
||||
result := <-a.Srv.Store.Group().TeamMembersToRemove()
|
||||
if result.Err != nil {
|
||||
return nil, result.Err
|
||||
}
|
||||
return result.Data.([]*model.TeamMember), nil
|
||||
return a.Srv.Store.Group().TeamMembersToRemove()
|
||||
}
|
||||
|
||||
func (a *App) ChannelMembersToRemove() ([]*model.ChannelMember, *model.AppError) {
|
||||
result := <-a.Srv.Store.Group().ChannelMembersToRemove()
|
||||
if result.Err != nil {
|
||||
return nil, result.Err
|
||||
}
|
||||
return result.Data.([]*model.ChannelMember), nil
|
||||
return a.Srv.Store.Group().ChannelMembersToRemove()
|
||||
}
|
||||
|
||||
func (a *App) GetGroupsByChannel(channelId string, opts model.GroupSearchOpts) ([]*model.Group, int, *model.AppError) {
|
||||
|
||||
@@ -701,10 +701,8 @@ func (s *SqlGroupStore) DeleteGroupSyncable(groupID string, syncableID string, s
|
||||
// based on the groups configurations.
|
||||
//
|
||||
// Typically since will be the last successful group sync time.
|
||||
func (s *SqlGroupStore) TeamMembersToAdd(since int64) store.StoreChannel {
|
||||
return store.Do(func(result *store.StoreResult) {
|
||||
|
||||
sql := `
|
||||
func (s *SqlGroupStore) TeamMembersToAdd(since int64) ([]*model.UserTeamIDPair, *model.AppError) {
|
||||
sql := `
|
||||
SELECT
|
||||
GroupMembers.UserId, GroupTeams.TeamId
|
||||
FROM
|
||||
@@ -727,27 +725,22 @@ func (s *SqlGroupStore) TeamMembersToAdd(since int64) store.StoreChannel {
|
||||
AND (GroupMembers.CreateAt >= :Since
|
||||
OR GroupTeams.UpdateAt >= :Since)`
|
||||
|
||||
var teamMembers []*model.UserTeamIDPair
|
||||
var teamMembers []*model.UserTeamIDPair
|
||||
|
||||
_, err := s.GetReplica().Select(&teamMembers, sql, map[string]interface{}{"Since": since})
|
||||
if err != nil {
|
||||
result.Err = model.NewAppError("SqlGroupStore.TeamMembersToAdd", "store.select_error", nil, err.Error(), http.StatusInternalServerError)
|
||||
}
|
||||
_, err := s.GetReplica().Select(&teamMembers, sql, map[string]interface{}{"Since": since})
|
||||
if err != nil {
|
||||
return nil, model.NewAppError("SqlGroupStore.TeamMembersToAdd", "store.select_error", nil, err.Error(), http.StatusInternalServerError)
|
||||
}
|
||||
|
||||
result.Data = teamMembers
|
||||
|
||||
return
|
||||
})
|
||||
return teamMembers, nil
|
||||
}
|
||||
|
||||
// ChannelMembersToAdd returns a slice of UserChannelIDPair that need newly created memberships
|
||||
// based on the groups configurations.
|
||||
//
|
||||
// Typically since will be the last successful group sync time.
|
||||
func (s *SqlGroupStore) ChannelMembersToAdd(since int64) store.StoreChannel {
|
||||
return store.Do(func(result *store.StoreResult) {
|
||||
|
||||
sql := `
|
||||
func (s *SqlGroupStore) ChannelMembersToAdd(since int64) ([]*model.UserChannelIDPair, *model.AppError) {
|
||||
sql := `
|
||||
SELECT
|
||||
GroupMembers.UserId, GroupChannels.ChannelId
|
||||
FROM
|
||||
@@ -770,17 +763,14 @@ func (s *SqlGroupStore) ChannelMembersToAdd(since int64) store.StoreChannel {
|
||||
AND (GroupMembers.CreateAt >= :Since
|
||||
OR GroupChannels.UpdateAt >= :Since)`
|
||||
|
||||
var channelMembers []*model.UserChannelIDPair
|
||||
var channelMembers []*model.UserChannelIDPair
|
||||
|
||||
_, err := s.GetReplica().Select(&channelMembers, sql, map[string]interface{}{"Since": since})
|
||||
if err != nil {
|
||||
result.Err = model.NewAppError("SqlGroupStore.ChannelMembersToAdd", "store.select_error", nil, "", http.StatusInternalServerError)
|
||||
}
|
||||
_, err := s.GetReplica().Select(&channelMembers, sql, map[string]interface{}{"Since": since})
|
||||
if err != nil {
|
||||
return nil, model.NewAppError("SqlGroupStore.ChannelMembersToAdd", "store.select_error", nil, "", http.StatusInternalServerError)
|
||||
}
|
||||
|
||||
result.Data = channelMembers
|
||||
|
||||
return
|
||||
})
|
||||
return channelMembers, nil
|
||||
}
|
||||
|
||||
func groupSyncableToGroupTeam(groupSyncable *model.GroupSyncable) *groupTeam {
|
||||
@@ -798,10 +788,8 @@ func groupSyncableToGroupChannel(groupSyncable *model.GroupSyncable) *groupChann
|
||||
}
|
||||
|
||||
// TeamMembersToRemove returns all team members that should be removed based on group constraints.
|
||||
func (s *SqlGroupStore) TeamMembersToRemove() store.StoreChannel {
|
||||
return store.Do(func(result *store.StoreResult) {
|
||||
|
||||
sql := `
|
||||
func (s *SqlGroupStore) TeamMembersToRemove() ([]*model.TeamMember, *model.AppError) {
|
||||
sql := `
|
||||
SELECT
|
||||
TeamMembers.TeamId,
|
||||
TeamMembers.UserId,
|
||||
@@ -838,17 +826,14 @@ func (s *SqlGroupStore) TeamMembersToRemove() store.StoreChannel {
|
||||
Teams.Id,
|
||||
GroupMembers.UserId)`
|
||||
|
||||
var teamMembers []*model.TeamMember
|
||||
var teamMembers []*model.TeamMember
|
||||
|
||||
_, err := s.GetReplica().Select(&teamMembers, sql)
|
||||
if err != nil {
|
||||
result.Err = model.NewAppError("SqlGroupStore.TeamMembersToRemove", "store.select_error", nil, "", http.StatusInternalServerError)
|
||||
}
|
||||
_, err := s.GetReplica().Select(&teamMembers, sql)
|
||||
if err != nil {
|
||||
return nil, model.NewAppError("SqlGroupStore.TeamMembersToRemove", "store.select_error", nil, "", http.StatusInternalServerError)
|
||||
}
|
||||
|
||||
result.Data = teamMembers
|
||||
|
||||
return
|
||||
})
|
||||
return teamMembers, nil
|
||||
}
|
||||
|
||||
func (s *SqlGroupStore) CountGroupsByChannel(channelId string, opts model.GroupSearchOpts) store.StoreChannel {
|
||||
@@ -905,10 +890,8 @@ func (s *SqlGroupStore) GetGroupsByChannel(channelId string, opts model.GroupSea
|
||||
}
|
||||
|
||||
// ChannelMembersToRemove returns all channel members that should be removed based on group constraints.
|
||||
func (s *SqlGroupStore) ChannelMembersToRemove() store.StoreChannel {
|
||||
return store.Do(func(result *store.StoreResult) {
|
||||
|
||||
sql := `
|
||||
func (s *SqlGroupStore) ChannelMembersToRemove() ([]*model.ChannelMember, *model.AppError) {
|
||||
sql := `
|
||||
SELECT
|
||||
ChannelMembers.ChannelId,
|
||||
ChannelMembers.UserId,
|
||||
@@ -948,17 +931,14 @@ func (s *SqlGroupStore) ChannelMembersToRemove() store.StoreChannel {
|
||||
Channels.Id,
|
||||
GroupMembers.UserId)`
|
||||
|
||||
var channelMembers []*model.ChannelMember
|
||||
var channelMembers []*model.ChannelMember
|
||||
|
||||
_, err := s.GetReplica().Select(&channelMembers, sql)
|
||||
if err != nil {
|
||||
result.Err = model.NewAppError("SqlGroupStore.ChannelMembersToRemove", "store.select_error", nil, err.Error(), http.StatusInternalServerError)
|
||||
}
|
||||
_, err := s.GetReplica().Select(&channelMembers, sql)
|
||||
if err != nil {
|
||||
return nil, model.NewAppError("SqlGroupStore.ChannelMembersToRemove", "store.select_error", nil, err.Error(), http.StatusInternalServerError)
|
||||
}
|
||||
|
||||
result.Data = channelMembers
|
||||
|
||||
return
|
||||
})
|
||||
return channelMembers, nil
|
||||
}
|
||||
|
||||
func (s *SqlGroupStore) groupsBySyncableBaseQuery(st model.GroupSyncableType, t selectType, syncableID string, opts model.GroupSearchOpts) squirrel.SelectBuilder {
|
||||
|
||||
@@ -588,11 +588,11 @@ type GroupStore interface {
|
||||
UpdateGroupSyncable(groupSyncable *model.GroupSyncable) StoreChannel
|
||||
DeleteGroupSyncable(groupID string, syncableID string, syncableType model.GroupSyncableType) StoreChannel
|
||||
|
||||
TeamMembersToAdd(since int64) StoreChannel
|
||||
ChannelMembersToAdd(since int64) StoreChannel
|
||||
TeamMembersToAdd(since int64) ([]*model.UserTeamIDPair, *model.AppError)
|
||||
ChannelMembersToAdd(since int64) ([]*model.UserChannelIDPair, *model.AppError)
|
||||
|
||||
TeamMembersToRemove() StoreChannel
|
||||
ChannelMembersToRemove() StoreChannel
|
||||
TeamMembersToRemove() ([]*model.TeamMember, *model.AppError)
|
||||
ChannelMembersToRemove() ([]*model.ChannelMember, *model.AppError)
|
||||
|
||||
GetGroupsByChannel(channelId string, opts model.GroupSearchOpts) StoreChannel
|
||||
CountGroupsByChannel(channelId string, opts model.GroupSearchOpts) StoreChannel
|
||||
|
||||
@@ -937,26 +937,25 @@ func testPendingAutoAddTeamMembers(t *testing.T, ss store.Store) {
|
||||
syncable := res.Data.(*model.GroupSyncable)
|
||||
|
||||
// Time before syncable was created
|
||||
res = <-ss.Group().TeamMembersToAdd(syncable.CreateAt - 1)
|
||||
require.Nil(t, res.Err)
|
||||
teamMembers := res.Data.([]*model.UserTeamIDPair)
|
||||
teamMembers, err := ss.Group().TeamMembersToAdd(syncable.CreateAt - 1)
|
||||
require.Nil(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
|
||||
res = <-ss.Group().TeamMembersToAdd(syncable.CreateAt + 1)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 0)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(syncable.CreateAt + 1)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, teamMembers, 0)
|
||||
|
||||
// Delete and restore GroupMember should return result
|
||||
res = <-ss.Group().DeleteMember(group.Id, user.Id)
|
||||
require.Nil(t, res.Err)
|
||||
res = <-ss.Group().CreateOrRestoreMember(group.Id, user.Id)
|
||||
require.Nil(t, res.Err)
|
||||
res = <-ss.Group().TeamMembersToAdd(syncable.CreateAt + 1)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 1)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(syncable.CreateAt + 1)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, teamMembers, 1)
|
||||
|
||||
pristineSyncable := *syncable
|
||||
|
||||
@@ -964,89 +963,88 @@ func testPendingAutoAddTeamMembers(t *testing.T, ss store.Store) {
|
||||
require.Nil(t, res.Err)
|
||||
|
||||
// Time before syncable was updated
|
||||
res = <-ss.Group().TeamMembersToAdd(syncable.UpdateAt - 1)
|
||||
require.Nil(t, res.Err)
|
||||
teamMembers = res.Data.([]*model.UserTeamIDPair)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(syncable.UpdateAt - 1)
|
||||
require.Nil(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
|
||||
res = <-ss.Group().TeamMembersToAdd(syncable.UpdateAt + 1)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 0)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(syncable.UpdateAt + 1)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, teamMembers, 0)
|
||||
|
||||
// Only includes if auto-add
|
||||
syncable.AutoAdd = false
|
||||
res = <-ss.Group().UpdateGroupSyncable(syncable)
|
||||
require.Nil(t, res.Err)
|
||||
res = <-ss.Group().TeamMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 0)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, teamMembers, 0)
|
||||
|
||||
// reset state of syncable and verify
|
||||
res = <-ss.Group().UpdateGroupSyncable(&pristineSyncable)
|
||||
require.Nil(t, res.Err)
|
||||
res = <-ss.Group().TeamMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 1)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, teamMembers, 1)
|
||||
|
||||
// No result if Group deleted
|
||||
res = <-ss.Group().Delete(group.Id)
|
||||
require.Nil(t, res.Err)
|
||||
res = <-ss.Group().TeamMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 0)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, teamMembers, 0)
|
||||
|
||||
// reset state of group and verify
|
||||
group.DeleteAt = 0
|
||||
res = <-ss.Group().Update(group)
|
||||
res = <-ss.Group().TeamMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 1)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, teamMembers, 1)
|
||||
|
||||
// No result if Team deleted
|
||||
team.DeleteAt = model.GetMillis()
|
||||
team, err = ss.Team().Update(team)
|
||||
require.Nil(t, err)
|
||||
res = <-ss.Group().TeamMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 0)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, teamMembers, 0)
|
||||
|
||||
// reset state of team and verify
|
||||
team.DeleteAt = 0
|
||||
team, err = ss.Team().Update(team)
|
||||
require.Nil(t, err)
|
||||
res = <-ss.Group().TeamMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 1)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, teamMembers, 1)
|
||||
|
||||
// No result if GroupTeam deleted
|
||||
res = <-ss.Group().DeleteGroupSyncable(group.Id, team.Id, model.GroupSyncableTypeTeam)
|
||||
require.Nil(t, res.Err)
|
||||
res = <-ss.Group().TeamMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 0)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, teamMembers, 0)
|
||||
|
||||
// reset GroupTeam and verify
|
||||
res = <-ss.Group().UpdateGroupSyncable(&pristineSyncable)
|
||||
require.Nil(t, res.Err)
|
||||
res = <-ss.Group().TeamMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 1)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, teamMembers, 1)
|
||||
|
||||
// No result if GroupMember deleted
|
||||
res = <-ss.Group().DeleteMember(group.Id, user.Id)
|
||||
require.Nil(t, res.Err)
|
||||
res = <-ss.Group().TeamMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 0)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, teamMembers, 0)
|
||||
|
||||
// restore group member and verify
|
||||
res = <-ss.Group().CreateOrRestoreMember(group.Id, user.Id)
|
||||
res = <-ss.Group().TeamMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 1)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, teamMembers, 1)
|
||||
|
||||
// adding team membership stops returning result
|
||||
res = <-ss.Team().SaveMember(&model.TeamMember{
|
||||
@@ -1054,9 +1052,9 @@ func testPendingAutoAddTeamMembers(t *testing.T, ss store.Store) {
|
||||
UserId: user.Id,
|
||||
}, 999)
|
||||
require.Nil(t, res.Err)
|
||||
res = <-ss.Group().TeamMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 0)
|
||||
teamMembers, err = ss.Group().TeamMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, teamMembers, 0)
|
||||
}
|
||||
|
||||
func testPendingAutoAddChannelMembers(t *testing.T, ss store.Store) {
|
||||
@@ -1099,26 +1097,25 @@ func testPendingAutoAddChannelMembers(t *testing.T, ss store.Store) {
|
||||
syncable := res.Data.(*model.GroupSyncable)
|
||||
|
||||
// Time before syncable was created
|
||||
res = <-ss.Group().ChannelMembersToAdd(syncable.CreateAt - 1)
|
||||
require.Nil(t, res.Err)
|
||||
channelMembers := res.Data.([]*model.UserChannelIDPair)
|
||||
channelMembers, err := ss.Group().ChannelMembersToAdd(syncable.CreateAt - 1)
|
||||
require.Nil(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
|
||||
res = <-ss.Group().ChannelMembersToAdd(syncable.CreateAt + 1)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 0)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.CreateAt + 1)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, channelMembers, 0)
|
||||
|
||||
// Delete and restore GroupMember should return result
|
||||
res = <-ss.Group().DeleteMember(group.Id, user.Id)
|
||||
require.Nil(t, res.Err)
|
||||
res = <-ss.Group().CreateOrRestoreMember(group.Id, user.Id)
|
||||
require.Nil(t, res.Err)
|
||||
res = <-ss.Group().ChannelMembersToAdd(syncable.CreateAt + 1)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 1)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.CreateAt + 1)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, channelMembers, 1)
|
||||
|
||||
pristineSyncable := *syncable
|
||||
|
||||
@@ -1126,131 +1123,127 @@ func testPendingAutoAddChannelMembers(t *testing.T, ss store.Store) {
|
||||
require.Nil(t, res.Err)
|
||||
|
||||
// Time before syncable was updated
|
||||
res = <-ss.Group().ChannelMembersToAdd(syncable.UpdateAt - 1)
|
||||
require.Nil(t, res.Err)
|
||||
channelMembers = res.Data.([]*model.UserChannelIDPair)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.UpdateAt - 1)
|
||||
require.Nil(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
|
||||
res = <-ss.Group().ChannelMembersToAdd(syncable.UpdateAt + 1)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 0)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.UpdateAt + 1)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, channelMembers, 0)
|
||||
|
||||
// Only includes if auto-add
|
||||
syncable.AutoAdd = false
|
||||
res = <-ss.Group().UpdateGroupSyncable(syncable)
|
||||
require.Nil(t, res.Err)
|
||||
res = <-ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 0)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, channelMembers, 0)
|
||||
|
||||
// reset state of syncable and verify
|
||||
res = <-ss.Group().UpdateGroupSyncable(&pristineSyncable)
|
||||
require.Nil(t, res.Err)
|
||||
res = <-ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 1)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, channelMembers, 1)
|
||||
|
||||
// No result if Group deleted
|
||||
res = <-ss.Group().Delete(group.Id)
|
||||
require.Nil(t, res.Err)
|
||||
res = <-ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 0)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, channelMembers, 0)
|
||||
|
||||
// reset state of group and verify
|
||||
group.DeleteAt = 0
|
||||
res = <-ss.Group().Update(group)
|
||||
res = <-ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 1)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, channelMembers, 1)
|
||||
|
||||
// No result if Channel deleted
|
||||
err = ss.Channel().Delete(channel.Id, model.GetMillis())
|
||||
require.Nil(t, err)
|
||||
res = <-ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 0)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, channelMembers, 0)
|
||||
|
||||
// reset state of channel and verify
|
||||
channel.DeleteAt = 0
|
||||
_, err = ss.Channel().Update(channel)
|
||||
require.Nil(t, err)
|
||||
res = <-ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 1)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, channelMembers, 1)
|
||||
|
||||
// No result if GroupChannel deleted
|
||||
res = <-ss.Group().DeleteGroupSyncable(group.Id, channel.Id, model.GroupSyncableTypeChannel)
|
||||
require.Nil(t, res.Err)
|
||||
res = <-ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 0)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, channelMembers, 0)
|
||||
|
||||
// reset GroupChannel and verify
|
||||
res = <-ss.Group().UpdateGroupSyncable(&pristineSyncable)
|
||||
require.Nil(t, res.Err)
|
||||
res = <-ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 1)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, channelMembers, 1)
|
||||
|
||||
// No result if GroupMember deleted
|
||||
res = <-ss.Group().DeleteMember(group.Id, user.Id)
|
||||
require.Nil(t, res.Err)
|
||||
res = <-ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 0)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, channelMembers, 0)
|
||||
|
||||
// restore group member and verify
|
||||
res = <-ss.Group().CreateOrRestoreMember(group.Id, user.Id)
|
||||
require.Nil(t, res.Err)
|
||||
res = <-ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 1)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, channelMembers, 1)
|
||||
|
||||
// Adding Channel (ChannelMemberHistory) should stop returning result
|
||||
res = <-ss.ChannelMemberHistory().LogJoinEvent(user.Id, channel.Id, model.GetMillis())
|
||||
require.Nil(t, res.Err)
|
||||
res = <-ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 0)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, channelMembers, 0)
|
||||
|
||||
// Leaving Channel (ChannelMemberHistory) should still not return result
|
||||
res = <-ss.ChannelMemberHistory().LogLeaveEvent(user.Id, channel.Id, model.GetMillis())
|
||||
require.Nil(t, res.Err)
|
||||
res = <-ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 0)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, channelMembers, 0)
|
||||
|
||||
// Purging ChannelMemberHistory re-returns the result
|
||||
res = <-ss.ChannelMemberHistory().PermanentDeleteBatch(model.GetMillis()+1, 100)
|
||||
require.Nil(t, res.Err)
|
||||
res = <-ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 1)
|
||||
channelMembers, err = ss.Group().ChannelMembersToAdd(0)
|
||||
require.Nil(t, err)
|
||||
require.Len(t, channelMembers, 1)
|
||||
}
|
||||
|
||||
func testTeamMemberRemovals(t *testing.T, ss store.Store) {
|
||||
data := pendingMemberRemovalsDataSetup(t, ss)
|
||||
|
||||
// one result when both users are in the group (for user C)
|
||||
res := <-ss.Group().TeamMembersToRemove()
|
||||
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 1)
|
||||
teamMembers := res.Data.([]*model.TeamMember)
|
||||
teamMembers, err := ss.Group().TeamMembersToRemove()
|
||||
require.Nil(t, err)
|
||||
require.Len(t, teamMembers, 1)
|
||||
require.Equal(t, data.UserC.Id, teamMembers[0].UserId)
|
||||
|
||||
res = <-ss.Group().DeleteMember(data.Group.Id, data.UserB.Id)
|
||||
res := <-ss.Group().DeleteMember(data.Group.Id, data.UserB.Id)
|
||||
require.Nil(t, res.Err)
|
||||
|
||||
// user b and c should now be returned
|
||||
res = <-ss.Group().TeamMembersToRemove()
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 2)
|
||||
teamMembers = res.Data.([]*model.TeamMember)
|
||||
teamMembers, err = ss.Group().TeamMembersToRemove()
|
||||
require.Nil(t, err)
|
||||
require.Len(t, teamMembers, 2)
|
||||
|
||||
var userIDs []string
|
||||
for _, item := range teamMembers {
|
||||
@@ -1264,13 +1257,13 @@ func testTeamMemberRemovals(t *testing.T, ss store.Store) {
|
||||
res = <-ss.Group().DeleteMember(data.Group.Id, data.UserA.Id)
|
||||
require.Nil(t, res.Err)
|
||||
|
||||
res = <-ss.Group().TeamMembersToRemove()
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 3)
|
||||
teamMembers, err = ss.Group().TeamMembersToRemove()
|
||||
require.Nil(t, err)
|
||||
require.Len(t, teamMembers, 3)
|
||||
|
||||
// Make one of them a bot
|
||||
res = <-ss.Group().TeamMembersToRemove()
|
||||
teamMembers = res.Data.([]*model.TeamMember)
|
||||
teamMembers, err = ss.Group().TeamMembersToRemove()
|
||||
require.Nil(t, err)
|
||||
teamMember := teamMembers[0]
|
||||
bot := &model.Bot{
|
||||
UserId: teamMember.UserId,
|
||||
@@ -1283,18 +1276,18 @@ func testTeamMemberRemovals(t *testing.T, ss store.Store) {
|
||||
bot = res.Data.(*model.Bot)
|
||||
|
||||
// verify that bot is not returned in results
|
||||
res = <-ss.Group().TeamMembersToRemove()
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 2)
|
||||
teamMembers, err = ss.Group().TeamMembersToRemove()
|
||||
require.Nil(t, err)
|
||||
require.Len(t, teamMembers, 2)
|
||||
|
||||
// delete the bot
|
||||
res = <-ss.Bot().PermanentDelete(bot.UserId)
|
||||
require.Nil(t, res.Err)
|
||||
|
||||
// Should be back to 3 users
|
||||
res = <-ss.Group().TeamMembersToRemove()
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 3)
|
||||
teamMembers, err = ss.Group().TeamMembersToRemove()
|
||||
require.Nil(t, err)
|
||||
require.Len(t, teamMembers, 3)
|
||||
|
||||
// add users back to groups
|
||||
res = <-ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserA.Id)
|
||||
@@ -1315,21 +1308,18 @@ func testChannelMemberRemovals(t *testing.T, ss store.Store) {
|
||||
data := pendingMemberRemovalsDataSetup(t, ss)
|
||||
|
||||
// one result when both users are in the group (for user C)
|
||||
res := <-ss.Group().ChannelMembersToRemove()
|
||||
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 1)
|
||||
channelMembers := res.Data.([]*model.ChannelMember)
|
||||
channelMembers, err := ss.Group().ChannelMembersToRemove()
|
||||
require.Nil(t, err)
|
||||
require.Len(t, channelMembers, 1)
|
||||
require.Equal(t, data.UserC.Id, channelMembers[0].UserId)
|
||||
|
||||
res = <-ss.Group().DeleteMember(data.Group.Id, data.UserB.Id)
|
||||
res := <-ss.Group().DeleteMember(data.Group.Id, data.UserB.Id)
|
||||
require.Nil(t, res.Err)
|
||||
|
||||
// user b and c should now be returned
|
||||
res = <-ss.Group().ChannelMembersToRemove()
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 2)
|
||||
channelMembers = res.Data.([]*model.ChannelMember)
|
||||
channelMembers, err = ss.Group().ChannelMembersToRemove()
|
||||
require.Nil(t, err)
|
||||
require.Len(t, channelMembers, 2)
|
||||
|
||||
var userIDs []string
|
||||
for _, item := range channelMembers {
|
||||
@@ -1343,13 +1333,13 @@ func testChannelMemberRemovals(t *testing.T, ss store.Store) {
|
||||
res = <-ss.Group().DeleteMember(data.Group.Id, data.UserA.Id)
|
||||
require.Nil(t, res.Err)
|
||||
|
||||
res = <-ss.Group().ChannelMembersToRemove()
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 3)
|
||||
channelMembers, err = ss.Group().ChannelMembersToRemove()
|
||||
require.Nil(t, err)
|
||||
require.Len(t, channelMembers, 3)
|
||||
|
||||
// Make one of them a bot
|
||||
res = <-ss.Group().ChannelMembersToRemove()
|
||||
channelMembers = res.Data.([]*model.ChannelMember)
|
||||
channelMembers, err = ss.Group().ChannelMembersToRemove()
|
||||
require.Nil(t, err)
|
||||
channelMember := channelMembers[0]
|
||||
bot := &model.Bot{
|
||||
UserId: channelMember.UserId,
|
||||
@@ -1362,18 +1352,18 @@ func testChannelMemberRemovals(t *testing.T, ss store.Store) {
|
||||
bot = res.Data.(*model.Bot)
|
||||
|
||||
// verify that bot is not returned in results
|
||||
res = <-ss.Group().ChannelMembersToRemove()
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 2)
|
||||
channelMembers, err = ss.Group().ChannelMembersToRemove()
|
||||
require.Nil(t, err)
|
||||
require.Len(t, channelMembers, 2)
|
||||
|
||||
// delete the bot
|
||||
res = <-ss.Bot().PermanentDelete(bot.UserId)
|
||||
require.Nil(t, res.Err)
|
||||
|
||||
// Should be back to 3 users
|
||||
res = <-ss.Group().ChannelMembersToRemove()
|
||||
require.Nil(t, res.Err)
|
||||
require.Len(t, res.Data, 3)
|
||||
channelMembers, err = ss.Group().ChannelMembersToRemove()
|
||||
require.Nil(t, err)
|
||||
require.Len(t, channelMembers, 3)
|
||||
|
||||
// add users back to groups
|
||||
res = <-ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserA.Id)
|
||||
|
||||
@@ -14,35 +14,53 @@ type GroupStore struct {
|
||||
}
|
||||
|
||||
// ChannelMembersToAdd provides a mock function with given fields: since
|
||||
func (_m *GroupStore) ChannelMembersToAdd(since int64) store.StoreChannel {
|
||||
func (_m *GroupStore) ChannelMembersToAdd(since int64) ([]*model.UserChannelIDPair, *model.AppError) {
|
||||
ret := _m.Called(since)
|
||||
|
||||
var r0 store.StoreChannel
|
||||
if rf, ok := ret.Get(0).(func(int64) store.StoreChannel); ok {
|
||||
var r0 []*model.UserChannelIDPair
|
||||
if rf, ok := ret.Get(0).(func(int64) []*model.UserChannelIDPair); ok {
|
||||
r0 = rf(since)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(store.StoreChannel)
|
||||
r0 = ret.Get(0).([]*model.UserChannelIDPair)
|
||||
}
|
||||
}
|
||||
|
||||
return r0
|
||||
var r1 *model.AppError
|
||||
if rf, ok := ret.Get(1).(func(int64) *model.AppError); ok {
|
||||
r1 = rf(since)
|
||||
} else {
|
||||
if ret.Get(1) != nil {
|
||||
r1 = ret.Get(1).(*model.AppError)
|
||||
}
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// ChannelMembersToRemove provides a mock function with given fields:
|
||||
func (_m *GroupStore) ChannelMembersToRemove() store.StoreChannel {
|
||||
func (_m *GroupStore) ChannelMembersToRemove() ([]*model.ChannelMember, *model.AppError) {
|
||||
ret := _m.Called()
|
||||
|
||||
var r0 store.StoreChannel
|
||||
if rf, ok := ret.Get(0).(func() store.StoreChannel); ok {
|
||||
var r0 []*model.ChannelMember
|
||||
if rf, ok := ret.Get(0).(func() []*model.ChannelMember); ok {
|
||||
r0 = rf()
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(store.StoreChannel)
|
||||
r0 = ret.Get(0).([]*model.ChannelMember)
|
||||
}
|
||||
}
|
||||
|
||||
return r0
|
||||
var r1 *model.AppError
|
||||
if rf, ok := ret.Get(1).(func() *model.AppError); ok {
|
||||
r1 = rf()
|
||||
} else {
|
||||
if ret.Get(1) != nil {
|
||||
r1 = ret.Get(1).(*model.AppError)
|
||||
}
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// CountGroupsByChannel provides a mock function with given fields: channelId, opts
|
||||
@@ -350,35 +368,53 @@ func (_m *GroupStore) GetMemberUsersPage(groupID string, offset int, limit int)
|
||||
}
|
||||
|
||||
// TeamMembersToAdd provides a mock function with given fields: since
|
||||
func (_m *GroupStore) TeamMembersToAdd(since int64) store.StoreChannel {
|
||||
func (_m *GroupStore) TeamMembersToAdd(since int64) ([]*model.UserTeamIDPair, *model.AppError) {
|
||||
ret := _m.Called(since)
|
||||
|
||||
var r0 store.StoreChannel
|
||||
if rf, ok := ret.Get(0).(func(int64) store.StoreChannel); ok {
|
||||
var r0 []*model.UserTeamIDPair
|
||||
if rf, ok := ret.Get(0).(func(int64) []*model.UserTeamIDPair); ok {
|
||||
r0 = rf(since)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(store.StoreChannel)
|
||||
r0 = ret.Get(0).([]*model.UserTeamIDPair)
|
||||
}
|
||||
}
|
||||
|
||||
return r0
|
||||
var r1 *model.AppError
|
||||
if rf, ok := ret.Get(1).(func(int64) *model.AppError); ok {
|
||||
r1 = rf(since)
|
||||
} else {
|
||||
if ret.Get(1) != nil {
|
||||
r1 = ret.Get(1).(*model.AppError)
|
||||
}
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// TeamMembersToRemove provides a mock function with given fields:
|
||||
func (_m *GroupStore) TeamMembersToRemove() store.StoreChannel {
|
||||
func (_m *GroupStore) TeamMembersToRemove() ([]*model.TeamMember, *model.AppError) {
|
||||
ret := _m.Called()
|
||||
|
||||
var r0 store.StoreChannel
|
||||
if rf, ok := ret.Get(0).(func() store.StoreChannel); ok {
|
||||
var r0 []*model.TeamMember
|
||||
if rf, ok := ret.Get(0).(func() []*model.TeamMember); ok {
|
||||
r0 = rf()
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(store.StoreChannel)
|
||||
r0 = ret.Get(0).([]*model.TeamMember)
|
||||
}
|
||||
}
|
||||
|
||||
return r0
|
||||
var r1 *model.AppError
|
||||
if rf, ok := ret.Get(1).(func() *model.AppError); ok {
|
||||
r1 = rf()
|
||||
} else {
|
||||
if ret.Get(1) != nil {
|
||||
r1 = ret.Get(1).(*model.AppError)
|
||||
}
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// Update provides a mock function with given fields: group
|
||||
|
||||
Ссылка в новой задаче
Block a user