[MM-44307] On Limits Change, archive or restore teams according to the limits (#20247)
Automatic Merge
Этот коммит содержится в:
101
app/team.go
101
app/team.go
@@ -14,6 +14,7 @@ import (
|
||||
"mime/multipart"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"github.com/mattermost/mattermost-server/v6/app/email"
|
||||
@@ -29,6 +30,106 @@ import (
|
||||
"github.com/mattermost/mattermost-server/v6/store/sqlstore"
|
||||
)
|
||||
|
||||
func (a *App) AdjustTeamsFromProductLimits(teamLimits *model.TeamsLimits) *model.AppError {
|
||||
maxActiveTeams := *teamLimits.Active
|
||||
teams, appErr := a.GetAllTeams()
|
||||
if appErr != nil {
|
||||
return appErr
|
||||
}
|
||||
|
||||
if teams == nil {
|
||||
return nil
|
||||
}
|
||||
// Sort the list of teams based on their creation date
|
||||
sort.Slice(teams, func(i, j int) bool {
|
||||
return teams[i].CreateAt < teams[j].CreateAt
|
||||
})
|
||||
|
||||
var activeTeams []*model.Team
|
||||
var cloudArchivedTeams []*model.Team
|
||||
for _, team := range teams {
|
||||
if team.DeleteAt == 0 {
|
||||
activeTeams = append(activeTeams, team)
|
||||
}
|
||||
if team.DeleteAt > 0 && team.CloudLimitsArchived {
|
||||
cloudArchivedTeams = append(cloudArchivedTeams, team)
|
||||
}
|
||||
}
|
||||
|
||||
if len(activeTeams) > maxActiveTeams {
|
||||
// If there are more active teams than allowed, we must archive them
|
||||
// Remove the first n elements (where n is the allowed number of teams) so they aren't archived
|
||||
|
||||
teamsToArchive := activeTeams[maxActiveTeams:]
|
||||
|
||||
for _, team := range teamsToArchive {
|
||||
cloudLimitsArchived := true
|
||||
// Archive the remainder
|
||||
patch := model.TeamPatch{CloudLimitsArchived: &cloudLimitsArchived}
|
||||
_, err := a.PatchTeam(team.Id, &patch)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = a.SoftDeleteTeam(team.Id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
} else if len(activeTeams) < maxActiveTeams && len(cloudArchivedTeams) > 0 {
|
||||
// If the number of activeTeams is less than the allowed limit, and there are some cloudArchivedTeams, we can restore these cloudArchivedTeams
|
||||
activeTeamsBeforeLimit := maxActiveTeams - len(activeTeams)
|
||||
teamsToRestore := cloudArchivedTeams
|
||||
// If the number of active teams remaining before the limit is hit is fewer than the number of cloudArchivedTeams, trim the list (still according to CreateAt)
|
||||
// Otherwise, we can restore all of the cloudArchivedTeams without hitting the limit, so don't filter the list
|
||||
if activeTeamsBeforeLimit < len(cloudArchivedTeams) {
|
||||
teamsToRestore = cloudArchivedTeams[:(activeTeamsBeforeLimit)]
|
||||
}
|
||||
|
||||
cloudLimitsArchived := false
|
||||
patch := &model.TeamPatch{CloudLimitsArchived: &cloudLimitsArchived}
|
||||
for _, team := range teamsToRestore {
|
||||
err := a.RestoreTeam(team.Id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = a.PatchTeam(team.Id, patch)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (a *App) SoftDeleteAllTeamsExcept(teamID string) *model.AppError {
|
||||
teams, appErr := a.GetAllTeams()
|
||||
if appErr != nil {
|
||||
return appErr
|
||||
}
|
||||
|
||||
if teams == nil {
|
||||
return nil
|
||||
}
|
||||
cloudLimitsArchived := true
|
||||
patch := &model.TeamPatch{CloudLimitsArchived: &cloudLimitsArchived}
|
||||
for _, team := range teams {
|
||||
if team.Id != teamID {
|
||||
_, err := a.PatchTeam(team.Id, patch)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = a.SoftDeleteTeam(team.Id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (a *App) CreateTeam(c *request.Context, team *model.Team) (*model.Team, *model.AppError) {
|
||||
rteam, err := a.ch.srv.teamService.CreateTeam(team)
|
||||
if err != nil {
|
||||
|
||||
Ссылка в новой задаче
Block a user