100 lines
2.8 KiB
Go
100 lines
2.8 KiB
Go
package queue
|
|
|
|
import (
|
|
"github.com/go-pg/pg/v10"
|
|
"github.com/pkg/errors"
|
|
"github.com/tribalwarshelp/shared/tw/twmodel"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
day = 24 * time.Hour
|
|
)
|
|
|
|
type taskVacuumServerData struct {
|
|
*task
|
|
}
|
|
|
|
func (t *taskVacuumServerData) execute(server *twmodel.Server) error {
|
|
if err := t.validatePayload(server); err != nil {
|
|
log.Debug(errors.Wrap(err, "taskVacuumServerData.execute"))
|
|
return nil
|
|
}
|
|
entry := log.WithField("key", server.Key)
|
|
entry.Infof("taskVacuumServerData.execute: %s: Vacumming the database...", server.Key)
|
|
err := (&workerVacuumServerDB{
|
|
db: t.db.WithParam("SERVER", pg.Safe(server.Key)),
|
|
server: server,
|
|
}).vacuum()
|
|
if err != nil {
|
|
err = errors.Wrap(err, "taskVacuumServerData.execute")
|
|
entry.Error(err)
|
|
return err
|
|
}
|
|
entry.Infof("taskVacuumServerData.execute: %s: The database has been vacummed", server.Key)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (t *taskVacuumServerData) validatePayload(server *twmodel.Server) error {
|
|
if server == nil {
|
|
return errors.New("expected *twmodel.Server, got nil")
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
type workerVacuumServerDB struct {
|
|
db *pg.DB
|
|
server *twmodel.Server
|
|
}
|
|
|
|
func (w *workerVacuumServerDB) vacuum() error {
|
|
tx, err := w.db.Begin()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer func(s *twmodel.Server) {
|
|
if err := tx.Close(); err != nil {
|
|
log.Warn(errors.Wrapf(err, "%s: Couldn't rollback the transaction", s.Key))
|
|
}
|
|
}(w.server)
|
|
|
|
withNonExistentPlayers := w.db.Model(&twmodel.Player{}).Column("id").Where("exists = false and NOW() - deleted_at > '14 days'")
|
|
withNonExistentTribes := w.db.Model(&twmodel.Tribe{}).Column("id").Where("exists = false and NOW() - deleted_at > '1 days'")
|
|
|
|
_, err = tx.Model(&twmodel.PlayerHistory{}).
|
|
With("players", withNonExistentPlayers).
|
|
Where("player_id IN (Select id FROM players) OR player_history.create_date < ?", time.Now().Add(-1*day*180)).
|
|
Delete()
|
|
if err != nil {
|
|
return errors.Wrap(err, "couldn't delete the old player history records")
|
|
}
|
|
|
|
_, err = tx.Model(&twmodel.TribeHistory{}).
|
|
With("tribes", withNonExistentTribes).
|
|
Where("tribe_id IN (Select id FROM tribes) OR tribe_history.create_date < ?", time.Now().Add(-1*day*180)).
|
|
Delete()
|
|
if err != nil {
|
|
return errors.Wrap(err, "couldn't delete the old tribe history records")
|
|
}
|
|
|
|
_, err = tx.Model(&twmodel.DailyPlayerStats{}).
|
|
With("players", withNonExistentPlayers).
|
|
Where("player_id IN (Select id FROM players) OR daily_player_stats.create_date < ?", time.Now().Add(-1*day*180)).
|
|
Delete()
|
|
if err != nil {
|
|
return errors.Wrap(err, "couldn't delete the old player stats records")
|
|
}
|
|
|
|
_, err = tx.Model(&twmodel.DailyTribeStats{}).
|
|
With("tribes", withNonExistentTribes).
|
|
Where("tribe_id IN (Select id FROM tribes) OR daily_tribe_stats.create_date < ?", time.Now().Add(-1*day*180)).
|
|
Delete()
|
|
if err != nil {
|
|
return errors.Wrap(err, "couldn't delete the old tribe stats records")
|
|
}
|
|
|
|
return tx.Commit()
|
|
}
|