2020-10-24 10:24:05 +00:00
|
|
|
package cron
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2020-10-24 18:30:28 +00:00
|
|
|
|
2020-12-30 22:57:23 +00:00
|
|
|
"github.com/tribalwarshelp/shared/models"
|
2020-10-24 18:30:28 +00:00
|
|
|
"github.com/tribalwarshelp/shared/utils"
|
2020-10-24 10:24:05 +00:00
|
|
|
|
|
|
|
"github.com/go-pg/pg/v10"
|
|
|
|
"github.com/robfig/cron/v3"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
|
|
)
|
|
|
|
|
|
|
|
var log = logrus.WithField("package", "cron")
|
|
|
|
|
|
|
|
type Config struct {
|
|
|
|
DB *pg.DB
|
|
|
|
MaxConcurrentWorkers int
|
2020-12-23 16:52:04 +00:00
|
|
|
RunOnStartup bool
|
2020-10-24 10:24:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func Attach(c *cron.Cron, cfg Config) error {
|
|
|
|
if cfg.DB == nil {
|
2020-12-30 22:57:23 +00:00
|
|
|
return fmt.Errorf("cfg.DB cannot be nil, expected *pg.DB")
|
2020-10-24 10:24:05 +00:00
|
|
|
}
|
|
|
|
|
2020-12-31 00:45:10 +00:00
|
|
|
h := &handler{db: cfg.DB, maxConcurrentWorkers: cfg.MaxConcurrentWorkers}
|
2020-10-24 10:24:05 +00:00
|
|
|
if err := h.init(); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2020-12-30 22:57:23 +00:00
|
|
|
versions := []*models.Version{}
|
|
|
|
if err := cfg.DB.Model(&versions).Select(); err != nil {
|
2020-10-24 10:24:05 +00:00
|
|
|
return err
|
|
|
|
}
|
2020-12-30 22:57:23 +00:00
|
|
|
|
|
|
|
updateServerData := utils.TrackExecutionTime(log, h.updateServerData, "updateServerData")
|
|
|
|
vacuumDatabase := utils.TrackExecutionTime(log, h.vacuumDatabase, "vacuumDatabase")
|
|
|
|
updateHistoryFuncs := []func(){}
|
|
|
|
updateStatsFuncs := []func(){}
|
|
|
|
for _, version := range versions {
|
|
|
|
updateHistory := utils.TrackExecutionTime(log,
|
|
|
|
createFnWithTimezone(version.Timezone, h.updateHistory),
|
|
|
|
fmt.Sprintf("%s: updateHistory", version.Timezone))
|
|
|
|
updateHistoryFuncs = append(updateHistoryFuncs, updateHistory)
|
|
|
|
|
|
|
|
updateStats := utils.TrackExecutionTime(log,
|
|
|
|
createFnWithTimezone(version.Timezone, h.updateStats),
|
|
|
|
fmt.Sprintf("%s: updateStats", version.Timezone))
|
|
|
|
updateStatsFuncs = append(updateStatsFuncs, updateStats)
|
|
|
|
|
|
|
|
if _, err := c.AddFunc(fmt.Sprintf("CRON_TZ=%s 30 1 * * *", version.Timezone), updateHistory); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if _, err := c.AddFunc(fmt.Sprintf("CRON_TZ=%s 45 1 * * *", version.Timezone), updateStats); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2020-10-24 10:24:05 +00:00
|
|
|
}
|
2020-12-30 22:57:23 +00:00
|
|
|
if _, err := c.AddFunc("0 * * * *", updateServerData); err != nil {
|
2020-10-24 10:24:05 +00:00
|
|
|
return err
|
|
|
|
}
|
2020-12-30 22:57:23 +00:00
|
|
|
if _, err := c.AddFunc("20 1 * * *", vacuumDatabase); err != nil {
|
2020-10-24 10:24:05 +00:00
|
|
|
return err
|
|
|
|
}
|
2020-12-23 16:52:04 +00:00
|
|
|
if cfg.RunOnStartup {
|
|
|
|
go func() {
|
|
|
|
updateServerData()
|
|
|
|
vacuumDatabase()
|
2020-12-30 22:57:23 +00:00
|
|
|
for _, fn := range updateHistoryFuncs {
|
|
|
|
fn()
|
|
|
|
}
|
|
|
|
for _, fn := range updateStatsFuncs {
|
|
|
|
fn()
|
|
|
|
}
|
2020-12-23 16:52:04 +00:00
|
|
|
}()
|
|
|
|
}
|
2020-10-24 10:24:05 +00:00
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|