diff --git a/config/config.go b/config/config.go index 814fb74..b0f10c1 100755 --- a/config/config.go +++ b/config/config.go @@ -5,6 +5,7 @@ import ( "local/args" "os" "strings" + "time" ) var ( @@ -15,6 +16,7 @@ var ( StorePass string Root string OAuth string + Loop time.Duration ) func init() { @@ -34,6 +36,7 @@ func Refresh() { as.Append(args.STRING, "storepass", "pass of store", "") as.Append(args.STRING, "oauth", "url for boauthz", "") as.Append(args.STRING, "root", "root of static files", "./public") + as.Append(args.DURATION, "loop", "loop duration for refreshing completed tasks", time.Minute) if err := as.Parse(); err != nil { panic(err) } @@ -44,5 +47,6 @@ func Refresh() { StoreUser = as.Get("storeuser").GetString() StorePass = as.Get("storepass").GetString() Root = as.Get("root").GetString() + Loop = as.Get("loop").GetDuration() OAuth = as.Get("oauth").GetString() } diff --git a/main.go b/main.go index 9eb6309..f086575 100755 --- a/main.go +++ b/main.go @@ -12,6 +12,7 @@ func main() { if err := s.Routes(); err != nil { panic(err) } + go s.Async() log.Println("listening on", config.Port) if err := http.ListenAndServe(config.Port, s); err != nil { panic(err) diff --git a/server/ajax/ajax.go b/server/ajax/ajax.go index ecdbb7f..fb0cd0f 100755 --- a/server/ajax/ajax.go +++ b/server/ajax/ajax.go @@ -3,8 +3,11 @@ package ajax import ( "local/storage" "local/todo-server/config" + "local/todo-server/server/ajax/task" + "log" "net/http" "net/url" + "time" ) type Ajax struct { @@ -82,3 +85,39 @@ func has(params url.Values, k string) bool { _, ok := params[k] return ok } + +func (a *Ajax) Async() { + c := time.NewTicker(config.Loop) + for range c.C { + log.Println("loop tasks") + if err := a.loopTasks(); err != nil { + log.Println("failed to loop tasks", err) + } + } +} + +func (a *Ajax) loopTasks() error { + lists, err := a.storageListLists() + if err != nil { + return err + } + for _, list := range lists { + tasks, err := a.storageListTasks(list.UUID, func(t *task.Task) bool { + return t.Complete + }) + if err != nil { + return err + } + for _, task := range tasks { + if !task.Complete || task.Loop == 0 || time.Since(task.Completed) < task.Loop { + continue + } + task.Complete = false + task.Completed = time.Time{} + if err := a.storageSetTask(list.UUID, task); err != nil { + return err + } + } + } + return nil +}