[MM-41573] - Remove FF for MM-39060 Resend Invite Interval (#19652)

* [MM-41573] - Remove FF for MM-39060 Resend Invite Interval

* feedback impl
Этот коммит содержится в:
Allan Guwatudde
2022-03-09 17:57:25 +03:00
коммит произвёл GitHub
родитель 20a0178dcb
Коммит d543db6186
3 изменённых файлов: 28 добавлений и 106 удалений

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

@@ -1311,28 +1311,6 @@ func inviteUsersToTeam(c *Context, w http.ResponseWriter, r *http.Request) {
} }
} }
// we get the emailList after it has finished checks like the emails over the list
scheduledAt := model.GetMillis()
jobData := map[string]string{
"emailList": model.ArrayToJSON(emailList),
"teamID": c.Params.TeamId,
"senderID": c.AppContext.Session().UserId,
"scheduledAt": strconv.FormatInt(scheduledAt, 10),
}
// we then manually schedule the job
j, e := c.App.Srv().Jobs.CreateJob(model.JobTypeResendInvitationEmail, jobData)
if e != nil {
c.Err = model.NewAppError("Api4.inviteUsersToTeam", e.Id, nil, e.Error(), e.StatusCode)
return
}
sysVar := &model.System{Name: j.Id, Value: "0"}
if sysValErr := c.App.Srv().Store.System().SaveOrUpdate(sysVar); sysValErr != nil {
mlog.Warn("Error while saving system value", mlog.Err(sysValErr))
}
var invitesWithError []*model.EmailInviteWithError var invitesWithError []*model.EmailInviteWithError
var err *model.AppError var err *model.AppError
if emailList != nil { if emailList != nil {
@@ -1356,6 +1334,23 @@ func inviteUsersToTeam(c *Context, w http.ResponseWriter, r *http.Request) {
c.Err = err c.Err = err
return return
} }
// we get the emailList after it has finished checks like the emails over the list
scheduledAt := model.GetMillis()
jobData := map[string]string{
"emailList": model.ArrayToJSON(emailList),
"teamID": c.Params.TeamId,
"senderID": c.AppContext.Session().UserId,
"scheduledAt": strconv.FormatInt(scheduledAt, 10),
}
// we then manually schedule the job to send another invite after 48 hours
_, e := c.App.Srv().Jobs.CreateJob(model.JobTypeResendInvitationEmail, jobData)
if e != nil {
c.Err = model.NewAppError("Api4.inviteUsersToTeam", e.Id, nil, e.Error(), e.StatusCode)
return
}
// in graceful mode we return both the successful ones and the failed ones // in graceful mode we return both the successful ones and the failed ones
js, jsonErr := json.Marshal(invitesWithError) js, jsonErr := json.Marshal(invitesWithError)
if jsonErr != nil { if jsonErr != nil {

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

@@ -16,9 +16,7 @@ import (
"github.com/mattermost/mattermost-server/v6/store" "github.com/mattermost/mattermost-server/v6/store"
) )
const TwentyFourHoursInMillis int64 = 86400000
const FourtyEightHoursInMillis int64 = 172800000 const FourtyEightHoursInMillis int64 = 172800000
const SeventyTwoHoursInMillis int64 = 259200000
type AppIface interface { type AppIface interface {
configservice.ConfigService configservice.ConfigService
@@ -87,52 +85,9 @@ func (rseworker *ResendInvitationEmailWorker) JobChannel() chan<- model.Job {
} }
func (rseworker *ResendInvitationEmailWorker) DoJob(job *model.Job) { func (rseworker *ResendInvitationEmailWorker) DoJob(job *model.Job) {
resendInviteEmailIntervalFlag := rseworker.app.Config().FeatureFlags.ResendInviteEmailInterval elapsedTimeSinceSchedule, DurationInMillis := rseworker.GetDurations(job)
if elapsedTimeSinceSchedule > DurationInMillis {
switch resendInviteEmailIntervalFlag { rseworker.ResendEmails(job, "48")
case "48":
rseworker.DoJob_24_48(job)
case "72":
rseworker.DoJob_24_72(job)
default:
rseworker.DoJob_24(job)
}
}
func (rseworker *ResendInvitationEmailWorker) DoJob_24(job *model.Job) {
elapsedTimeSinceSchedule, DurationInMillis_24, _, _ := rseworker.GetDurations(job)
if elapsedTimeSinceSchedule > DurationInMillis_24 {
rseworker.ResendEmails(job, "24")
rseworker.TearDown(job)
}
}
func (rseworker *ResendInvitationEmailWorker) DoJob_24_48(job *model.Job) {
elapsedTimeSinceSchedule, DurationInMillis_24, DurationInMillis_48, _ := rseworker.GetDurations(job)
rseworker.Execute(job, elapsedTimeSinceSchedule, DurationInMillis_24, DurationInMillis_48, "24", "48")
}
func (rseworker *ResendInvitationEmailWorker) DoJob_24_72(job *model.Job) {
elapsedTimeSinceSchedule, DurationInMillis_24, _, DurationInMillis_72 := rseworker.GetDurations(job)
rseworker.Execute(job, elapsedTimeSinceSchedule, DurationInMillis_24, DurationInMillis_72, "24", "72")
}
func (rseworker *ResendInvitationEmailWorker) Execute(job *model.Job, elapsedTimeSinceSchedule, firstDuration, secondDuration int64, firstDurationTelemetryValue, secondDurationTelemetryValue string) {
systemValue, sysValErr := rseworker.store.System().GetByName(job.Id)
if sysValErr != nil {
if _, ok := sysValErr.(*store.ErrNotFound); !ok {
mlog.Error("An error occurred while getting NUMBER_OF_INVITE_EMAILS_SENT from system store", mlog.String("worker", rseworker.name), mlog.Err(sysValErr))
// system value information is critical and if it was not set for this job at creation, we want to cancel the job all together.
rseworker.setJobCancelled(job)
return
}
}
if (elapsedTimeSinceSchedule > firstDuration) && (systemValue == nil || systemValue.Value == "0") {
rseworker.ResendEmails(job, firstDurationTelemetryValue)
rseworker.setNumResendEmailSent(job, "1")
} else if elapsedTimeSinceSchedule > secondDuration {
rseworker.ResendEmails(job, secondDurationTelemetryValue)
rseworker.TearDown(job) rseworker.TearDown(job)
} }
} }
@@ -144,13 +99,6 @@ func (rseworker *ResendInvitationEmailWorker) setJobSuccess(job *model.Job) {
} }
} }
func (rseworker *ResendInvitationEmailWorker) setJobCancelled(job *model.Job) {
if err := rseworker.jobServer.SetJobCanceled(job); err != nil {
mlog.Error("Worker: Failed to cancel job", mlog.String("worker", rseworker.name), mlog.String("job_id", job.Id), mlog.String("error", err.Error()))
rseworker.setJobError(job, err)
}
}
func (rseworker *ResendInvitationEmailWorker) setJobError(job *model.Job, appError *model.AppError) { func (rseworker *ResendInvitationEmailWorker) setJobError(job *model.Job, appError *model.AppError) {
if err := rseworker.jobServer.SetJobError(job, appError); err != nil { if err := rseworker.jobServer.SetJobError(job, appError); err != nil {
mlog.Error("Worker: Failed to set job error", mlog.String("worker", rseworker.name), mlog.String("job_id", job.Id), mlog.String("error", err.Error())) mlog.Error("Worker: Failed to set job error", mlog.String("worker", rseworker.name), mlog.String("job_id", job.Id), mlog.String("error", err.Error()))
@@ -188,41 +136,20 @@ func (rseworker *ResendInvitationEmailWorker) removeAlreadyJoined(teamID string,
return notJoinedYet return notJoinedYet
} }
func (rseworker *ResendInvitationEmailWorker) setNumResendEmailSent(job *model.Job, num string) { func (rseworker *ResendInvitationEmailWorker) GetDurations(job *model.Job) (int64, int64) {
sysVar := &model.System{Name: job.Id, Value: num}
if err := rseworker.store.System().SaveOrUpdate(sysVar); err != nil {
mlog.Error("Unable to save NUMBER_OF_INVITE_EMAIL_SENT", mlog.String("worker", rseworker.name), mlog.Err(err))
}
}
func (rseworker *ResendInvitationEmailWorker) GetDurations(job *model.Job) (int64, int64, int64, int64) {
scheduledAt, _ := strconv.ParseInt(job.Data["scheduledAt"], 10, 64) scheduledAt, _ := strconv.ParseInt(job.Data["scheduledAt"], 10, 64)
now := model.GetMillis() now := model.GetMillis()
elapsedTimeSinceSchedule := now - scheduledAt elapsedTimeSinceSchedule := now - scheduledAt
duration_24 := os.Getenv("MM_RESEND_INVITATION_EMAIL_JOB_DURATION") duration := os.Getenv("MM_RESEND_INVITATION_EMAIL_JOB_DURATION")
DurationInMillis_24, parseError := strconv.ParseInt(duration_24, 10, 64) DurationInMillis, parseError := strconv.ParseInt(duration, 10, 64)
if parseError != nil {
// default to 24 hours
DurationInMillis_24 = TwentyFourHoursInMillis
}
duration_48 := os.Getenv("MM_RESEND_INVITATION_EMAIL_JOB_DURATION_48")
DurationInMillis_48, parseError := strconv.ParseInt(duration_48, 10, 64)
if parseError != nil { if parseError != nil {
// default to 48 hours // default to 48 hours
DurationInMillis_48 = FourtyEightHoursInMillis DurationInMillis = FourtyEightHoursInMillis
} }
duration_72 := os.Getenv("MM_RESEND_INVITATION_EMAIL_JOB_DURATION_72") return elapsedTimeSinceSchedule, DurationInMillis
DurationInMillis_72, parseError := strconv.ParseInt(duration_72, 10, 64)
if parseError != nil {
// default to 72 hours
DurationInMillis_72 = SeventyTwoHoursInMillis
}
return elapsedTimeSinceSchedule, DurationInMillis_24, DurationInMillis_48, DurationInMillis_72
} }

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

@@ -53,8 +53,8 @@ type FeatureFlags struct {
// A/B test for the add members to channel button, possible values = ("top", "bottom") // A/B test for the add members to channel button, possible values = ("top", "bottom")
AddMembersToChannel string AddMembersToChannel string
// Determine after which duration in hours to send a second invitation to someone that didn't join after the initial invite, possible values = ("48", "72") // Enable Create First Channel
ResendInviteEmailInterval string GuidedChannelCreation bool
// A/B test for whether radio buttons or toggle button is more effective in in-screen invite to team modal ("none", "toggle") // A/B test for whether radio buttons or toggle button is more effective in in-screen invite to team modal ("none", "toggle")
InviteToTeam string InviteToTeam string
@@ -97,7 +97,7 @@ func (f *FeatureFlags) SetDefaults() {
f.CallsMobile = false f.CallsMobile = false
f.BoardsFeatureFlags = "" f.BoardsFeatureFlags = ""
f.AddMembersToChannel = "top" f.AddMembersToChannel = "top"
f.ResendInviteEmailInterval = "" f.GuidedChannelCreation = false
f.InviteToTeam = "none" f.InviteToTeam = "none"
f.CustomGroups = true f.CustomGroups = true
f.InlinePostEditing = false f.InlinePostEditing = false