4 Commits

Author SHA1 Message Date
max
53a780343f Fix scheduler by adding a wait group 2023-04-06 09:55:56 -05:00
max
8e4c5e3268 Fix wrong query for clearing 6-hour old sessions 2023-04-06 09:35:53 -05:00
max
f18f512fea Properly set the name of the checkbox for parsing 2023-04-06 09:31:12 -05:00
max
58328fe505 Fix some SQL errors 2023-04-06 09:30:53 -05:00
3 changed files with 15 additions and 9 deletions

View File

@ -1,6 +1,9 @@
package app package app
import "time" import (
"sync"
"time"
)
type Scheduled struct { type Scheduled struct {
EveryReboot []func(app *App) EveryReboot []func(app *App)
@ -35,11 +38,14 @@ func RunScheduledTasks(app *App, poolSize int, stop <-chan struct{}) {
} }
// Set up task runners // Set up task runners
var wg sync.WaitGroup
runners := make([]chan bool, len(tasks)) runners := make([]chan bool, len(tasks))
for i, task := range tasks { for i, task := range tasks {
runner := make(chan bool, poolSize) runner := make(chan bool, poolSize)
runners[i] = runner runners[i] = runner
wg.Add(1)
go func(task Task, runner chan bool) { go func(task Task, runner chan bool) {
defer wg.Done()
ticker := time.NewTicker(task.Interval) ticker := time.NewTicker(task.Interval)
defer ticker.Stop() defer ticker.Stop()
for { for {
@ -59,11 +65,11 @@ func RunScheduledTasks(app *App, poolSize int, stop <-chan struct{}) {
}(task, runner) }(task, runner)
} }
// Wait for termination // Wait for all goroutines to finish
wg.Wait()
// Close channels
for _, runner := range runners { for _, runner := range runners {
for i := 0; i < cap(runner); i++ {
runner <- false
}
close(runner) close(runner)
} }
} }

View File

@ -17,14 +17,14 @@ type Session struct {
CreatedAt time.Time CreatedAt time.Time
} }
const sessionColumnsNoId = "\"UserId\", \"AuthToken\", \"CreatedAt\"" const sessionColumnsNoId = "\"UserId\", \"AuthToken\",\"RememberMe\", \"CreatedAt\""
const sessionColumns = "\"Id\", " + sessionColumnsNoId const sessionColumns = "\"Id\", " + sessionColumnsNoId
const sessionTable = "public.\"Session\"" const sessionTable = "public.\"Session\""
const ( const (
selectSessionByAuthToken = "SELECT " + sessionColumns + " FROM " + sessionTable + " WHERE \"AuthToken\" = $1" selectSessionByAuthToken = "SELECT " + sessionColumns + " FROM " + sessionTable + " WHERE \"AuthToken\" = $1"
selectAuthTokenIfExists = "SELECT EXISTS(SELECT 1 FROM " + sessionTable + " WHERE \"AuthToken\" = $1)" selectAuthTokenIfExists = "SELECT EXISTS(SELECT 1 FROM " + sessionTable + " WHERE \"AuthToken\" = $1)"
insertSession = "INSERT INTO " + sessionTable + " (" + sessionColumnsNoId + ") VALUES ($1, $2, $3) RETURNING \"Id\"" insertSession = "INSERT INTO " + sessionTable + " (" + sessionColumnsNoId + ") VALUES ($1, $2, $3, $4) RETURNING \"Id\""
deleteSessionByAuthToken = "DELETE FROM " + sessionTable + " WHERE \"AuthToken\" = $1" deleteSessionByAuthToken = "DELETE FROM " + sessionTable + " WHERE \"AuthToken\" = $1"
deleteSessionsOlderThan30Days = "DELETE FROM " + sessionTable + " WHERE \"CreatedAt\" < NOW() - INTERVAL '30 days'" deleteSessionsOlderThan30Days = "DELETE FROM " + sessionTable + " WHERE \"CreatedAt\" < NOW() - INTERVAL '30 days'"
deleteSessionsOlderThan6Hours = "DELETE FROM " + sessionTable + " WHERE \"CreatedAt\" < NOW() - INTERVAL '6 hours' AND \"RememberMe\" = false" deleteSessionsOlderThan6Hours = "DELETE FROM " + sessionTable + " WHERE \"CreatedAt\" < NOW() - INTERVAL '6 hours' AND \"RememberMe\" = false"
@ -139,7 +139,7 @@ func ScheduledSessionCleanup(app *app.App) {
} }
// Delete sessions older than 6 hours // Delete sessions older than 6 hours
_, err = app.Db.Exec(deleteSessionsOlderThan30Days) _, err = app.Db.Exec(deleteSessionsOlderThan6Hours)
if err != nil { if err != nil {
log.Println("Error deleting 6 hour expired sessions from database") log.Println("Error deleting 6 hour expired sessions from database")
log.Println(err) log.Println(err)

View File

@ -11,7 +11,7 @@
<label for="password">Password:</label><br> <label for="password">Password:</label><br>
<input id="password" name="password" type="password"><br><br> <input id="password" name="password" type="password"><br><br>
<label for="remember">Remember Me:</label> <label for="remember">Remember Me:</label>
<input id="remember" type="checkbox" value="remember"><br><br> <input id="remember" type="checkbox" name="remember"><br><br>
<input type="submit" value="Submit"> <input type="submit" value="Submit">
</form> </form>
</div> </div>