[MM-36198] - Activating a user in System Console does not respect cloud user limits (#17719)

* [MM-36198] - Activating a user in System Console does not respect cloud user limits

* feedback impl

* improve error check
Этот коммит содержится в:
Allan Guwatudde
2021-06-07 17:38:33 +03:00
коммит произвёл GitHub
родитель a2700684f1
Коммит 5ce5ea93f4
7 изменённых файлов: 157 добавлений и 21 удалений

Просмотреть файл

@@ -428,6 +428,7 @@ type AppIface interface {
ChannelMembersToRemove(teamID *string) ([]*model.ChannelMember, *model.AppError)
CheckAndSendUserLimitWarningEmails(c *request.Context) *model.AppError
CheckCanInviteToSharedChannel(channelId string) error
CheckCloudAccountAtLimit() (bool, *model.AppError)
CheckForClientSideCert(r *http.Request) (string, string, string)
CheckIntegrity() <-chan model.IntegrityCheckResult
CheckMandatoryS3Fields(settings *model.FileSettings) *model.AppError
@@ -734,6 +735,7 @@ type AppIface interface {
GetStatus(userID string) (*model.Status, *model.AppError)
GetStatusFromCache(userID string) *model.Status
GetStatusesByIds(userIDs []string) (map[string]interface{}, *model.AppError)
GetSubscriptionStats() (*model.SubscriptionStats, *model.AppError)
GetTeam(teamID string) (*model.Team, *model.AppError)
GetTeamByInviteId(inviteId string) (*model.Team, *model.AppError)
GetTeamByName(name string) (*model.Team, *model.AppError)

Просмотреть файл

@@ -79,6 +79,52 @@ func (a *App) SendAdminUpgradeRequestEmail(username string, subscription *model.
return nil
}
func (a *App) GetSubscriptionStats() (*model.SubscriptionStats, *model.AppError) {
if a.Srv().License() == nil || !*a.Srv().License().Features.Cloud {
return nil, model.NewAppError("app.GetSubscriptionStats", "api.cloud.license_error", nil, "", http.StatusInternalServerError)
}
subscription, appErr := a.Cloud().GetSubscription("")
if appErr != nil {
return nil, model.NewAppError("app.GetSubscriptionStats", "api.cloud.request_error", nil, appErr.Error(), http.StatusInternalServerError)
}
count, err := a.Srv().Store.User().Count(model.UserCountOptions{})
if err != nil {
return nil, model.NewAppError("app.GetSubscriptionStats", "app.user.get_total_users_count.app_error", nil, err.Error(), http.StatusInternalServerError)
}
cloudUserLimit := *a.Config().ExperimentalSettings.CloudUserLimit
s := cloudUserLimit - count
return &model.SubscriptionStats{
RemainingSeats: int(s),
IsPaidTier: subscription.IsPaidTier,
}, nil
}
func (a *App) CheckCloudAccountAtLimit() (bool, *model.AppError) {
if a.Srv().License() == nil || (a.Srv().License() != nil && !*a.Srv().License().Features.Cloud) {
// Not cloud instance, so no at limit checks
return false, nil
}
stats, err := a.GetSubscriptionStats()
if err != nil {
return false, err
}
if stats.IsPaidTier == "true" {
return false, nil
}
if stats.RemainingSeats < 1 {
return true, nil
}
return false, nil
}
func (a *App) CheckAndSendUserLimitWarningEmails(c *request.Context) *model.AppError {
if a.Srv().License() == nil || (a.Srv().License() != nil && !*a.Srv().License().Features.Cloud) {
// Not cloud instance, do nothing

Просмотреть файл

@@ -1134,6 +1134,28 @@ func (a *OpenTracingAppLayer) CheckCanInviteToSharedChannel(channelId string) er
return resultVar0
}
func (a *OpenTracingAppLayer) CheckCloudAccountAtLimit() (bool, *model.AppError) {
origCtx := a.ctx
span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.CheckCloudAccountAtLimit")
a.ctx = newCtx
a.app.Srv().Store.SetContext(newCtx)
defer func() {
a.app.Srv().Store.SetContext(origCtx)
a.ctx = origCtx
}()
defer span.Finish()
resultVar0, resultVar1 := a.app.CheckCloudAccountAtLimit()
if resultVar1 != nil {
span.LogFields(spanlog.Error(resultVar1))
ext.Error.Set(span, true)
}
return resultVar0, resultVar1
}
func (a *OpenTracingAppLayer) CheckForClientSideCert(r *http.Request) (string, string, string) {
origCtx := a.ctx
span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.CheckForClientSideCert")
@@ -8748,6 +8770,28 @@ func (a *OpenTracingAppLayer) GetStatusesByIds(userIDs []string) (map[string]int
return resultVar0, resultVar1
}
func (a *OpenTracingAppLayer) GetSubscriptionStats() (*model.SubscriptionStats, *model.AppError) {
origCtx := a.ctx
span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.GetSubscriptionStats")
a.ctx = newCtx
a.app.Srv().Store.SetContext(newCtx)
defer func() {
a.app.Srv().Store.SetContext(origCtx)
a.ctx = origCtx
}()
defer span.Finish()
resultVar0, resultVar1 := a.app.GetSubscriptionStats()
if resultVar1 != nil {
span.LogFields(spanlog.Error(resultVar1))
ext.Error.Set(span, true)
}
return resultVar0, resultVar1
}
func (a *OpenTracingAppLayer) GetSuggestions(c *request.Context, commandArgs *model.CommandArgs, commands []*model.Command, roleID string) []model.AutocompleteSuggestion {
origCtx := a.ctx
span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.GetSuggestions")