MM-25040: Restrict associated groups to channels when team is group-constrained. (#14619)
* MM-25040: Only return team-associated groups if the team is group-constrained. MM-25040: Prevents associating a group to a channel if the team doesn't have the group first. * MM-25040: Fix lints. * MM-25040: Still add the groupteam if the team is not group-constrained. * MM-25040: Wraps groupteam upsert in else branch for efficiency. * MM-25040: Removes unnecessary page iteration. * MM-25040: Fix typo. * MM-25040: Moves filtering to SQL. * MM-25040: Updates tests, check pagination. * MM-25040: Fix lint error. * MM-25040: Adds some more group store tests. * MM-25040: Fix for wrong test parameter.
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
c9cdeba1a7
Коммит
c529d5190a
@@ -1216,6 +1216,27 @@ func (s *SqlGroupStore) GetGroups(page, perPage int, opts model.GroupSearchOpts)
|
||||
`, opts.NotAssociatedToChannel)
|
||||
}
|
||||
|
||||
if opts.FilterParentTeamPermitted && len(opts.NotAssociatedToChannel) == 26 {
|
||||
groupsQuery = groupsQuery.Where(`
|
||||
g.Id IN (
|
||||
SELECT
|
||||
GroupId
|
||||
FROM
|
||||
GroupTeams
|
||||
WHERE
|
||||
GroupTeams.DeleteAt = 0
|
||||
AND GroupTeams.TeamId = (
|
||||
SELECT
|
||||
TeamId
|
||||
FROM
|
||||
Channels
|
||||
WHERE
|
||||
Id = ?
|
||||
)
|
||||
)
|
||||
`, opts.NotAssociatedToChannel)
|
||||
}
|
||||
|
||||
queryString, args, err := groupsQuery.ToSql()
|
||||
if err != nil {
|
||||
return nil, model.NewAppError("SqlGroupStore.GetGroups", "store.sql_group.app_error", nil, err.Error(), http.StatusInternalServerError)
|
||||
|
||||
@@ -2994,14 +2994,15 @@ func testGetGroupsByTeam(t *testing.T, ss store.Store) {
|
||||
func testGetGroups(t *testing.T, ss store.Store) {
|
||||
// Create Team1
|
||||
team1 := &model.Team{
|
||||
DisplayName: "Team1",
|
||||
Description: model.NewId(),
|
||||
CompanyName: model.NewId(),
|
||||
AllowOpenInvite: false,
|
||||
InviteId: model.NewId(),
|
||||
Name: "zz" + model.NewId(),
|
||||
Email: "success+" + model.NewId() + "@simulator.amazonses.com",
|
||||
Type: model.TEAM_OPEN,
|
||||
DisplayName: "Team1",
|
||||
Description: model.NewId(),
|
||||
CompanyName: model.NewId(),
|
||||
AllowOpenInvite: false,
|
||||
InviteId: model.NewId(),
|
||||
Name: "zz" + model.NewId(),
|
||||
Email: "success+" + model.NewId() + "@simulator.amazonses.com",
|
||||
Type: model.TEAM_OPEN,
|
||||
GroupConstrained: model.NewBool(true),
|
||||
}
|
||||
team1, err := ss.Team().Save(team1)
|
||||
require.Nil(t, err)
|
||||
@@ -3082,6 +3083,16 @@ func testGetGroups(t *testing.T, ss store.Store) {
|
||||
channel2, nErr = ss.Channel().Save(channel2, 9999)
|
||||
require.Nil(t, nErr)
|
||||
|
||||
// Create Channel3
|
||||
channel3 := &model.Channel{
|
||||
TeamId: team1.Id,
|
||||
DisplayName: "Channel3",
|
||||
Name: model.NewId(),
|
||||
Type: model.CHANNEL_PRIVATE,
|
||||
}
|
||||
channel3, nErr = ss.Channel().Save(channel3, 9999)
|
||||
require.Nil(t, nErr)
|
||||
|
||||
// Create Group3
|
||||
group3, err := ss.Group().Create(&model.Group{
|
||||
Name: model.NewString(model.NewId() + "-group-3"),
|
||||
@@ -3335,6 +3346,33 @@ func testGetGroups(t *testing.T, ss store.Store) {
|
||||
return len(groups) == 0
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "Filter groups from group-constrained teams",
|
||||
Opts: model.GroupSearchOpts{NotAssociatedToChannel: channel3.Id, FilterParentTeamPermitted: true},
|
||||
Page: 0,
|
||||
PerPage: 100,
|
||||
Resultf: func(groups []*model.Group) bool {
|
||||
return len(groups) == 2 && groups[0].Id == group1.Id && groups[1].Id == group2.Id
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "Filter groups from group-constrained page 0",
|
||||
Opts: model.GroupSearchOpts{NotAssociatedToChannel: channel3.Id, FilterParentTeamPermitted: true},
|
||||
Page: 0,
|
||||
PerPage: 1,
|
||||
Resultf: func(groups []*model.Group) bool {
|
||||
return groups[0].Id == group1.Id
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "Filter groups from group-constrained page 1",
|
||||
Opts: model.GroupSearchOpts{NotAssociatedToChannel: channel3.Id, FilterParentTeamPermitted: true},
|
||||
Page: 1,
|
||||
PerPage: 1,
|
||||
Resultf: func(groups []*model.Group) bool {
|
||||
return groups[0].Id == group2.Id
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
|
||||
Ссылка в новой задаче
Block a user