Skip to content
This repository has been archived by the owner on Feb 2, 2019. It is now read-only.

Commit

Permalink
Clean-up session table every 24-hours
Browse files Browse the repository at this point in the history
all sessions older then 2 days will be deleted
  • Loading branch information
Lukas Matt committed Feb 15, 2018
1 parent c595cea commit d14d3e2
Show file tree
Hide file tree
Showing 5 changed files with 183 additions and 2 deletions.
8 changes: 8 additions & 0 deletions app/init.go
Expand Up @@ -24,10 +24,13 @@ import (
"gopkg.in/ganggo/ganggo.v0/app/helpers"
"gopkg.in/ganggo/ganggo.v0/app/models"
"gopkg.in/ganggo/ganggo.v0/app/views"
"gopkg.in/ganggo/ganggo.v0/app/jobs"
run "github.com/revel/modules/jobs/app/jobs"
federation "gopkg.in/ganggo/federation.v0"
"net/http"
"strings"
"fmt"
"time"
)

func InitDB() {
Expand Down Expand Up @@ -107,6 +110,11 @@ func init() {
})
})

// register jobs running on an interval
revel.OnAppStart(func() {
run.Every(24*time.Hour, jobs.Session{})
})

// append custom template functions to revel
for key, val := range views.TemplateFuncs {
revel.TemplateFuncs[key] = val
Expand Down
32 changes: 32 additions & 0 deletions app/jobs/sessions.go → app/jobs/session.go
Expand Up @@ -16,3 +16,35 @@ package jobs
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//

import (
"time"
"github.com/revel/revel"
"gopkg.in/ganggo/ganggo.v0/app/models"
)

type Session struct {}

// Run will clean-up all sessions older then two days
func (s Session) Run() {
// from; 1970-01-01 00:00:00 +0000 UTC
from, err := time.Parse("2006", "1970")
if err != nil {
revel.AppLog.Error(err.Error())
return
}
// to; now() - two day
to := time.Now().AddDate(0, 0, -2)

var sessions models.Sessions
err = sessions.FindByTimeRange(from, to)
if err != nil {
revel.AppLog.Error(err.Error())
return
}
err = sessions.Delete()
if err != nil {
revel.AppLog.Error(err.Error())
return
}
}
11 changes: 11 additions & 0 deletions app/models/pods.go
Expand Up @@ -27,10 +27,21 @@ type Pod struct {
// size should be max 191 with mysql innodb
// cause asumming we use utf8mb 4*191 = 764 < 767
Host string `gorm:"size:191" json:"host"`
Helo bool `gorm:"default:false"`
}

type Pods []Pod

func (pod *Pod) Save() error { BACKEND_ONLY()
db, err := OpenDatabase()
if err != nil {
return err
}
defer db.Close()

return db.Save(pod).Error
}

func (pod *Pod) CreateOrFindHost() (err error) { BACKEND_ONLY()
db, err := OpenDatabase()
if err != nil {
Expand Down
38 changes: 36 additions & 2 deletions app/models/sessions.go
Expand Up @@ -23,9 +23,7 @@ import (
)

type Session struct {
ID uint `gorm:"primary_key"`
CreatedAt time.Time
UpdatedAt time.Time

// size should be max 191 with mysql innodb
// cause asumming we use utf8mb 4*191 = 764 < 767
Expand All @@ -34,10 +32,46 @@ type Session struct {
User User
}

type Sessions []Session

func (s *Session) AfterFind(db *gorm.DB) error {
if structLoaded(s.User.CreatedAt) {
return nil
}

return db.Model(s).Related(&s.User).Error
}

func (s *Sessions) FindByTimeRange(from, to time.Time) error {
db, err := OpenDatabase()
if err != nil {
return err
}
defer db.Close()

return db.Where("created_at between ? and ?", from, to).Find(s).Error
}

func (s *Sessions) Delete() error {
for _, session := range *s {
err := session.Delete()
if err != nil {
return err
}
}
return nil
}

func (s *Session) Delete() error {
db, err := OpenDatabase()
if err != nil {
return err
}
defer db.Close()

if s.Token == "" {
panic("Cannot delete empty session struct!")
}

return db.Where("token = ?", s.Token).Delete(s).Error
}
96 changes: 96 additions & 0 deletions tests/jobstest.go
@@ -0,0 +1,96 @@
package tests
//
// GangGo Application Server
// Copyright (C) 2017 Lukas Matt <lukas@zauberstuhl.de>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//

import (
"gopkg.in/ganggo/ganggo.v0/app/jobs"
"gopkg.in/ganggo/ganggo.v0/app/models"
"gopkg.in/ganggo/gorm.v2"
"time"
)

type JobsTest struct {
FederationSuite
}

var tests = []struct {
Token string
CreatedAt time.Time
ExpectedErr error
}{
{
Token: "4321no1",
CreatedAt: time.Now().AddDate(0, 0, -3),
ExpectedErr: gorm.ErrRecordNotFound,
},
{
Token: "4321no2",
CreatedAt: time.Now().AddDate(0, 0, -1),
ExpectedErr: nil,
},
{
Token: "4321no3",
CreatedAt: time.Now(),
ExpectedErr: nil,
},
}

func (t *JobsTest) Before() {
db, err := models.OpenDatabase()
t.AssertEqual(nil, err)
defer db.Close()

// create user
t.AssertEqual(nil, t.SetupUserRelations())

err = db.Delete(&models.Session{}).Error
t.Assertf(err == nil, "session deletion failed: %+v", err)
}

func (t *JobsTest) TestSession() {
db, err := models.OpenDatabase()
t.AssertEqual(nil, err)
defer db.Close()

for i, test := range tests {
err = db.Create(&models.Session{
CreatedAt: test.CreatedAt,
Token: test.Token,
UserID: 1, // from t.SetupUserRelations
}).Error
t.Assertf(err == nil, "#%d. session creation failed: %+v", i, err)
}

sessionJob := jobs.Session{}
sessionJob.Run()

for i, test := range tests {
err = db.Where("token = ?", test.Token).First(&models.Session{}).Error
t.Assertf(err == test.ExpectedErr,
"#%d: expected '%+v', got '%+v'", i, test.ExpectedErr, err)
}
}

func (t *JobsTest) After() {
db, err := models.OpenDatabase()
t.AssertEqual(nil, err)
defer db.Close()

err = db.Delete(&models.Session{}).Error
t.Assertf(err == nil, "session deletion failed: %+v", err)
}

0 comments on commit d14d3e2

Please sign in to comment.