Mm 49496 Add state and jobs for preventing screened purchase attempts from retrying (#22188)
* make signup unavailable when screening is in progress
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
a68515b69a
Коммит
f713862041
@@ -230,6 +230,11 @@ func handleSignupAvailable(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
return
|
||||
}
|
||||
systemValue, err := c.App.Srv().Store().System().GetByName(model.SystemHostedPurchaseNeedsScreening)
|
||||
if err == nil && systemValue != nil {
|
||||
c.Err = model.NewAppError(where, "api.server.hosted_signup_unavailable.error", nil, "", http.StatusTooEarly)
|
||||
return
|
||||
}
|
||||
|
||||
ReturnStatusOK(w)
|
||||
}
|
||||
|
||||
@@ -191,6 +191,13 @@ func (ps *PlatformService) SaveLicense(licenseBytes []byte) (*model.License, *mo
|
||||
ps.RemoveLicense()
|
||||
return nil, model.NewAppError("addLicense", "api.license.add_license.save_active.app_error", nil, "", http.StatusInternalServerError)
|
||||
}
|
||||
// only on prem licenses set this in the first place
|
||||
if !license.IsCloud() {
|
||||
_, err := ps.Store.System().PermanentDeleteByName(model.SystemHostedPurchaseNeedsScreening)
|
||||
if err != nil {
|
||||
ps.logger.Warn(fmt.Sprintf("Failed to remove %s system store key", model.SystemHostedPurchaseNeedsScreening))
|
||||
}
|
||||
}
|
||||
|
||||
ps.ReloadConfig()
|
||||
ps.InvalidateAllCaches()
|
||||
|
||||
@@ -41,6 +41,7 @@ import (
|
||||
"github.com/mattermost/mattermost-server/v6/jobs/export_delete"
|
||||
"github.com/mattermost/mattermost-server/v6/jobs/export_process"
|
||||
"github.com/mattermost/mattermost-server/v6/jobs/extract_content"
|
||||
"github.com/mattermost/mattermost-server/v6/jobs/hosted_purchase_screening"
|
||||
"github.com/mattermost/mattermost-server/v6/jobs/import_delete"
|
||||
"github.com/mattermost/mattermost-server/v6/jobs/import_process"
|
||||
"github.com/mattermost/mattermost-server/v6/jobs/last_accessible_file"
|
||||
@@ -1542,6 +1543,12 @@ func (s *Server) initJobs() {
|
||||
notify_admin.MakeScheduler(s.Jobs, s.License(), model.JobTypeTrialNotifyAdmin),
|
||||
)
|
||||
|
||||
s.Jobs.RegisterJobType(
|
||||
model.JobTypeHostedPurchaseScreening,
|
||||
hosted_purchase_screening.MakeWorker(s.Jobs, s.License(), s.Store().System()),
|
||||
hosted_purchase_screening.MakeScheduler(s.Jobs, s.License()),
|
||||
)
|
||||
|
||||
s.platform.Jobs = s.Jobs
|
||||
}
|
||||
|
||||
|
||||
20
jobs/hosted_purchase_screening/scheduler.go
Обычный файл
20
jobs/hosted_purchase_screening/scheduler.go
Обычный файл
@@ -0,0 +1,20 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
package hosted_purchase_screening
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/mattermost/mattermost-server/v6/jobs"
|
||||
"github.com/mattermost/mattermost-server/v6/model"
|
||||
)
|
||||
|
||||
const schedFreq = 24 * time.Hour
|
||||
|
||||
func MakeScheduler(jobServer *jobs.JobServer, license *model.License) model.Scheduler {
|
||||
isEnabled := func(cfg *model.Config) bool {
|
||||
return model.BuildEnterpriseReady == "true" && license == nil
|
||||
}
|
||||
return jobs.NewPeriodicScheduler(jobServer, model.JobTypeHostedPurchaseScreening, schedFreq, isEnabled)
|
||||
}
|
||||
49
jobs/hosted_purchase_screening/worker.go
Обычный файл
49
jobs/hosted_purchase_screening/worker.go
Обычный файл
@@ -0,0 +1,49 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
package hosted_purchase_screening
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/mattermost/mattermost-server/v6/jobs"
|
||||
"github.com/mattermost/mattermost-server/v6/model"
|
||||
)
|
||||
|
||||
const (
|
||||
JobName = "HostedPurchaseScreening"
|
||||
// 3 days matches the expecation given in portal purchase flow.
|
||||
waitForScreeningDuration = 3 * 24 * time.Hour
|
||||
)
|
||||
|
||||
type ScreenTimeStore interface {
|
||||
GetByName(string) (*model.System, error)
|
||||
PermanentDeleteByName(name string) (*model.System, error)
|
||||
}
|
||||
|
||||
func MakeWorker(jobServer *jobs.JobServer, license *model.License, screenTimeStore ScreenTimeStore) model.Worker {
|
||||
isEnabled := func(_ *model.Config) bool {
|
||||
return !license.IsCloud()
|
||||
}
|
||||
execute := func(job *model.Job) error {
|
||||
defer jobServer.HandleJobPanic(job)
|
||||
|
||||
now := time.Now()
|
||||
screenTimeValue, err := screenTimeStore.GetByName(model.SystemHostedPurchaseNeedsScreening)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
screenTime, err := strconv.ParseInt(screenTimeValue.Value, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if now.After(time.UnixMilli(screenTime).Add(waitForScreeningDuration)) {
|
||||
screenTimeStore.PermanentDeleteByName(model.SystemHostedPurchaseNeedsScreening)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
worker := jobs.NewSimpleWorker(JobName, jobServer, execute, isEnabled)
|
||||
return worker
|
||||
}
|
||||
@@ -31,6 +31,7 @@ const (
|
||||
JobTypeLastAccessibleFile = "last_accessible_file"
|
||||
JobTypeUpgradeNotifyAdmin = "upgrade_notify_admin"
|
||||
JobTypeTrialNotifyAdmin = "trial_notify_admin"
|
||||
JobTypeHostedPurchaseScreening = "hosted_purchase_screening"
|
||||
|
||||
JobStatusPending = "pending"
|
||||
JobStatusInProgress = "in_progress"
|
||||
|
||||
@@ -33,6 +33,7 @@ const (
|
||||
SystemFirstAdminSetupComplete = "FirstAdminSetupComplete"
|
||||
SystemLastAccessiblePostTime = "LastAccessiblePostTime"
|
||||
SystemLastAccessibleFileTime = "LastAccessibleFileTime"
|
||||
SystemHostedPurchaseNeedsScreening = "HostedPurchaseNeedsScreening"
|
||||
AwsMeteringReportInterval = 1
|
||||
AwsMeteringDimensionUsageHrs = "UsageHrs"
|
||||
)
|
||||
|
||||
Ссылка в новой задаче
Block a user